Java中的垃圾回收算法

来源:互联网 发布:unity3d加速器 编辑:程序博客网 时间:2024/05/02 01:13

Java中的垃圾回收算法

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

引用计数原理:
- 在堆中,对每个对象都有个引用计数器,被引用时,计数器+1;
- 当引用被置空或离开作用域,引用计数器-1。
无法解决互相引用问题,所以JVM没有采用。同时效率低下

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

原理:
- 利用JVM维护的对象引用图,从根节点遍历对象的引用图,同时标记遍历到的对象。
- 当遍历结束后,未被标记的对象就是不再被使用的对象,可以回收。

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

原理:
- 将堆中活动的对象“移动”到堆中一端,这样会在堆中另外一端留出大的空闲区域。相当于对堆中的碎片进行处理。
该方法可以简化消除堆碎片的工作,但每次处理会带来性能损失。

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

原理:
- 把堆分成两个大小相同的区域,任何时候,仅有其中之一被使用,直到这个区域被消耗完为止。
- 此时,GC会中断程序的执行,使用遍历的方式将活动对象复制到另一区域中,复制过程中,紧挨着布置,消除了内存碎片。当复制结束后,程序会继续运行,知道此区域被使用完,然后使用同样方式进行垃圾回收。

  • 优点: 垃圾回收的同时,对对象的不知进行了安排,消除了内存碎片
  • 缺点:需要较高的内存空间的代价;同时由于在内存调整的过程中要中断当前执行的程序,会降低程序的执行效率。

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

原因:
复制回收算法效率低,每次处于活动状态的对象需要被复制
程序的特点:
程序创建的大部分对象的生命周期很短,只有部分对象才有较长生命周期
原理:
- 把堆分成两个或多个子堆,每个子堆视为一代。算法在收集过程中优先收集“年幼”的对象,如果一个对象多次收集仍然“存活”,那么就可以将对象转移到更高级的堆里,减少扫描次数。

0 0
原创粉丝点击