我使用轮循算法在负载均衡器后面有2个Web服务器(4核/ 16 GB RAM / Cent OS 7)。
应用程序是使用Java using Apache/Tomcat
构建的。
服务器,Apache,Tomcat和Webapp具有相同的配置,heap size : -Xms12840m -Xmx12840m
问题是第一台服务器的内存不足。内核由于内存不足而杀死了Java进程。而第二台服务器更稳定。
我试图使用VisualVM和带有jstat的GC来监视和分析堆转储内存。
关于堆转储内存,我没有发现任何内存泄漏,这并不意味着没有。
但是使用VisualJM / Monitor
可以观察到,当旧版本已满时,在第二台服务器上完成了Full GC。在第一台服务器上不是这种情况。实际上,尽管负载均衡器使用了轮询算法,但似乎第一台服务器总是比第二台服务器更忙。
因此,在第一台服务器上,JVM似乎没有时间在内存不足之前进行完整的GC操作。
默认情况下,年轻/老一代之间的比例为1:2
如果伊甸园已满,则年轻一代的次要GC就可以了。但是当老一代的增长率接近100%时,就不会出现Full GC。
那么,如何优化GC以避免内存不足? 为什么在服务器1上未完成完整GC? 是因为服务器上的请求高峰,然后JVM无法及时进行完整的GC?
感谢您的帮助。