Java 8环境下使用G1GC内存占用大幅升高相关问题咨询
问题答复
内存占用差异大是否正常?
这是Java 8版本G1 GC的默认行为,属于正常情况,核心原因有两个:
- Parallel GC默认的内存回收逻辑更激进,GC完成后会主动将大量空闲内存归还操作系统,所以你观测到的500MB是应用实际的内存使用量。
- Java 8版本的G1 GC内存归还逻辑非常保守:默认仅在发生Full GC时才会将空闲内存返还给系统,而G1的设计目标就是尽量避免触发Full GC;同时默认
-XX:MaxHeapFreeRatio为70,会保留大量空闲堆内存不释放。如果你的物理内存是12GB,JDK默认最大堆为物理内存的1/4也就是3GB,应用启动过程中如果内存峰值触碰到这个阈值,G1就会一直保留这部分内存不释放,就会出现你观测到的3GB占用。
使用G1 GC是否必须配置额外内存参数?
Java 8版本下强烈建议配置额外内存参数,否则很容易出现内存占用过高的问题,推荐配置参考:
- 首先根据业务实际需要固定堆的上下限,避免内存无限制扩张,比如
-Xms512m -Xmx1g(可根据你的实际使用量调整数值) - 调低空闲堆保留比例,让G1更积极的归还内存:
-XX:MinHeapFreeRatio=10 -XX:MaxHeapFreeRatio=20 - 如果使用的是Java 8u20及以上版本,还可以添加
-XX:+UseAdaptiveSizePolicyWithSystemGC优化自适应内存调整逻辑
额外注意:Java 8的G1 GC还存在不少已知的内存泄漏、性能缺陷,条件允许的话建议升级到JDK 11及以上版本,新版G1 GC做了大量优化,默认就支持周期性归还空闲内存给操作系统,内存占用会低很多。
内容的提问来源于stack exchange,提问作者Hanju Kim
相关产品推荐
相关产品推荐

