Java对象生命周期

 

强可达对象:

对象可以从根节点不通过任何引用对象搜索到。对象生命周期从强可触及状态开始,并且只要有根节点或者另外一个强可达对象引用它,就保持强可达状态,GC不会试图回收强可达对象占据的空间。

 

软可达:

           对象不是强可达,但是可以从根节点开始通过一个或多个(未被清除的)软引用对象触及。GC可能回收软可达对象所占据的内存。一旦对象离开软可达状态,GC便将对象加入队列。如果内存紧张,GC便有可能回收内存。

           软引用可以创建内存中的缓存,它与程序的整体内存需求有关。如缓存由外部数据费时取回的数据,比如文件、数据库或者网络。

 

弱可达:

           对象既不是强可达,也不是软可达,但是从根节点开始可以通过一个或多个(未被清除的)弱引用对象触及。GC必须回收弱可达对象所占据的内存。一旦对象离开弱可达状态,GC便此时将对象加入队列。

           弱引用可以创建规范映射,如果HashTable

           与软引用不同的是,GC可以自行决定是否清除指向软可达的对象的软连接,而它必须在判断出对象处于弱连接状态时就立即清除弱引用。

如果一个对象惟一剩下的引用是弱引用或软引用,那么该对象是软可及的(softly reachable)。垃圾收集器并不像其收集弱可及的对象一样尽量地收集软可及的对象,相反,它只在真正需要内存时才收集软可及的对象。软引用对于垃圾收集器来说是这样一种方式,即只要内存不太紧张,我就会保留该对象。但是如果内存变得真正紧张了,我就会去收集并处理这个对象。垃圾收集器在可以抛出 OutOfMemoryError 之前需要清除所有的软引用。

           java.util.WeakHashMap,如果把一个键-值对加入到WeakHashMap,在程序显式使用remove()方法移出它或者GC发现关键字是弱可达之前,它会一直保留在WeakHashMap里面。

 

可复活的:

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

 

影子可达(翻译的比较囧,PhantomReference:

           对象既不是强可达、软可达、也不是弱可达,也不能通过执行某些终结方法,并且可以从根节点通过一个或多个影子对象触及。一旦某个影子引用的对象变成影子可触及状态,GC立即把该引用对象加入队列,直至显式清除。GC从不会清除一个影子引用,所有的影子引用都必须有程序显式清除。

           影子引用可以实现出终结方法以外的更加复杂的临终清理政策。

Phantom Reference 主要是用来取代对象的 finalize()。程序员利用 finalize() 来进行释放资源的同时,有可能不小心 让此对象再度拥有 Direct Reference。但是使用 Phantom Reference 则不会有此情形发生。和 Weak Reference SoftReference 最大的不同是:Phantom Reference 一订要搭配着 ReferenceQueue 使用,因为 Phantom Reference get() 出值一定是 null(以避免此对象不小心再度拥有 Direct Reference)。通常我们会设计一个 class 继承 PhantomReference,然 override clear() 来定义释放资源等收尾的动作。当然,我宁可小心一点地使用 finalize(),也不愿意自找麻烦地使用 Phantom Reference
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值