首页 > 解决方案 > Full GC 似乎没有执行(内存不足)

问题描述

我在使用循环算法的负载均衡器后面有 2 个 Web 服务器(4 核 / 16 GB RAM / Cent OS 7)。

应用程序是使用Java using Apache/Tomcat.

服务器、Apache、Tomcat 和 Webapps 具有相同的配置,heap size : -Xms12840m -Xmx12840m

问题是第一台服务器内存不足。由于内存不足,内核杀死了 java 进程。而第二台服务器更稳定。

我尝试使用 VisualVM 监控和分析堆转储内存以及使用 jstat 的 GC。

关于堆转储内存,我没有发现任何内存泄漏,这并不意味着没有。但是VisualJM / Monitor我可以观察到,当老年代已满时,在第二台服务器上完成了 Full GC。第一台服务器不是这种情况。事实上,尽管负载均衡器使用了循环算法,第一台服务器似乎总是比第二台更忙。因此,在第一台服务器上,JVM 似乎没有时间在内存不足之前进行完整的 GC。

默认情况下,新生代/老年代的比例是1:2

年轻代上的 Minor GC 是可以的,当 Eden 满时进行一次 Minor GC。但是当老年代增长接近100%时,就没有Full GC了。

那么,如何优化 GC 以避免内存不足?为什么没有在服务器 1 上完成完整的 GC?是因为服务器上的请求高峰,然后 JVM 无法及时进行完整的 GC 吗?

谢谢你的帮助。

标签: javagarbage-collectionjvmout-of-memoryjvm-hotspot

解决方案


推荐阅读