jvm 垃圾回收算法

来源:互联网 发布:古埃及人知乎 编辑:程序博客网 时间:2024/06/11 23:38

jvm 垃圾回收算法

  • 引用计数法
  • 标记清除法
  • 标记压缩法
  • 复制算法
  • 分代算法
  • 分区

引用计数法

引用计数法,就是只要有对象引用,计数就加1,垃圾清理的时候对计数为0的直接清理。缺点:循环引用的问题,无法解决,因此java 回收器没有用这个算法。

标记清除法

标记清除主要分为两个阶段:标记阶段和清除阶段,标记阶段首先通过根节点,标记所有从根节点开始可到达的对象,因此,未被标记的就是未被引用的对象,清除阶段,就清除所有未被标记的的对象。次算法可能产生大量的空间碎片。

标记清除算法

标记压缩算法

标记压缩算法是一种老年代回收算法,它在标记清除的算法基础之上做了一些改进,它在标记阶段跟标记清除算法一致,但是之后,并不是简单地清除未标记的对象,而是将所有的存活对象压缩到内存的一端,之后在清除为标记的所有对象。
标记压缩算法

复制算法

复制算法的核心思想:将原有的内存空间分为两块,每次只使用其中一块,在垃圾回收时,将正式使用的内存中的存活对象赋值到未使用的内存块中,之后,清除正在使用的内存块中的所有对象,交换两个内存的角色,完成垃圾回收。次算法代价很大,相当于将可以使用的内存缩小为了原来的一半。 还浪费资源
Jvm 新生代回收器,基本都是使用复制算法。新生代,分为eden空间、from空间和to空间3个部分,其中from和to空间可以视为用于复制的两块大小相同,地位相等且可以进行角色互换的空间块。from和to 也被称为survivor空间,即幸存者空间,用于存放未被回收的对象。
复制算法

在GC开始的时候,对象只会存在于Eden区和名为“From”的Survivor区,Survivor区“To”是空的。紧接着进行GC,Eden区中所有存活的对象都会被复制到“To”,而在“From”区中,仍存活的对象会根据他们的年龄值来决定去向。年龄达到一定值(年龄阈值,可以通过-XX:MaxTenuringThreshold来设置)的对象会被移动到年老代中,没有达到阈值的对象会被复制到“To”区域。经过这次GC后,Eden区和From区已经被清空。这个时候,“From”和“To”会交换他们的角色,也就是新的“To”就是上次GC前的“From”,新的“From”就是上次GC前的“To”。不管怎样,都会保证名为To的Survivor区域是空的。Minor GC会一直重复这样的过程,直到“To”区被填满,“To”区被填满之后,会将所有对象移动到年老代中。

分代算法

上面介绍的算法各有优缺点,没有谁能替代谁,故jvm引入分代算法,将内存区间根据对象的生命周期特点分成几块,每块选择不同的算法,以提供垃圾回收的效率。
JVM分代图

新生代 一般采用 复制算法,老年代,采用标记清除,标记压缩算法。

分区

分区算法将整个堆空间划分成连续的不同小区间,每个小区间独立使用,独立回收,这种算法的好处是可以控制一次回收多少个小区间。未来G1回收器就是使用次算法。

下一张介绍一下回收器和GC调优日志

原创粉丝点击