使用 VisualVM 并检查 Tomcat 8.5 catalina.out日志我每次都看到 almost (11次中有7次左右)当 full GC 发生日志时显示 OutOfMemory (在同一分钟) .
Tomcat parameters 与内存管理有关: -Xms3G -Xmx=6G -XX:+UseG1GC -XX:+UseStringDeduplication -XX:MaxHeapFreeRatio=100
起初我以为是因为默认的 -XX:MaxHeapFreeRatio 值是 70 ,因为我看到了最大值 . 堆大小(当然使用的堆)会在 full GC 期间显着下降 - 到~10-20% . 但是添加 XX:MaxHeapFreeRatio=100 并没有解决它 .
虽然这是 memory usage graph , different 设置为 JVM parameters (无法获得具有旧JVM参数的ATM),但在完全GC内存使用 grows rapidly 之后,它的方式类似,相同的最大值 . 堆大小和最大堆大小不会下降 .
Any ideas why this could happen?
Update: 我忘了提到以前 full GC 和 OutOfMemory 会在堆大小 was not even full - 〜5GB时发生 . 当时没有一次我看到堆达到6GB .
3 回答
显然,创建的某些对象无法正确收集垃圾 . 您可以尝试使用VisualVM的采样器功能并跟踪创建的实例数 .
尝试使用MapDB缓存IO操作 .
您可以这样做将其缓存到基于磁盘的文件数据库:
然后做:
如果为大多数参数设置默认值,G1GC运行良好 . 仅设置关键参数
并将其他所有内容留给Java .
您可以在以下帖子中找到更多详细信息:
Java 7 (JDK 7) garbage collection and documentation on G1
Why do I get OutOfMemory when 20% of the heap is still free?
使用一些内存分析器工具,如mat来了解根本原因 .
在你的情况下,很明显oldgen正在成长 . 检查可能的内存泄漏 . 如果没有发现内存泄漏,请进一步增加堆内存 .