写点什么

架构师训练营 - 第 9 周课后作业 - JVM 垃圾回收原理

用户头像
树森
关注
发布于: 2020 年 11 月 22 日

一、垃圾辨别方法:引用计数法与可达性分析法

1、引用计数法:为每个对象添加一个引用计数器,用来统计指向该对象的引用个数。一旦某个对象的引用计数器为 0,则说明该对象已经死亡,便可以被回收了。缺点是需要额外的空间来存储计数器和无法处理循环引用对象。

2、可达性分析:目前 Java 虚拟机的主流垃圾回收器采取的算法。将一系列 GC Roots 作为初始的存活对象合集(live set),然后从该合集出发,探索所有能够被该集合引用到的对象,并将其加入到该集合中,这个过程我们也称之为标记(mark)。最终,未被探索到的对象便是死亡的,是可以回收的。


二、垃圾回收的三种方式:

1、清除:把死亡对象所占据的内存标记为空闲内存。优点是:原理及其简单;缺点是:造成内存碎片和分配效率低;

2、压缩:把存活的对象聚集到内存区域的起始位置,从而留下一段连续的内存空间,解决了内存碎片问题,但是增加了性能开销;

3、复制:把内存区域分为两等分,分别用两个指针 from 和 to 来维护,只用 from 指针指向的内存区域来分配内存。当发生垃圾回收时,把存活的对象复制到 to 指针指向的内存区域中,并且交换 from 指针和 to 指针的内容。能解决内存碎片化的问题,的缺点是堆空间的使用效率极其低下。


三、主流垃圾回收器:

1、CMS 收集器:采用的是标记 - 清除算法,将 Java 堆分为年轻代(Young)或年老代(Old)。年轻代内存空间分为幸存者空间(Survivor)和伊甸园空间(Eden),新的对象始终在 Eden 空间上创建。对象在一次垃圾收集后还幸存,就会被移动到 Survivor。当一个对象在多次垃圾收集之后还存活时,它会移动到年老代。

2、G1 收集器:用的是标记 - 压缩算法,将堆分成非常多个区域。每个区域都可以充当 Eden 区、Survivor 区或者老年代中的一个。针对每个细分的区域来进行垃圾回收。在选择进行垃圾回收的区域时,优先回收死亡对象较多的区域。这也是 G1 名字的由来。和 CMS 相比,也是并发地进行垃圾回收,使用非连续空间,能够有效处理大堆,优化收集时间,减少了暂停时间。

用户头像

树森

关注

还未添加个人签名 2017.10.22 加入

还未添加个人简介

评论

发布
暂无评论
架构师训练营 - 第 9周课后作业 - JVM 垃圾回收原理