2015-08-24 69 views
1

處理有大量內存問題的程序。該程序由兩個線程組成。線程1從隊列中拾取數據,處理它們,創建各種對象並將它們傳遞給線程2進行處理並存儲在數據庫中。 已使用的堆大小持續攀升,直到發生OutOfMemory錯誤。多個線程之間共享java對象,何時垃圾收集?

我通過只使用一個線程解決了內存問題,因爲從我所能理解的情況來看,對象最終保持活動狀態,因此沒有GC引用,因爲引用它們仍然貫穿線程2和數據庫存儲過程。

我還有一個問題:線程1中創建的對象何時會被GC編輯?當線程1退出?當線程2,將使用它們進行進一步處理,將退出?

回答

0

什麼時候線程1中創建的對象應該被GC編輯?

每當GC喜歡,受制於他們是可收集的。也許從不。

當線程1退出?當線程2,將使用它們進行進一步處理,將退出?

以上都不是。無法訪問時它們變爲可收集的,即,當它們的所有引用超出範圍時,或者包含的對象變得無法訪問時。線程在執行時總是可到達的。

+0

所以有可能是有助於使程序耗費巨大的內存(除了創造大對象)兩兩件事,1)線程2負責DB持久性是緩慢的,並保持對這些對象的引用很長一段時間,2)包含對象,即線程,始終是訪問,並因此會在它創建的對象 – user2163389

+0

@ user2163389的問題是,爲什麼任何線程還是可以參考的對象時,它已經被處理後,那肯定應該不是這種情況 – Voo

0

這裏沒有足夠的信息,但我會冒險猜測,您是從線程1「通過」對象使用隊列主題2,你正在運行的內存,因爲線程1產生「對象」比螺紋快2能夠使用它們(將它們寫入數據庫)。

如果確實如此,您可以自己限制隊列的大小,或者使用具有預定義容量的LinkedBlockingQueue之類的東西。你也可以通過創建更多的Thread 2實例來提高速度(假設它們的工作可以並行執行),但是如果瓶頸是數據庫,那麼你可能做的很少。

+0

謝謝你爲你的答案。是的,你的猜測是正確的,那正是發生了什麼事情。我的問題是試圖瞭解當線程2完成將它們保存到數據庫時,在線程1中創建並在線程2中使用的對象是否可以GC化。或者這些對象是否完全依賴於線程1 – user2163389