ParNew垃圾回收器(堆内存分年轻代)
2021-12-01 18:06:11 0 举报
ParNew垃圾回收器(堆内存分年轻代)
作者其他创作
大纲/内容
Eden区:8
Java堆内存-Xms-Xmx
老年代
永久代-XX:PermSize-XX:MaxPermSize
JVM
线程虚拟机栈-Xss
ParNew垃圾回收器
线程2
Serial垃圾回收器
单线程
Full GC(Major GC或Old GC)
(A)Minor GC:Serial、ParNew、Scavenge 又称新生代GC,指发生在新生代的垃圾收集动作; 因为Java对象大多是朝生夕灭,所以Minor GC非常频繁,一般回收速度也比较快;(B)Full GC:Serial Old、Parallel Old、CMS 又称Major GC或老年代GC,指发生在老年代的GC; 出现Full GC经常会伴随至少一次的Minor GC(不是绝对,Parallel Sacvenge收集器就可以选择设置Major GC策略); Major GC速度一般比Minor GC慢10倍以上; (C)整堆收集器:G1
CMS垃圾回收器
Minor GC
新生代-Xmn
垃圾回收算法(复制清除算法)
线程1
Survivor0:1from
Survivor1:1to
如果是使用ParNew + CMS 垃圾回收器的话,堆内存分年轻代和老年代是很明确的,不像G1然后说一下ParNew垃圾回收器。这个垃圾回收器是回收年轻代的,使用的是多线程回收,不像之前的Serial回收器使用单线程回收。然后ParNew使用的是复制清除算法,把年轻代分为Eden区 和两个Survivor,JVM 参数默认的占比是 8:1:1,系统运行会把对象创建到Eden区,每次YoungGC 会标记存活对象,复制到Survivor0中,再次YoungGC时,再把Eden和Survivor0存活对象复制到Survivor1中。系统运行期间会保证一直有一个Survivor是空着的,也就是可用内存是90%。Eden区的占比有时是可以调优的,如果条件有限,没有大内存的机器,然后对象创建的还特别频繁,存活的对象比较多,那就建议把Eden区比例调低一些,让Survivor大一点,宁可Young GC多一些,也不要让Survivor触发了动态年龄审核或者放不下存活对象(-XX:MaxTenuringThreshold=15或一批对象的总大小大于了这块Survivor区域的内存大小的50%或大对象-XX:PretenureSizeThreshold)。如果放不下那就把这批对象扔到老年代了,Full GC是很慢的。如果是调低Eden,YoungGC会很频繁,但是YoungGC特别快,我通过jstat 看,回收100M垃圾大概也就1ms,所以,如果内存实在不够,降低Eden去比例也不是不可以。但是如果有条件的话最好的话还是加大新生代内存,毕竟YoungGC也是要Stop the World的。然后继续说ParNew ,它非常适合回收年轻代内存。因为年轻代一般存活的对象是很少的,大多数都是刚创建出1毫秒就变成了垃圾,所以把极少数存活的对象标记出来,复制成本还是很低的,如果像老年代那样采用标记清除算法,那就太慢了
0 条评论
下一页