【发布时间】:2020-11-07 17:00:30
【问题描述】:
我在 centos 6 上使用 G1GC 运行我的 java 应用程序,openjdk 版本为“1.8.0_232”。我看到总堆使用量逐渐增长并导致应用程序崩溃。当我正在处理大量活动对象时 转储大小仅为 1.6GB,但我使用的总堆空间为 32GB。
用于进行转储的命令:jmap -dump:live,format=b,file=/tmp/dump.hprof
在某处读到,jmap dump 命令会触发完整的 GC 并释放不可访问的堆,这就是转储大小减少的原因。我可以看到在触发转储命令后,我的总堆使用量下降了,并且开始逐渐增长。
我的 JVM 参数:-XX:-AllowUserSignalHandlers -Xmx49000m -DFCGI_PORT=6654 -XX:+UseG1GC -XX:+UseStringDeduplication -XX:InitiatingHeapOccupancyPercent=55 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/var/log/xyz -XX:+PerfDisableSharedMem -Djava.io.tmpdir=/var/XXX/temp
有没有更好的方法来高效地使用 G1 进行全 GC?
【问题讨论】:
-
抱歉,有 32GB 的堆空间?!你正在开发什么样的应用程序??
-
“导致应用程序崩溃”到底是什么意思?是否有任何堆栈跟踪或错误消息?我假设第一个具有 32GB 堆的完整 GC 将导致一个不错的 stop-the-world 事件!
-
这部分能解释清楚吗?
causing application to crash?实际发生了什么 -
我的应用程序是一个 NMS 应用程序,它支持非常大规模的无线/有线设备。应用程序停止处理来自控制器的消息。我们保存 jvm 统计信息,如果我们看到使用的堆已达到分配的最大内存。我们必须重新启动应用程序才能再次开始处理。
标签: java garbage-collection heap-memory g1gc