2014-06-24 72 views
2

我有一個類,它看起來是這樣的:列表中的對象是否會被垃圾收集?

public class MyClass() { 
    private List<Thread> threads = new ArrayList<>(); 

    ... 

    public MyClass() { 
     for (int i = 0; i < 10 ; i++) { 
      Thread t = new Thread(); 
      threads.add(t); 
      t.start(); 
     } 
    } 
} 

在我的服務,有可能徘徊於該服務運行期間的MyClass一個實例。通過JConsole,我觀察到10個線程被創建並開始處理,所以我知道這個設置在某種程度上是有效的。

當系統負載不足時,我的問題就出現了。當我向服務發送數千個大對象時,上面的線程自然死亡。 (正如我在JConsole中觀察到的那樣)。由於沒有爲實際拆除線程和/或清除列表而定義的邏輯,因此我想知道Java是否有可能從垃圾收集threads列表中的實際對象並只是背後留下某種弱點。

問題:

  • 在高負載下,是有可能,Java垃圾收集threads列表的內容?

  • 有沒有另一種方式,threads名單的內容可以自發地消失?例如。線程可以以某種方式停止,而不需要任何明確的代碼調用某種清理邏輯。

(是的,我知道這是設計不良的代碼,但它是舊的代碼,我只是想弄清楚什麼是目前發生的事情之前,我去嘗試並解決落實。)

+0

您是否問是否垃圾收集後的過程完成,或過程中/之前?如果第一個,那麼是的,否則不。 –

+0

@TheLostMind我已經修復了代碼。實際上它創建了這些奇怪的對象,每個對象都包含一個線程,然後在調用'run()'方法時啓動它。我試圖通過直接使用線程列表來簡化代碼示例,但顯然錯過了一個地方。 –

+0

「List」中的條目是否被清除,或者這些'Thread'對象表示的線程是否停止?請注意,正在運行的線程無法啓動GC。 –

回答

1

在重負載下,Java垃圾可能會收集線程List的內容嗎?

否和否。

沒有,因爲他們正在運行。正在運行的線程不會被收集。

而不是因爲存儲在本身是活着的列表中。

簡而言之,GC決不會剝奪您可能希望稍後坐的椅子。

有沒有另一種方式,線程列表的內容可以自發地消失?

不可以,但最重要的問題是缺少:

我這樣做對嗎?

否標準方法是使用Executors,它可以爲您提供例如與newFixedThreadPool。除非你有特殊的要求和良好的專業知識,否則堅持下去。如果他們不滿足您的需求,甚至有MoreExecutors

+0

其實,最重要的問題是我最後的陳述。我知道它做錯了,我只是想弄明白在將它換成線程池之前它會如何破解。 –