快捷搜索:  汽车  科技

jvm 垃圾回收的工作原理,JVM中常用GC收集器及运行原理

jvm 垃圾回收的工作原理,JVM中常用GC收集器及运行原理这是啥意思呢?如下面代码:所谓的"初始标记",他是说标记出来所有GC Roots直接引用的对象。通过-XX: UseParNewGC配置,新生代并行老年代串行,多线程,需要多核支持,-XX:ParallelGCThreads限制线程数量。老年代收集器,-XX: UseConcMarkSweepGC设置使用CMS收集器,串行和并行会Stop the World停止一切工作线程,然后慢慢的去执行"标记-清理"算法,会导致系统卡死时间过长,很多响应无法处理。所以CMS垃圾回收器采取的是垃圾回收线程和系统工作线程尽量同时执行的模式来处理的。主要分为:初始标记、并发标记、重新标记、并发清理。1、初始标记

上节讲解:JVM中老年代空间分配担保规则及几个触发老年代FULL GC的时机?

本节讲解:GC收集器及运行原理

GC收集器主要有:串行收集器、并行收集器、重点讲解CMS收集器和G1收集器。

串行收集器

最古老、最稳定、效率最高、可能会产生较长的停顿。通过-XX: UseSerialGC配置,新生代、老年代使用串行回收,新生代复制算法老年代标记-压缩。

jvm 垃圾回收的工作原理,JVM中常用GC收集器及运行原理(1)

并行收集器

通过-XX: UseParNewGC配置,新生代并行老年代串行,多线程,需要多核支持,-XX:ParallelGCThreads限制线程数量。

jvm 垃圾回收的工作原理,JVM中常用GC收集器及运行原理(2)

CMS收集器

老年代收集器,-XX: UseConcMarkSweepGC设置使用CMS收集器,串行和并行会Stop the World停止一切工作线程,然后慢慢的去执行"标记-清理"算法,会导致系统卡死时间过长,很多响应无法处理。所以CMS垃圾回收器采取的是垃圾回收线程和系统工作线程尽量同时执行的模式来处理的。主要分为:初始标记、并发标记、重新标记、并发清理。

jvm 垃圾回收的工作原理,JVM中常用GC收集器及运行原理(3)

1、初始标记

所谓的"初始标记",他是说标记出来所有GC Roots直接引用的对象。

这是啥意思呢?如下面代码:

jvm 垃圾回收的工作原理,JVM中常用GC收集器及运行原理(4)

在初始标记阶段,仅仅会通过"b"这个类的静态变量代表的GC Roots,去标记出来他直接引用的B对象,这就是初始标记的过程。他不会去管C这种对象,因为C对象是被B类的"c"实例变量引用的。方法的局部变量和类的静态变量是GC Roots。但是类的实例变量不是GC Roots。

所以第一个阶段,初始标记,虽然说要造成"Stop the World"暂停一切工作线程,但是其实影响不大,因为他的速度很快,仅仅标记GC Roots直接引用的那些对象罢了。

2、并发标记

这个阶段会让系统线程可以随意创建各种新对象,继续运行,在运行期间可能会创建新的存活对象,也可能会让部分存活对象失去引用,变成垃圾对象。在这个过程中,垃圾回收线程,会尽可能的对已有的对象进行GC Roots追踪。

所谓进行GC Roots追踪,意思就是对类似"C"之类的全部老年代里的对象,他会去看他被谁引用了,比如这里是被"B"对象的实例变量引用了,接着会看,"B"对象被谁引用了?会发现被"A"类的静态变量引用了。

那么此时可以认定"C"对象是被GC Roots间接引用的,所以此时就不需要回收他。但是这个过程中,在进行并发标记的时候,系统程序会不停地工作,他可能会各种创建出来新的对象,部分对象可能成为垃圾。

jvm 垃圾回收的工作原理,JVM中常用GC收集器及运行原理(5)

这个阶段就是对老年代所有对象进行GC Roots追踪,其实是最耗时的。他需要追踪所有对象是否从根源上被GC Roots引用了,但是这个最耗时的阶段,是跟系统程序并发运行的,所以其实这个阶段不会对系统运行造成影响的。但是会对性能有所影响,毕竟占用了CPU的线程。

3、重新标记

因为第二阶段里,你一边标记存活对象和垃圾对象,一边系统在不停运行创建新对象,让老对象变成垃圾,所以第二阶段结束之后,绝对会有很多存活对象和垃圾对象,是之前第二阶段没标记出来的,如下图:

jvm 垃圾回收的工作原理,JVM中常用GC收集器及运行原理(6)

所以此时进入第三阶段,要继续让系统程序停下来,再次进入"Stop the World"阶段。然后重新标记下在第二阶段里新创建的一些对象,还有一些已有对象可能失去引用变成垃圾的情况。

这个重新标记的阶段,是速度很快的,他其实就是对在第二阶段中被系统程序运行变动过的少数对象进行标记,所以运行速度很快。

老年代扫描的时候要确认老年代里哪些对象是存活的,这个时候必然会扫描到年轻代,因为有些年轻代的对象可能引用了老年代的对象,所以提前做young gc可以把年轻代里一些对象回收掉,减少了扫描的时间,可以提升性能。

4、并发清理

进入第四阶段重新恢复系统程序的运行,然后他来清理掉之前标记为垃圾的对象即可。

这个阶段其实是很耗时的,因为需要进行对象的清理,如果对象多,需要遍历去清理,但是他也是跟系统程序并发运行的,所以其实也不影响系统程序的执行,如下图。

jvm 垃圾回收的工作原理,JVM中常用GC收集器及运行原理(7)

G1收集器

内容较长,细节下回讲解。

下节讲解:对CMS的垃圾回收机制进行性能分析、CMS的特点进行讲解。

猜您喜欢: