2011-05-31 26 views
1

我有一個對象緩存內部使用弱引用,有時我的對象得到GCed,即使我仍然需要它(所以它需要重新加載)。 我的想法是通過增加另一個引用該對象,以防止GC:如何防止GC收集弱引用對象?

Object obj = Cache.getObject(key); 
  1. OBJ或強或弱的裁判?

  2. 這似乎適用於我的情況,但我不知道如果這是正確的方式,所以我會很感激任何建議。

p.s.我無法更改緩存實施。

回答

2

obj是正常的(即強)參考。

只要變量obj可到達,該對象就不符合GC的條件。所以:是的,這會阻止對象被收集。

+0

謝謝!我不確定這個新手問題。 – sinek 2011-05-31 11:37:33

2

只要你行Object obj = Cache.getObject(key)執行,由obj引用的對象現在是強烈引用並不會被垃圾收集(但是當obj超出範圍的引用對象可以有資格進行垃圾回收)。

1

如果你不想要某些東西得到GC'ed,你應該堅持引用它。如果一段代碼的性能會因對象消失而受到不利影響,那麼最後一個強引用就會失效,那麼該代碼應該被認爲是中斷的。

弱引用的主要地方是在一個對象有一個它並不真正關心的東西的引用的情況下,但是當它有其他對象關心時它會被更新或監視它。例如,套接字監視器可能會接收所有傳入的數據包並將其放入隊列中,以便數據包日誌窗口可以將它們拉出並顯示出來。如果應該從隊列中讀取的對象在沒有通知套接字監視器的情況下消失,並且套接字監視器有強烈的隊列引用,那麼即使沒有人有興趣讀取它們,也可以將數據包添加到隊列中。但是,如果套接字監視器使用WeakReference作爲隊列,那麼在應該從隊列中讀取的對象消失後,隊列將有資格進行garbagecollection(因爲套接字監視器只能保存弱引用)。一旦隊列被垃圾收集,套接字監視器可能會注意到它的WeakReference已經失效並可能自行關閉。