Java的垃圾回收机制(GC)总结

来源:互联网 发布:fuse linux 编辑:程序博客网 时间:2024/06/06 08:46

1.垃圾回收机制只负责回收堆内存中的对象,不会回收任何物理资源(如数据库连接,网络IO等资源)
2.程序无法精确控制垃圾回收的运行,垃圾回收会在合适的时候运行。当对象永久的失去引用后,系统会在合适的时间回收其占用的内存。
3.在垃圾回收机制回收任何对象之前,总会先调用它的finalize()方法。

垃圾回收(GC)算法总结:

1. 标记-清理
标记:标记的过程其实就是,遍历所有的GC Roots,然后将所有GC Roots可达的对象标记为存活的对象。
清除:清除的过程将遍历堆中所有的对象,将没有标记的对象全部清除掉。
简单来说就是:当程序运行期间,若可以使用的内存被耗尽的时候,GC线程就会被触发并将程序暂停,随后将依旧存活的对象标记一遍,最终再将堆中所有没被标记的对象全部清除掉,接下来便让程序恢复运行。
缺点:需要遍历全堆对象效率较低,清除之后的内存不连续
2. 复制算法
复制算法将内存划分为两个区间,在任意时间点,所有动态分配的对象都只能分配在其中一个区间(称为活动区间),而另外一个区间(称为空闲区间)则是空闲的。
当有效内存空间耗尽时,JVM将暂停程序运行,开启复制算法GC线程。接下来GC线程会将活动区间内的存活对象,全部复制到空闲区间,且严格按照内存地址依次排列,与此同时,GC线程将更新存活对象的内存引用地址指向新的内存地址。
此时,空闲区间已经与活动区间交换,而垃圾对象现在已经全部留在了原来的活动区间,也就是现在的空闲区间。事实上,在活动区间转换为空间区间的同时,垃圾对象已经被一次性全部回收。
缺点:浪费了一半的内存空间,复制花费了多余的时间 。
适用于对象存活率低的时候
3. 标记-整理
标记:它的第一个阶段与标记/清除算法是一模一样的,均是遍历GC Roots,然后将存活的对象标记。
整理:移动所有存活的对象,且按照内存地址次序依次排列,然后将末端内存地址以后的内存全部回收。因此,第二阶段才称为整理阶段。
缺点:效率不高
4. 分代回收算法
分为3代:年轻代,年老代,持久代
普通GC(minor GC):只针对新生代区域的GC。使用复制回收算法。
全局GC(major GC or Full GC):针对年老代的GC,偶尔伴随对新生代的GC以及对永久代的GC。使用标记清理算法或标记整理算法

效率:复制算法>标记/整理算法>标记/清除算法(此处的效率只是简单的对比时间复杂度,实际情况不一定如此)。
内存整齐度:复制算法=标记/整理算法>标记/清除算法。
内存利用率:标记/整理算法=标记/清除算法>复制算法。

本文转载于http://www.cnblogs.com/zuoxiaolong 这位大佬的总结,我只是简单的提炼了一下。

原创粉丝点击