您的位置:首页 > 编程语言 > Java开发

Java中的垃圾回收算法

2016-04-10 22:30 429 查看

Java中的垃圾回收算法

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

引用计数原理:

- 在堆中,对每个对象都有个引用计数器,被引用时,计数器+1;

- 当引用被置空或离开作用域,引用计数器-1。

无法解决互相引用问题,所以JVM没有采用。同时效率低下

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

原理:

- 利用JVM维护的对象引用图,从根节点遍历对象的引用图,同时标记遍历到的对象。

- 当遍历结束后,未被标记的对象就是不再被使用的对象,可以回收。

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

原理:

- 将堆中活动的对象“移动”到堆中一端,这样会在堆中另外一端留出大的空闲区域。相当于对堆中的碎片进行处理。

该方法可以简化消除堆碎片的工作,但每次处理会带来性能损失。

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

原理:

- 把堆分成两个大小相同的区域,任何时候,仅有其中之一被使用,直到这个区域被消耗完为止。

- 此时,GC会中断程序的执行,使用遍历的方式将活动对象复制到另一区域中,复制过程中,紧挨着布置,消除了内存碎片。当复制结束后,程序会继续运行,知道此区域被使用完,然后使用同样方式进行垃圾回收。

优点: 垃圾回收的同时,对对象的不知进行了安排,消除了内存碎片

缺点:需要较高的内存空间的代价;同时由于在内存调整的过程中要中断当前执行的程序,会降低程序的执行效率。

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

原因:

复制回收算法效率低,每次处于活动状态的对象需要被复制

程序的特点:

程序创建的大部分对象的生命周期很短,只有部分对象才有较长生命周期

原理:

- 把堆分成两个或多个子堆,每个子堆视为一代。算法在收集过程中优先收集“年幼”的对象,如果一个对象多次收集仍然“存活”,那么就可以将对象转移到更高级的堆里,减少扫描次数。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java jvm