首页 > 编程知识 正文

简述jvm垃圾回收机制,jvm垃圾回收算法和垃圾回收器

时间:2023-05-04 19:56:47 阅读:190138 作者:2443

Java语言和c语言最大的区别是内存回收。 那么,JVM是如何控制内存回收的呢? 为了了解内存回收的基本原理,本文介绍了JVM垃圾回收的一些算法。

stop the world

在介绍垃圾回收算法之前,必须知道“stop the world”这个词。 执行某个垃圾回收算法时会发生stop the world。 为了执行垃圾回收,JVM会临时执行Java APP收集,并在垃圾回收完成后继续执行。 如果使用JMeter测试过java程序,则在测试过程中可能会发现java程序中存在不规则的停顿现象。 其实这就是“stop the world”,在姿势中JVM进行了垃圾回收。 所以,尽量减少stop the world的时间是优化JVM的主要目标。 接下来,我们来看看目前有哪些常见的垃圾回收算法。

引用计数法

引用计数法,顾名思义就是对一个对象被引用的次数进行计数,增加一个引用计数就增加1,减少一个引用计数就减少1。

上图显示三个Teacher的引用指向堆中的Teacher对象。 这样,Teacher对象的引用数为3,Student对象的引用数为2。

上图显示对Teacher对象的引用减少到2,对Student对象的引用减少到0。 减少的原因是其引用指向null。 例如,如果teacher3=null,则引用计数算法将回收Student对象的内存空间。

引用计数算法的原理非常简单,是最原始的回收算法,但java中没有使用该算法。 理由有两个。 1表示频繁计数会影响性能,2表示无法处理循环引用问题。

例如,如果Teacher对象引用了Student对象,而Student对象引用了Teacher对象,则该对象将永远不能循环使用。

取消标记

标注算法是许多垃圾回收算法的基础,简单地说,有标记、清除两个步骤。

标签:遍历所有GC Roots,将可以从GC Roots到达的对象设定为生存对象;

清除:遍历堆中的所有对象,并清除未标记为可访问的对象。

上图中的灰色对象无法从GC Root遍历,因此无法从GC Root遍历。 但是,存在引用关系,但无法从GC Root遍历。 因此,它没有标记为存活对象,而是在清理过程中回收。

这里需要注意的是,在标签清除算法的执行中发生“stop the world”,为了在标签清除中不产生新的对象,暂停java程序并使其待机。 为什么必须暂停java程序? 例如,如果在标记过程完成后生成了超过标记期间的新对象,则下一个清除过程会将新生成的对象视为不可访问的对象进行清除,并导致程序错误因此,在运行标记擦除算法时,java程序将暂停以生成" stop the world "。

然后总结标签清除算法。

1、由于需要大量的内存遍历工作,运行性能较低,导致“stop the world”时间延长,导致java程序吞吐量降低;

2、对象被擦除后,发现被擦除的对象会留下内存的空闲位置,导致内存不连续,浪费空间。

接下来,我们来看看其他算法能否改善这些问题。

标记压缩

标签压缩算法可能已经考虑过了,那是在标签删除算法的基础上追加了压缩过程。

进行标签清除后,压缩内存空间,节约内存空间,解决了标签清除算法的内存不连续问题。

yle="margin-left:10px;">注意标记压缩算法也会产生“stop the world”,不能和java程序并发执行。在压缩过程中一些对象内存地址会发生改变,java程序只能等待压缩完成后才能继续。

复制算法

    复制算法简单来说就是把内存一分为二,但只使用其中一份,在垃圾回收时,将正在使用的那份内存中存活的对象复制到另一份空白的内存中,最后将正在使用的内存空间的对象清除,完成垃圾回收。

 

 

    复制算法相对标记压缩算法来说更简洁高效,但它的缺点也显而易见,它不适合用于存活对象多的情况,因为那样需要复制的对象很多,复制性能较差,所以复制算法往往用于内存空间中新生代的垃圾回收,因为新生代中存活对象较少,复制成本较低。它另外一个缺点是内存空间占用成本高,因为它基于两份内存空间做对象复制,在非垃圾回收的周期内只用到了一份内存空间,内存利用率较低。

小结

    以上我们介绍了常见的垃圾回收算法,这些算法各有各的优缺点,但在JVM中并不是单纯的使用特定的算法,而是使用的一种叫垃圾回收器的东西,垃圾回收器可以看做一系列算法的不同组合,在不同的场景使用合适的垃圾回收器,才能起到事半功倍的效果。我们下一篇将介绍垃圾回收器。

 

文章转载自:http://www.cnblogs.com/leefreeman/p/7389919.html

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。