2010-12-06 151 views
1

我正在編寫一個程序,現在基本上是這樣的:在隨機時間到達每條道路上的汽車有4路停車。每條道路都服務於FCFS,並且交叉路口管理爲循環賽風格,每次有1輛車過境。每輛等車都是一條線。我已經獲得線程同步和算法工作沒有問題。我無法弄清楚的問題是如何防止錯誤:OutOfMemoryError:無法創建新的本地線程。我意識到這是由於堆(堆棧?我總是讓它們切換)變滿。我找不到一種方法來確保執行的線程由垃圾收集器正確管理,並且不會在執行後在內存中徘徊。我試着用軟引用來設置我的隊列(每條「汽車線程的道路」),並將任何硬引用歸於無效。這裏的任何人都有這方面的經驗!?謝謝!!!java線程內存管理問題

+2

一些代碼顯示你如何處理胎面將不勝感激。 – 2010-12-06 07:57:45

回答

0

您是否試過使用ThreadPool

您可以從Java 5開始創建一個ThreadPool,其中您決定了Vm應爲您初始化多少個線程算法。線程被創建並重用。

我有一個類似的問題。線程不會被GarbageCollector刪除/刪除,並以某種方式永遠活着。

2

「OutOfMemoryError:無法創建新的本地線程」是否而不是是指堆內存。它不會幫助您清零引用或使用軟/弱引用。此外,增加堆的大小隻會讓事情變得更糟。

Java爲線程堆棧使用本地內存。每次啓動一個線程時,都會在JVM堆外部分配一個新的堆棧。直到線程終止,堆棧纔會被釋放。考慮使用較少的併發線程(例如,您可以通過使用ThreadPoolExecutor來控制數量),或者可以減小堆棧大小(使用-Xss {size} k)

另請參閱this post,其中詳細說明了許多類型的內存不足錯誤。

0

這隻會發生,如果你有太多的運行線程。 (不只是線程的引用)像@Markus,我建議您切換到像ExecutionService一個線程池,因爲它會管理線程的創建和它的作品。

BTW:併發庫的歷史可以追溯到1998年,但僅包含在Java 5.0中(2005年),所以如果你必須有一箇舊版本,你可以使用的或者下行移植原始庫。