JVM堆内存释放不及时问题

线上问题:
1.线上每天定时读取文件(大文件)成MAP,并加载入库,当执行完最后一批 批量提交sql 时,JVM堆内存没释放;
2.因为加了以下堆内存检测,所以,下一次处理文件时,发起不了新的线程处理新任务;
public boolean exceedSize() {
    MemoryMXBean memoryBean = ManagementFactory.getMemoryMXBean();
    LOGGER.info("堆内存信息: " + memoryBean.getHeapMemoryUsage());
    return memoryBean.getHeapMemoryUsage().getUsed() / 1000 > heapSizeThreshold; // heapSizeThreshold = 3G
}
3.JVM参数配置:-Xms6144M -Xmx6144M -XX:+UseG1GC -XX:ParallelGCThreads=5 -XX:G1HeapRegionSize=32m -XX:G1ReservePercent=10 -XX:MaxGCPauseMillis=800

问题认识:
1.当线程处理完,堆内存没有触发释放的条件
2.之前看过的把xmx和xms设置一致可以让JVM在启动时就直接向OS申请xmx的commited内存,

  好处是:
    1)避免JVM在运行过程中向OS申请内存
    2)延后启动后首次GC的发生时机
    3)减少启动初期的GC次数
    4)尽可能避免使用swap space
  坏处:
    堆内存释放不及时

解决方案:
第一、设置-Xms6144M -Xmx6144M参数为:-Xms1024M -Xmx6144M
第二、在发起线程前,检测堆内存时,Object obj = new Object(); // 触发垃圾回收

其他:
    上线前,应尽可能准确估计上线情况,做压力测试,使用jdk自带的监控工具多做分析;上线后,不断迭代优化;可以考虑设置MaxHeapFreeRatio/MinHeapFreeRatio参数

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值