我们正在生产环境中运行 HBase HMaster 进程。通常情况下,日志文件中有很多日志。但对于特定的周期,没有记录任何内容,我们认为发生了GC。正如预期的那样,gc 发生在那个时间,但不是整个期间发生的。
例如,gc 从 32:24 开始,持续 25.53 秒。但从 32:06 到 32:49 我没有收到任何日志。我想知道 gc 之前发生了什么。它似乎也“停止了世界”。
我确定 HMaster 在其进程正在运行时会写入日志。与CPU时间有关吗?我怎样才能弄清楚?
最佳答案
试试这个:
-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 自动缩放直接内存缓冲区
关于Java 进程在 GC 之前停止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25518875/