背景:
1、一台服务器总内存46g,某一个在线定时任务是每天凌晨1点执行,大约耗时2个小时,高峰期会占用15g左右的内存,其他时间基本不消耗内存,但是由于jvm使用了默认的垃圾回收器(Parallel Scavenge + Parallel Old),导致即使堆内存使用率很低,该服务依然会占用15g的内存,且不会释放给os
2、同一台服务器上,白天可能会执行其他任务
3、所以需要实现:在该任务空闲后,释放出不需要的内存给os
实现:
经过查阅相关资料后发现在java8的基础上配合以下几个参数可以实现空闲时内存释放;空闲时由原来的占用15g内存变为现在的占用2g内存,符合预期效果
1、在合适的时机主动释放内存
System.gc()
2、在启动参数上加上以下几个配置,指定堆最大和最小内存,同时指定使用G1垃圾回收器
-Xms2G -Xmx20G -XX:+UseG1GC
如果需要还可以加上
1、堆最大空闲率,超过这个值,jvm会释放内存给os
-XX:MaxHeapFreeRatio
2、堆最小空闲率,低于这个值,jvm会扩展内存
-XX:MinHeapFreeRatio
参考: