【问题标题】:Java process halts before GCJava 进程在 GC 之前停止
【发布时间】:2014-08-27 04:21:43
【问题描述】:

我们正在生产环境中运行 HBase HMaster 进程。通常日志文件中有很多日志。但是对于特定的周期,没有任何记录,我们认为 gc 发生了。正如预期的那样,gc 发生在那个时候,但不是整个时期。

例如,gc 从 32:24 开始,持续 25.53 秒。但我从 32:06 到 32:49 没有收到任何日志。我想知道gc之前发生了什么。它似乎也“停止了世界”。

如果它的进程正在运行,我确信 HMaster 会写日志。与CPU时间有关吗?怎么解决?

【问题讨论】:

  • @shekharsuman:在哪里提到 system.gc?
  • @Nazgul-对不起,只是garbage collector
  • @tobe:这是一个一致的模式吗?每次您看到日志停止时,您会在 GC 日志中找到适当的暂停,然后出现几秒钟的停电?我不会担心基于日志写入活动的几秒钟的停电。更好的办法是监控实例并查看是否有线程阻塞。
  • @Nazgul 是的,它是一致的。 HMaster 会在每次 gc 后打印出 gc 时间,并且与 gc log 中的一致。 gc日志是jvm生成的,所以我觉得靠谱。
  • 你的堆有多大?有时会在收集后调整世代的大小,如果您没有设置固定的世代大小,调整大小可能需要一些时间才能完成。

标签: java process jvm hbase cpu


【解决方案1】:

试试这个:

-server -d64 -Xms10240m -Xmx10240m -XX:PermSize=512M -XX:MaxPermSize=512M -XX:NewSize=5120m -XX:MaxNewSize=5120m -XX:-UseAdaptiveSizePolicy -XX:+UseParNewGC -XX:SurvivorRatio=20 -XX:+DisableExplicitGC -XX:+UseConcMarkSweepGC -XX:+OptimizeStringConcat -XX:ParallelGCThreads=8 -XX:ConcGCThreads=8 -XX:+CMSParallelRemarkEnabled -XX:CMSInitiatingOccupancyFraction=80 -XX:+ParallelRefProcEnabled -XX:+CMSScavengeBeforeRemark -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath="${bundled.server.access.log}" -Xloggc:"${bundled.server.access.log}"/java_gc.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintTenuringDistribution

此设置使您的伊甸园空间 + 幸存者 = 5GB 和老一代 = 5GB。 删除 MaxDirectMemorySize 参数,因为 JVM 会自动缩放直接内存缓冲区

【讨论】:

  • MaxDirectMemorySize 对 HBase 很有用,因为我们使用 BucketCache 来分配缓存数据或索引。无论如何,谢谢你的回复。这是偶然的,之后我无法复制。可能与 gc 无关。
猜你喜欢
  • 1970-01-01
  • 2020-12-27
  • 1970-01-01
  • 1970-01-01
  • 2013-07-07
  • 1970-01-01
  • 1970-01-01
  • 2018-01-27
  • 2023-03-22
相关资源
最近更新 更多