2013-11-22 89 views
-1

時,這是奇怪的:當我開始使用timer.scheduleAtFixedRate時間表,這需要很長的時間,然後拋出OutOfMemoryError: Java heap space,但如果我只是叫timerTask.run()方法在主線程,它工作得很好。的OutOfMemoryError Java堆空間使用的TimerTask

我調用的方法不是開源的,所以我不能把它粘貼出來。但任何人都可以幫助我分析這種情況下的一些可能性。在timerTask線程中運行它並在主線程中運行它有什麼區別?

非常感謝!

的代碼片段只是如下簡單:

Timer timer = new Timer(); 
TimerTask task = new TimerTask() { 
    @Override 
    public void run() { 
     AModule.load(tmpFilePath); //not open-source 
    } 
} 
timer.scheduleAtFixedRate(task, new Date(), 1*60*1000); //OOME 
//If I change the upper code to: 
task.run() //it just works fine 
+0

顯示您的代碼,以便我們可以重現問題 – Masudul

+2

嘗試分析我們無法看到的代碼是一個有缺陷的前提。 –

+0

爲我們發佈一些代碼。也許檢查遞歸調用或內存持久實例(完成/關閉資源,大對象等)。 – LastFreeNickname

回答

0

AWT的計時器在自己的線程中運行。 如果「主線」你的意思是在UI線程或事件隊列,然後

也許你的封閉源代碼的訪問搖擺一些如何。 Swing組件只能從事件線程訪問。在計時器中運行時可能會遇到麻煩,但在主線程中始終運行正常。

如果是這種情況,你很幸運。從另一個線程調用Swing通常會起作用。直到演示或客戶端嘗試使用它時,我纔會遇到問題。這些問題往往不可重複。

+0

沒有'盪鞦韆'兄弟。我只是使用彈簧和命令行來運行我的代碼。 – Judking

+0

@評論:值得一試。嗯。我仍然認爲計時器線程是問題。您是否在主線程上運行了其他可能與您在計時器中運行的代碼交互的代碼? (可能不是線程安全的?)特別是,如果主線程中的代碼在同步塊之外設置非易失性字段值,則計時器_中的代碼將看到舊的值_。如果它設置的值應該沒問題,然後啓動計時器,但如果啓動計時器然後設置該值,則每個線程_can_都有其自己的值。 (你需要在這裏開源!) – RalphChapin

+0

這並不複雜,測試代碼幾乎與我上面的代碼段相同。哦,在這個問題上有一些進展:當我在VM參數中設置-Xmx1024M時,在使用timertask時它工作正常。 – Judking

相關問題