前面说的那些垃圾回收算法,就是垃圾回收器内部的实现方式。jvm中的垃圾回收器有很多,之间的关系也复杂。我们就挑几个重要的来说。
Parallel GC
由于分代回收的思想。Parallel又细分为年轻代,老年代。年轻代就是Parallel Scavenge,老年代就是Parallel Old。
Parallel Scavenge
实现算法:由于是年轻代的gc器,实现的算法,也会是标记复制算法,这个原因就不讲为啥了。
并行:该垃圾回收器进行gc的时候是多个gc线程并行执行的。当gc时会暂停所有用户线程(STW)
特点:吞吐量优先。吞吐量=运行用户代码时间/(运行用户代码时间+垃圾收集时间)
Parallel Old
实现算法:老年代的垃圾回收算法也就是,标记整理算法了。
并行:该垃圾回收器进行gc的时候是多个gc线程并行执行的。当gc时会暂停所有用户线程(STW)(和年轻代的一样)
特点:吞吐量优先。吞吐量=运行用户代码时间/(运行用户代码时间+垃圾收集时间)
CMS(Conrrurent Mark Sweep,连续标记扫描)
实现算法:标记清除算法。作用于老年代的垃圾回收器。
并发:该垃圾回收器进行gc的时候,垃圾回收线程可以和用户线程同时执行。这里和想象中的并发可能不太一样。可能会想,并发不应该是交替执行吗,怎么是同时执行。最后会进行说明。
特点:响应速度优先。
收集步骤:
- 初始标记(这个阶段仅仅标记gcroot能直接关联的对象,并且这个阶段,是需要STW的。)
- 并发标记 (这个阶段,会深入标记关联的对象,但这个阶段不会进行STW,用户线程和垃圾线程可以同时进行)
- 重新标记 (由于在并发标记过程中,很有可能用户线程在更改对象之间的引用。这里需要进行STW然后进行重新标记)
- 并发清除 (这个阶段也不需要进行STW。垃圾回收线程和用户线程同时进行)
cms是并发垃圾回收器。存在并发漏标问题。cms这里使用的解决方案是Incremental Update
G1收集器
首先说说G1和其他垃圾回收器很不同的,分区操作。
G1垃圾回收器相对于之前的垃圾回收器有所不同。在这之前的垃圾回收器,把堆分为年轻代和老年代进行不同的gc算法。而G1垃圾回收器把堆化分为许多大小相等的区(Region)。虽然还保留新生代和老年代的概念。但无论是新生代还是老年代在物理内存上都不用是连续的。他们都是一部分(可以不连续)Region的集合。在每一个Region分区只能分配一个角色,Eden区、S区、老年代O区的其中一个,空白区域代表的是未分配的内存。最后还有个特殊的区域H**区(Humongous)**。这个区专门存放巨型对象,当一个对象超过Region区的50%,就会被放入H区。为什么会,出个H区呢?在以往的垃圾回收器中,都会把较大的对象直接晋升到老年代中,但该对象内存占用较大,可能会频繁触发老年代的gc。所以G1就专门划分了一个H区来存放这些大对象。
垃圾回收方法:在G1垃圾回收器中,提供了三种垃圾回收方法。Young GC,Mixed GC ,Full GC。
首先说说什么情况下会触发,哪一种GC方法。虽然没有之前老年代和年轻代那种内存有明确划分的概念。但还是有每一种区所占整个比例大小的阈值。超过了该值,就会进行对应的gc。
当最开始时,对象放在Eden区中,当eden区中内存不足时,这时会触发Yong GC,把存活对象放在S区,同时清除Eden区,然后重新分配Eden区。接下来依瓢划葫芦,同样的操作。那什么时候会进行Mixed GC呢。当老年代(O区)的内存达到总体内存的45%这个阈值,**(这里有个漏掉的点,就是当Yong GC时,对象存活的次数达到一定次数,就会被分配到老年代(O区))**首先会进行并发标记。并发标记包括些具体操作,下面再说。等并发标记完成后。然后就可以进行Mixed GC。如果当Mixed GC 后,发现,内存还是不足。这时就进行Full GC。
Young GC:
算法:标记复制算法。
并行:垃圾回收线程并行执行。此时会暂停所有用户线程(STW)
特点:吞吐量。
Mixed GC:
算法: 标记复制算法。
并发:垃圾回收线程和用户线程同时进行,不会进行STW
特点:响应速度高。
上面说到,进行Mixed GC需要先进行并发标记。接下来就粗略说说,并发标记的过程。
- 初始标记:这个标记过程只会标记和gcroot直接关联的对象,会进行STW
- 并发标记:从 GC Roots 开始,对堆中对象进行可达性分析,找出存活对象,耗时较长。当并发标记完成后,开始最终标记 ( Final Marking ) 阶段。
- 重新标记:由于在并发标记过程中,很有可能用户线程在更改对象之间的引用。这里需要进行STW然后进行重新标记
- 最后执行MIxed GC进行清理
最后 当Mixed GC 时,会有一个临界时间,这个时间就是我们所期盼的gc时间,在这个时间内,在对老年代进行垃圾回收时,首先先会对价值最高的区进行垃圾回收。价值高是什么意思呢,就是存活对象少,释放的空间大。就是价值高。不光是老年代,也会对E和S区进行GC。 当这一轮过后,如果时间还充足,还可以多进行几次Mixed GC。
Full GC
严格来说没有full gc 这个方法。当制造垃圾的速率比消除垃圾的速率快时,就会造成当mixed gc后仍然空间不足,此时会调用serialOldGC进行全堆扫描。
垃圾回收器中的并行,并发,串行。
这个垃圾回收器中的这几个概念容易和我们平时接触的有所不同,容易搞混,接下来就说说。
并行垃圾回收器:就是可以多个垃圾回收线程同时执行,并且会进行STW。这就是并行垃圾回收器。
并发垃圾回收器:就是当多个垃圾回收器线程同时执行时,不会进行STW,用户线程也在同时进行。
串行垃圾回收器:只有一个垃圾回收线程在进行gc,并且会进行STW。
本文使用 文章同步助手 同步
