2011-07-05 30 views
0

我有一個多線程應用程序可以獲取不同的網頁。爲此,我在線程之間設計了父子關係。 家長只是從其頁面採取不同的網址,併產生新的線程。這些線程持續不斷地獲取頁面,直到頁面更改。主線程輪詢每2分鐘在主頁的變化(並創建新的線程,如果有任何變化)算法中多線程應用程序在3天后停止

while(true){ 
    find_new_instances(...); 
    if we get any new, then 
     Thread.start(...); 
    Thread.sleep(120000); 
} 

主線程具有存儲的URL字符串數組列表

主線程它創建的每個新線程。我聽說線​​程應該只使用不可變對象進行寫操作。這裏使用的可變列表是否會導致問題? 在子線程中,會執行諸如頁抓取和數據庫插入之類的活動。

然而,應用逐步增加對內存的需求,並最終死鎖/餓死進入凍結狀態或內存不足,如果沒有。的線程太大。 我無法嘗試任何東西。如果您遇到類似問題,請提出建議。

+0

什麼的線程數?這個循環會在很短的時間內創建很多線程,並讓它們每個都睡很長時間。對我來說沒什麼意義... – Random

+0

@Random:線程數大約爲50(其他人被創建和銷燬) – Sumit

+0

@nos:線程之間沒有數據共享,只有父/主線程保持運行線程數 – Sumit

回答

1

我遇到了類似的類型問題,而我正在開發一個基於GUI的應用程序。

原因崩潰

  • 創建一個線程池。在您的應用程序中使用可用的線程 。 你不能創造無限的線程 ,這將導致你的 應用
  • 崩潰可能是你正在創造新的 對象(或字符串)和存儲 數據如果可能使用相同的對象 賦值。如果數據很長 您可以存儲在文件或數據庫中。 而不是保持數據始終
+0

我目前沒有使用共享池,但會嘗試一下。此外,我應該直接停止線程還是讓他們睡覺並繼續迭代直到他們的工作結束?數據存儲在數據庫中(這不是一個問題,因爲它已經單獨測試過) – Sumit

+0

正如我所說的,它使用線程池避免內存泄漏的可能性很小,但它也是一個好主意。 –

0

您有內存泄漏。當你用完內存並分析它來查看泄漏的位置時,我建議你採取堆轉儲。

自動觸發堆轉儲,您可以使用選項

-XX:+HeapDumpOnOutOfMemoryError 

也許

-XX:HeapDumpPath=/path/to/heap/dumps 

如果你想工作者線程池,我建議你使用的ExecutorService甚至ScheduledExecutorService以定期執行任務。 (然而,這是不太可能你的問題)

1

如果我明白你的問題所在,那麼你可以通過設置老線程值設置爲null,並預成型爲GC()bypasse的內存不足錯誤

+0

分析後,我解決了內存問題,但內存需求仍然持續增加(從最初的20MB開始到運行一天後約250 MB) – Sumit

+0

如果使用的內存繼續擴大,您仍然有某種資源泄漏,內存,線程,句柄正在分配,並且在您完成操作後永遠不會處理。 –

+0

這取決於內存在哪裏。內存是存儲在短期還是長期的堆存儲中,還是存儲在perm gen中(儘管不太可能)?如果你有-Xmx來說256mb或者其他一些大的數字,它通常會增加而不做任何劇烈的垃圾回收,所以很多使用過的內存可能是垃圾。 – Joseph