JVM学习之路(八)——垃圾回收算法

Java语言与C语言最大的区别就是内存自动回收,那么JVM是怎么控制内存回收的,这里将介绍JVM垃圾回收的几种算法,从而了解JVM内存回收的基本原理。

八、垃圾回收算法

(一)、stop the world

stop the world会在执行某一个垃圾回收算法的时候产生。JVM为了执行垃圾回收,会暂停java应用程序的执行,等垃圾回收完成后,再继续运行。使用JMeter测试过java程序的同学,可能会发现在测试过程中,java程序有不规则的停顿现象,其实这就是“stop the world”,停顿的时候JVM是在做垃圾回收。所以尽可能减少stop the world的时间,就是优化JVM的主要目标。

(二)、引用计数法

原理:对一个对象被引用的次数进行计数,当增加一个引用时计数就加1,减少一个引用时计数就减1。当对象引用减少为0时,对象的内存空间将被回收掉。

特点:算法原理非常简单,是最原始的回收算法。

缺点:

①频繁的计数会影响性能

②它无法处理循环引用的问题。例如Father对象中引用了Son对象,Son对象中又引用了Father对象,这种情况下,对象将永远无法被回收。正是由于以上2个缺点,java中并没有使用这种算法。

(三)、标记清除

原理:

①标记:遍历所有的GC Roots,并将从GC Roots可达的对象设置为存活对象。注意:必须从GC Roots开始

②清除:遍历堆中的所有对象(因为所有对象都存在于java堆中),将没有被标记为可达的对象清除

特点:标记清除算法执行过程中,会产生“stop the world”,让java程序暂停等待,以保证在标记清除的过程中,不会有新的对象产生。为什么必须暂停java程序呢?是这样的,如果在标记过程完成后,又新产生了一个对象,而该对象已经错过了标记期,那么在接下来的清除流程中,这个新产生的对象因为未被标记,所以将被视为不可达对象而被清除,这样程序就会出错,因此标记清除算法在执行时,java程序将被暂停,产生“stop the world”。

缺点:

1、大量的内存遍历,执行性能较低,这也会导致“stop the world”时间较长,java程序吞吐量降低。

2、在对象被清除之后,被清除的对象留下内存的空缺位置,造成内存不连续,空间浪费

(四)、标记压缩

原理:在标记清除算法的基础上,增加了压缩过程

步骤:3个步骤:①标记、②清除、③压缩。

优点:在进行完标记清除之后,对内存空间进行压缩,节省内存空间,解决了标记清除算法内存不连续的问题

特点:标记压缩算法也会产生“stop the world”,不能和java程序并发执行。在压缩过程中一些对象内存地址会发生改变,java程序只能等待压缩完成后才能继续。

(五)、复制算法

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

在新生代使用复制算法回收垃圾的过程:在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中并不是单纯的使用特定的算法,而是使用的一种叫垃圾回收器的东西,垃圾回收器可以看做一系列垃圾回收算法的不同组合,在不同的场景使用合适的垃圾回收器,才能起到事半功倍的效果。

猜你喜欢

转载自blog.csdn.net/u012556994/article/details/81269032
今日推荐