我有一個運行方法的類,並且在類的主要方法定時器調用與該代碼的類:的ThreadPoolExecutor OutOfMemoryException異常
Timer timer = new Timer();
timer.scheduleAtFixedRate(new LegacySmsSender(), 0, 2*1000);
在運行方法
,我聲明一個ThreadExecutorPool:
ThreadPoolExecutor packetProcessorThreadPool =
new ThreadPoolExecutor(4,
4,
Long.MAX_VALUE,
TimeUnit.DAYS,
new LinkedBlockingQueue<Runnable>(),
new MyThreadFactory("packetProcessorThreadPool")
);
我創建4個PacketProcessors與new PacketProcessor()
做packetProcessorThreadPool.submit
並保持其Future
返回一個列表。那我等他們都在一個循環中完成:
for(Future<?> f:packetProcessorList)
{
System.out.println("before f.get() "+new Date());
f.get();
}
而那些PacketProcessor類的run方法裏面,他們宣佈的ThreadPoolExecutor和創建和數量1-5000之間提交線程(其通常創建6-7線程),並在PacketProcessor的ThreadPoolExecutor的代碼是這樣的:
ThreadPoolExecutor commonThreadPool =
new ThreadPoolExecutor(
20,
20,
Long.MAX_VALUE,
TimeUnit.DAYS,
new LinkedBlockingQueue<Runnable>(),
new MyThreadFactory("commonThreadPool"));
,並在結束時,我跑了一段20分鐘,我檢查的VisualVM,我的內存使用情況和活動線程數量的增加,所有的時間。問題是什麼 ?
注:請毫不猶豫地問我要更多信息或問題
這裏是一些信息截圖:
編輯1:
我270 MB的堆轉儲。我發現了160MB的char []。我發現像1000-20000個查詢字符串。我使用StringBuilder構建查詢字符串。爲什麼他們沒有得到GCed?
我試圖使用它們作爲靜態,但它根本沒有改變這個分析器上的圖像。活動線程永不減少的原因是什麼? – kommradHomer