架构师训练营 第 9 周作业
作业:请简述 JVM 垃圾回收原理。
答:JVM 垃圾回收原理主要分为四个方面:标记、回收、分代回收、垃圾回收器算法
标记 指的是通过可达性算法来识别垃圾对象,它从线程栈帧中的局部变量和方法区中的静态变量出发,将这些变量所引用的对象进行标记。然看这些被标记的对象还引用了哪些对象,对这些引用对象继续标记,以此类推。最后,未被标记上的对象就是垃圾对象,可以进行回收。
回收 指的是释放垃圾对象占用的空间。有三种方法:
清理 - 将垃圾对象占用的内存空间标记为空闲,再创建新对象时,将一块空闲内存中分配新对象。
压缩 - 从堆的头部开始,将存活的对象移动到连续的内存空间中,剩余的空间就是空闲空间。
复制 - 将堆空间分为两部分,只在其中一部分创建对象,当该部分用完时,将存活对象拷贝到另一部分空间中。
分代回收 将堆分为 新生代 和 老年代,新生代又分为 Eden区、From区 和 To区。新创建的对象开始都处于新生代中,当新生代满时,将存活的对象复制到 From区,等到下次新生代再次满时,新生代和 From区中的存活对象会一起被复制到 To区,以此类推。如果一个对象经过多轮的 From区 和 To区之间的复制后仍然存活,那么它会被复制到老年代。新生代的空间远小于老年大,空间小在垃圾回收时效率更高。
垃圾回收器算法 分为 串行回收器、并行回收器、并发回收器CMS 和 G1回收器
串行回收器 - 单核环境下的单线程垃圾回收策略,由于只有一个工作线程,所以在进行垃圾回收时,会暂停应用代码的执行。
并行回收器 - 在多核环境下,多个线程进行垃圾回收,提高了垃圾回收的速度,但是仍然会暂停应用代码的执行,只是被暂停的时间比单线程时候缩短而已。
并发回收器CMS (Concurrent Mark and Sweep) - 程序在执行过程中,会有线程同时进行标记,中间会有个短暂的令程序暂停执行的过程,进行重标记,清理过程也是并行的。这种算法会对 JVM 造成一定的性能影响,因为始终有线程在做标记,但是stop-the-world时间比串行和并行回收器都要短。
G1回收器 - 将堆分为一块块空间,空间的类型有 Eden、Survivor、Old 和 Humongous。这个算法结合了并发以及分代回收方法,对程序的执行影响更小。
版权声明: 本文为 InfoQ 作者【Lingjun】的原创文章。
原文链接:【http://xie.infoq.cn/article/457f0f8a64fb0a8b056c7302a】。文章转载请联系作者。
评论