Posted on 2009-05-14 20:37
eric_xu 阅读(401)
评论(0) 编辑 收藏 所属分类:
JVM
释放不再被程序使用的对象。检测和回收。
垃圾检测:建立一个根对象的集合,并检测从这些根对象开始的可触及性来实现。任何被根对象引用的对象都是可触及的,任何被活动的对象引用的对象都是可触及的。
引用计数收集器,引用计数无法检测出循环;跟踪收集器,标记并清除。清理对碎块,压缩收集器,设置间接对象引用层(对象句柄表),只需句柄更新新位置。
拷贝收集器,把所有活动对象移动到新区域。停止并拷贝,需要两倍内存,任何时候只能使用一半。
按代收集的收集器,把对象按照寿命分组,对最年幼的进行最频繁的垃圾收集。
渐进式垃圾收集器,不试图一次性发现并回收所有不可触及的对象,而是每次发现并回收一部分。
火车算法
火车算法执行的时候,或者收集最小数字火车中的最小数字车厢,或者收集整个最小数字火车。
如果整个火车都是垃圾对象,那么整个火车都被收集。否则,收集最小数字车厢。
收集最小数字车厢时,把最小数字车厢内部有被其他车厢引用的对象转移到引用的车厢,如此循环,最后收集整个车厢。
收集最小数字火车时,把最小数字车厢内部有被其他火车引用对象则会转移到引用的火车,如此循环,最后收集整个火车。
火车算法保证大型的循环数据会被完全收集。
记忆集合,指向车厢或火车内对象的所有引用的集合。
终结方法,垃圾收集器在释放对象前必须运行。第二遍扫描,终结方法可能复活了某些不再被引用的对象。根结点不可触及和终结对象不可触及的对象可以立即被释放。
对象可触及性的生命周期
可触及,可复活,不可触及。
SoftReference、WeakReference、PhantomReference
都是 java.lang.ref.Reference 类的子类。强引用与这三种弱引用之间最基本的差别是,强引用禁止引用目标被垃圾收集,而那三种引用不禁止。
强可触及 对象可以从根节点不通过任何引用对象搜索到。
软可触及 垃圾收集器可能回收软可触及的对象所占据的内存。如果这发生了,它会清除所有到此软可触及对象的软引用。当垃圾收集器清除一个和引用队列有关联的软引用对象时,它把该软引用对象加入队列。
弱可触及 垃圾收集器必须归还弱可触及对象所占据的内存。这发生的时候,它会清除所有到此弱可触及对象的弱引用。当垃圾收集器清除一个和引用队列有关联的的弱引用对象时,它把该弱引用对象加入队列。
可复活的 对象既不是强可触及、软可触及,也不是弱可触及,但是仍然可能通过执行某些终结方法复活到这几种状态之一。
影子可触及 一旦某个被影子引用的对象变成影子可触及状态,垃圾收集器立即把该引用对象加人队列。垃圾收集器从不会清除一个影子引用,所有的影子引用都必须由程序明确地清除。
弱引用与软引用的区别在于:只具有弱引用的对象拥有更短暂的生命周期。
软引用可以创建内存中的缓存,弱引用可以创建规范映射。