分区GC算法
Hotspot提供三类分区垃圾收集算法
一.Serial Collector
场景:
是JVM在client模式下默认的GC方式,可以通过JVM配置参数-XX:+UseSerialGC来指定GC使用该收集算法。
内存分配规则:
指定所有对象都在Young区的Eden中创建,但是如果创建的对象超过Eden区的总大小,或者超过了PretenureSizeThreshold配置参数配置的大小,就只能在Old区分配了。
何时触发GC:
当Eden空间不足时触发MinorGc,触发MinorGC之前先检查之前每次MinorGC时晋升到Old区的平均对象大小是否大于Old区的剩余空间,如果大于,则直接触发FullGC,如果小于则看HandlePromotonFailure参数(-XX:-HandlePromotionFailure)的值。如果为true,则仅触发MinorGC,否则再触发一次FullGC。
GC过程:
当MinorGC时,除了将Eden区的非活动对象回收以外,还会把一些老对象也复制到Old区中。老对象的定义是通过配置参数MaxTenuringThreshold来控制的,如果-XX:MaxTenuringThreshold=10,则如果这个对象已经被MinorGC回收过10次后仍然存活,
那么这个对象在这次MinorGC后直接放入Old区。还有一种情况,当这次MinorGC时,Survivor区中的ToSpace放不下这些对象时,
这些对象也将直接放入Old区。如果Old区或者Perm区空间不足,将会触发FullGC,FullGC会检查Heap堆中的所有对象,清除所有
垃圾对象,如果是Perm区,会清除已经被卸载的classloader中加载的类的信息。
执行方式:串行。
二.Parallel Collector
ParNewGC:
他的对象分配和回收策略与Serial Collector类似,只是回收的线程不是单线程的,而是多线程并行回收。
ParallelGC:
场景:
Server下默认的GC方式,可以通过-XX:+UseParallelGC参数来强制指定。
内存分配规则:可以通过-Xmn来控制Young区的大小,如-Xman 10m,即设置Young区的大小为10MB。在Young区内的Eden、FromSpace和To Space的大小控制可以通过SurvivorRatio参数来完成,如设置成-XX:SurvivorRatio=8,表示Eden区与From Space的大小为8:1。
何时触发GC:
当在Eden区中申请内存空间时,如果Eden区不够,那么看当前申请的空间是否大于等于Eden的一半,如果大于则这次申请的空间直接在Old中分配,如果小于则触发MinorGC。在触发GC之前首先会检查每次晋升到Old区的平均大小是否大于Old区的剩余空间,如果大于则再触发FullGC。在这次触发GC后仍然会按照这个规则重新检查一遍,如果满足上面这个规则,FullGC会执行两次。当Old或者Perm区空间不足时会触发FullGC,如果配置了参数ScavengeBeforeFullGC,在FullGC之前会先触发MinorGC。
GC过程:
在Young区的对象经过多次GC后晋升到Old区的规则由以下参数控制
1.AlwaysTenure:默认为false,表示只要MinorGC时存活就晋升到Old
2.NeverTenure:默认为false,表示永远晋升到Old区。
执行方式:多线程并行。
ParallelOldGC:
可以通过-XX:+UseParallelOldGC参数来强制指定,它与ParallelGC的不同之处在于FullGC上,前者FullGC进行的动作为清空整个
Heap堆中的垃圾对象,清除Perm区中已经被卸载的类信息,并进行压缩。而后者是清除Heap堆中的部分垃圾对象,并进行部分空
间的压缩。它也是多线程并行。
三.CMS Collector
场景:
可以通过-XX:+UseConcMarkSweepGC来指定,并发的线程数默认为4(并行GC线程数+3),也可以通过ParallelCMSThreads来指定。
既不是MinorGC,也不是FullGC,是基于这两种GC之间的一种GC。在这个模式下的MinorGC触发规则和回收规则与SerialCollector
基本一致,不同之处只是GC回收的线程是多线程而已。
何时触发GC:
检查Old区或者Perm区的使用率,当达到一定比例时就会触发CMSGC,触发时会回收Old区中的内存空间。这个比例可以通过CMSInitiatingOccupancyFraction参数来指定,默认是92%。
触发FullGC是在这两种情况下发生的:
1.Eden分配失败,MinorGC后分配到ToSpace,ToSpace不够再分配到Old区,Old区不够则触发FullGC
2.当CMSGC正在进行时向Old申请内存失败则会直接触发FullGC
GC过程:
触发CMSGC时回收的只是Old区或者Perm区的垃圾对象,在回收时和前面所说的MinorGC和FullGC基本没有关系。
执行方式:
多线程并行

浙公网安备 33010602011771号