java - 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 吗?
谢谢你的帮助。
解决方案
推荐阅读
- linux - 从文件名中删除某些字符
- talend - Talend ETL - 在 tLoop 中运行子作业
- leaflet - 传单地理搜索 OpenStreetMapProvider 问题
- actions-on-google - Google Assistant 的银行操作是否必须使用交易 API?
- jquery - 带有隐藏表单域的多选菜单框
- java - ProcessBuilder 函数用于从 Java 调用 C# .exe 文件导致程序挂起
- azure - 无法在 PowerShell 中将密钥添加到 Azure Key Vault -“未经授权”
- java - 使 ConstraintLayout 组件在一个简单的 UI 中填充整个显示
- go - 如何完全禁用 HTTP/1.x 支持
- c# - 如何使 2D 对象面向它移动的方向,就像漂移一样