2回复
4年前
JVM Full GC 频率的问题
现在遇到了这么一个问题,线上的 JVM minor GC 约 5 分钟一次,老年代比较缓慢的持续增长,需要约 50 天才能增长到 CMS 垃圾回收器的回收阈值比例(70%),也就是说在这期间一次 Full GC 也没有发生。但是由于公司内存的报警是根据物理机内存占用比例触发,目前设置的堆(只是堆,不包括 Metaspace 等)大小占物理内存的 86%,所以这就产生一个我认为比较奇怪的问题: 触发了内存报警,然而实际上一次 Full GC 都没有发生。
我目前想到的优化思路是:
- 减少进入老年代的对象的个数,即复用对象。
- 提高性能,因为目前来看 CPU 占用率实际很低,进一步提高并发处理的线程数,争取在进入老年代之前完成数据的处理,本质上和 1 的思路一样。
- 降低堆和物理内存的比例。
我有些困惑的就是:
- 我觉着单纯从 Full GC 的频率来看没有优化的必要,对不对?
- 其它的项目也有同样的问题,只不过快速的版本迭代(约 2 天发布一次)将此问题掩盖了,上面报警的项目迭代周期很长。
- Full GC 是否应该或者可以完全避免,换句话说,Full GC 没有那么可怕,只要控制在一定的频率、耗时就可以。
菜鸡一枚,没有什么经验,想问问各位大佬的看法。
4097 阅读