2013-08-01 27 views
3

在擴展Thread類,請看下面的例子:在Thread.run()中創建新對象,它們何時被垃圾收集?

public void run() { 
    while (workToDo) { 
     JSONObject json = new JSONObject(getNextMap()); 
     publishJSON(json.toString()); 
     // thread sleep 
    } 
} 

json每個實例仍然被引用,只要線程運行時,或者他們每次new被稱爲釋放?這應該轉移到一種方法,即publishJSON(getJson(getNextMap())

+1

每次循環迭代後,它將在GC超出範圍時可用。 –

+0

當GC認爲他們應該是時,他們就被釋放了。請注意,當到達'while'循環的最後一句時,'json'變量的對象引用保留將被標記爲垃圾回收。 –

+0

@assylias你可以擴大嗎? –

回答

4

要對對象進行引用,那麼它必須是本地使用的變量(在本地範圍內)或包含在類實例的成員變量中。

我沒有看到你的例子中的任何兩個,因爲在每個while迭代之後,局部變量不能再被引用。因此,除非您使用json來保存對其他地方的引用,否則它們有資格進行垃圾回收。

請注意,這並不意味着GC將在每次迭代後收集沒有更多參考的實例,因爲從開發人員的角度來看,它的行爲不可預測。你只知道最終他們會被收集。

+0

謝謝,我不確定範圍是否改變了每一次循環。 – coolhouse

+0

你不知道。 GC可能永遠不會運行。您知道該對象符合所述條件下的連接。 – EJP