JVM垃圾回收算法

1、引用计数算法(Reference Counting Collector)

  引用计数算法作为一种简单但是效率低下的算法,其主要原理如下:在堆中对每个对象都有一个引用计数器;当对象被引用时,引用计数器加1;当引用对象被置为空或者离开作用域时,引用计数器减1,由于这种方法无法解决互相引用的问题,因此JVM没有采用这种算法。

2、追踪回收算法(Tracing Collector)

  追踪回收算法利用JVM维护对象的引用图,从根节点开始遍历对象的应用图,同时标记遍历到的对象。当遍历结束后,未被标记到的对象就是目前已不被使用的对象,可以被回收了。

3、压缩回收算法(Compacting Collector)

  压缩回收算法的主要思路如下:把堆中活动的对象移动到堆的一端,这样就会在堆中另外一端留出很大一块空闲区域,相当于对堆中的碎片进行了处理。虽然这种方法可以大大建华消除堆碎片的工作,但是每次处理都会带来性能损失。

4、复制回收算法(Coping Collector)

   复制回收算法的主要思路如下:把堆分成两个大小相同的区域,在任何时刻,只有其中一个区域被使用,直到这个区域被消耗完为止,此时来及回收器会中断程序的执行,通过遍历的方式吧所有活动的对象复制到另一个区域中,在复制的过程中他们是紧挨着布置的,从而可以消除内存碎片。当复制过程结束后程序会接着运行,直到这块区域被使用完,然后再采用上面的方法继续进行垃圾回收。

  这个算法的优点是在进行垃圾回收的同时对对象的布置也进行了安排,从而消除了内存碎片。但是这也付出了很高的代价:对于指定大小的堆来说,需要两倍大小的内存空间;同时在调整的过程中要中断当前程序的执行,从而降低了程序的指向效率。

5、按代回收算法(Generational Collector)

  按代回收算法JVM将堆划分为Young区、Old区和Perm区。Young区又分为Eden区和两个Survivor区,其中所有新创建的对象都在Eden区,当Eden区满后会触发minorGC将Eden区仍存活的对象复制到其中一个Survivor区中,另一个Survivor区中村后的对象也复制到这个Survivor区中,以保证始终有一个Survivor区是空的;Old区存放的是Young区的Survivor满后触发minorGC后仍然存活的对象,当Eden区满后会将对象存放到Survivor区中,如果Survivor区仍然存不下这些对象,GC收集器会将这些对象直接存放到Old区。如果在Survivor区中的对象足够老,也直接存放到Old区。如果Old区也满了,将会触发Full GC,回收整个内存;Perm区存放的主要是类的Class对象,如果一个类被频繁的加载,也可能会导致Perm区满,Perm区的垃圾回收也是由Full GC触发的。

原文地址:https://www.cnblogs.com/alternative/p/7799520.html