本文是个人内容总结,详细内容扫描二维码 1、前文回顾 务必要能够合理的分析自己系统的内存压力,然后合理的优化JVM的参数,尽可能降低JVM GC的频率,同时降低JVM GC导致的系统停顿
本文是个人内容总结,详细内容扫描二维码
1、前文回顾
务必要能够合理的分析自己系统的内存压力,然后合理的优化JVM的参数,尽可能降低JVM GC的频率,同时降低JVM GC导致的系统停顿的时间
2、G1垃圾回收器的默认内存布局
4核8G,TPS 600,内存3MB/秒,4G给堆内存,4096M/2048=每个Region2M
-Xms4096M -Xmx4096M -Xss1M -XX:PermSize=256M -XX:MaxPermSize=256M -XX:+UseG1GC -XX:G1NewSizePercent=5 -XX:G1MaxNewSizePercent=60
3、GC停顿时间如何设置?
-XX:MaxGCPauseMills 默认是200ms,先使用默认值
4、到底多长时间会触发新生代GC?
什么时候Eden区域会内存不够呢?是要到堆内存的60%才会进行新生代GC?G1不是这么玩的。
1、预估:预估新生代中内存回收需要的时间
2、对比:对比现有对象的回收时间和-XX:MaxGCPauseMills设置的停顿时间,保证在设定时间内回收最多内存。
总结:新生代回收的原则是“让充分利用设置的停顿时间来回收最多的内存”,而不是到了默认的5%就触发回收
G1到底会分配多少个Region给新生代,多久触发一次新生代gc,每次耗费多长时间,这些都是不确定的,必须通过一些工具去查看系统实际情况才知道,这个提前是无法预知的
5、新生代gc如何优化?
1、给整个JVM的堆区域足够的内存
2、合理设置“-XX:MaxGCPauseMills”参数
参数到底如何设置,需要结合后续给大家讲解的系统压测工具、gc日志、内存分析工具结合起来进行考虑,尽量让系统的gc频率别太高
??我的理解对么:使用系统的用户其实并不关心什么gc频率,但他们关心的是我使用的系统卡不卡,处理速度快不快。系统卡不卡是受-XX:MaxGCPauseMills直接影响的。系统处理速度快不快是受gc的频率影响的。“gc的频率高”翻译一下应该是“系统的吞吐量低”,gc频率高说明cpu用来处理垃圾回收的时间比例变多了,自然用来处理业务的cpu时间变少了。比如原先每秒可以取出1w条数据,现在只能取出2k条。
答:理解正确
6、mixed gc如何优化?
触发MixedGC条件 :老年代占比 > 45%
对象进入老年代条件:
1、MinorGC后S区放不下
2、年龄大
3、动态年龄判断 ,
1、3两个尤其可能让更多对象快速进入老年代
其实核心的点,还是“-XX:MaxGCPauseMills”这个参数,保证他的新生代gc别太频繁的同时,还得考虑每次gc过后的存活对象有多少,避免存活对象太多快速进入老年代,频繁触发mixed gc
7、本文总结
根据估算的内存模型,分配内存,使用默认的停顿时间。
新生代回收的原则是“让充分利用设置的停顿时间来回收最多的内存”,而不是到了默认的5%就触发回收
新生代优化:1、足够堆内存 2、合理的-XX:MaxGCPauseMills
MixedGC优化:合理的-XX:MaxGCPauseMills