【问题标题】:G1GC causes gradual memory growth and full GC brings it downG1GC 导致内存逐渐增长,full GC 将其降低
【发布时间】: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


【解决方案1】:

这是因为呈现给您的是已提交的内存,与已使用的内存不同。

在较新的 Java 版本中,GC 算法得到了改进,以便为操作系统更频繁地释放提交的内存。

使用 Java Mission Control 更详细地查看您的内存(已提交内存与已用内存)。

我的建议是使用较新版本的 Java,如果不可能,请将 XmX 的值更改为较低的值(3Gb)。您会注意到 JVM 将始终接近定义的限制。

  1. https://openjdk.java.net/jeps/346
  2. https://openjdk.java.net/jeps/351
  3. https://blog.idrsolutions.com/2019/09/improved-garbage-collection-in-java-13/
  4. https://www.slideshare.net/jelastic/choosing-right-garbage-collector-to-increase-efficiency-of-java-memory-usage

【讨论】:

  • 已用内存也达到 32GB。请参阅 statistics_2020_07_17_08_54_03.xml:3:
  • 您能否将 XmX 配置为 4Gb 以查看内存消耗情况?
猜你喜欢
  • 2016-07-22
  • 1970-01-01
  • 1970-01-01
  • 2013-07-16
  • 1970-01-01
  • 1970-01-01
  • 2014-09-02
  • 2013-05-16
  • 2020-11-04
相关资源
最近更新 更多