java虚拟机学习笔记(二)垃圾回收

Posted on 2009-05-14 20:37 eric_xu 阅读(398) 评论(0)  编辑  收藏 所属分类: JVM

释放不再被程序使用的对象。检测和回收。

垃圾检测:建立一个根对象的集合,并检测从这些根对象开始的可触及性来实现。任何被根对象引用的对象都是可触及的,任何被活动的对象引用的对象都是可触及的。

引用计数收集器,引用计数无法检测出循环;跟踪收集器,标记并清除。清理对碎块,压缩收集器,设置间接对象引用层(对象句柄表),只需句柄更新新位置。

拷贝收集器,把所有活动对象移动到新区域。停止并拷贝,需要两倍内存,任何时候只能使用一半。

按代收集的收集器,把对象按照寿命分组,对最年幼的进行最频繁的垃圾收集。

渐进式垃圾收集器,不试图一次性发现并回收所有不可触及的对象,而是每次发现并回收一部分。

火车算法

火车算法执行的时候,或者收集最小数字火车中的最小数字车厢,或者收集整个最小数字火车。

如果整个火车都是垃圾对象,那么整个火车都被收集。否则,收集最小数字车厢。

收集最小数字车厢时,把最小数字车厢内部有被其他车厢引用的对象转移到引用的车厢,如此循环,最后收集整个车厢。

收集最小数字火车时,把最小数字车厢内部有被其他火车引用对象则会转移到引用的火车,如此循环,最后收集整个火车。

火车算法保证大型的循环数据会被完全收集。

记忆集合,指向车厢或火车内对象的所有引用的集合。

终结方法,垃圾收集器在释放对象前必须运行。第二遍扫描,终结方法可能复活了某些不再被引用的对象。根结点不可触及和终结对象不可触及的对象可以立即被释放。

对象可触及性的生命周期

可触及,可复活,不可触及。

SoftReferenceWeakReferencePhantomReference 都是 java.lang.ref.Reference 类的子类。强引用与这三种弱引用之间最基本的差别是,强引用禁止引用目标被垃圾收集,而那三种引用不禁止。

Ÿ   强可触及 对象可以从根节点不通过任何引用对象搜索到。

Ÿ   软可触及 垃圾收集器可能回收软可触及的对象所占据的内存。如果这发生了,它会清除所有到此软可触及对象的软引用。当垃圾收集器清除一个和引用队列有关联的软引用对象时,它把该软引用对象加入队列。

Ÿ   弱可触及 垃圾收集器必须归还弱可触及对象所占据的内存。这发生的时候,它会清除所有到此弱可触及对象的弱引用。当垃圾收集器清除一个和引用队列有关联的的弱引用对象时,它把该弱引用对象加入队列。

Ÿ   可复活的 对象既不是强可触及、软可触及,也不是弱可触及,但是仍然可能通过执行某些终结方法复活到这几种状态之一。

Ÿ   影子可触及 一旦某个被影子引用的对象变成影子可触及状态,垃圾收集器立即把该引用对象加人队列。垃圾收集器从不会清除一个影子引用,所有的影子引用都必须由程序明确地清除。

弱引用与软引用的区别在于:只具有弱引用的对象拥有更短暂的生命周期。

软引用可以创建内存中的缓存,弱引用可以创建规范映射。

只有注册用户登录后才能发表评论。


网站导航:
 

posts - 37, comments - 5, trackbacks - 0, articles - 0

Copyright © eric_xu