[英]How to keep alive Java objects?
我正在考慮一種方法來防止垃圾收集中的Java對象,即使它沒有在合理的時間內被引用。
怎么做?
在主類中有一個static
容器,您可以在其中放置對象的引用。它可以是Map
, List
等等。 然后你將總是有一個對象的引用,它將不會被回收。 ( 為什么你想這樣做是另一個問題...)
也就是說:只要存在對象的可訪問引用,就不會對其進行垃圾回收。 如果您的代碼有引用並嘗試使用它,那么該對象就在那里。 你沒有做任何特別的事情來實現這一點(你也不應該)。 ( 可達參考意味着引用來自某些東西,它本身可以從它引用的東西以外的其他東西到達。更簡單地說:GC理解循環引用,因此即使它們引用每個引用也可以清理A和B.另外,只要沒有其他任何內容指的是其中任何一個。)
[...]即使它沒有被推薦一段合理的時間 。
如果有什么那么一個對象會在將來訪問的任何機會 ,對象將不會被垃圾收集 。
這是因為如果你有一個對象的引用,它將不會被垃圾收集,如果你沒有對該對象的引用,你將永遠無法訪問它。
換句話說,普通引用永遠不會神秘地轉變為null
只是因為垃圾收集器發現該對象長時間未被訪問並且認為是時候回收它了。
您還可以在自己的類中創建對象的靜態實例。 例如,如果它是單例,則在類中具有靜態實例字段。
有一些機制可以保存對象的引用,但如果沒有其他引用則仍然允許它被垃圾回收。
看看WeakReference和SoftReference。 如果您想了解有關jvm的可達性的更多詳細信息,請參閱:
http://download.oracle.com/javase/6/docs/api/java/lang/ref/package-summary.html#reachability
就時間而言,垃圾收集器不知道或不關心對象的使用頻率。 另一個對象都有對目標的引用(即使它沒有使用它),或者沒有對目標的引用。 如果沒有對該對象的引用,它將永遠不會被再次使用,並且最終將被釋放(即使您想要,也無法再次獲得對該對象的引用)對象的生命周期越長,對象的生命周期越長由於世代垃圾收集,jvm需要釋放它。
我正在考慮一種方法來防止垃圾收集中的Java對象,即使它沒有在合理的時間內被引用。
從表面上看,這個問題沒有意義。 如果沒有引用對象(或者更准確地說,如果它不可訪問),那么垃圾收集器將收集它。 如果要防止對象被垃圾回收,則必須確保它是可訪問的。 (實際上,它必須能夠很好地保證它不會被GC控制:請參閱@Austen Holmes的答案和他引用的頁面。)
但實際上,我認為你對訪問或使用的“引用”/引用/可訪問感到困惑; 即通過訪問字段或調用對象的方法的行為 。 如果這就是您要求的,那么我可以確保垃圾收集器既不知道也不關心您的代碼最近是否訪問過/使用過對象。
可達性標准實際上是關於您的代碼是否可以在將來的某個時刻訪問該對象,以及(因此)是否需要保留該對象以使其可用。 該可達性規則意味着,如果一個對象可以訪問,那么它會被保留。 自您上次訪問它以來,它沒有任何區別。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.