OutOfMemoryError使用timertask时的Java堆空间

时间:2013-11-22 15:18:59

标签: java multithreading out-of-memory

这很奇怪:当我使用timer.scheduleAtFixedRate启动计划时,需要很长时间然后抛出OutOfMemoryError: Java heap space,但如果我刚刚在主线程中调用timerTask.run()方法,它工作得很好。

我调用的方法不是开源的,所以我不能把它粘贴出去。但任何人都可以帮助我分析这种情况下的一些可能性。在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

1 个答案:

答案 0 :(得分:0)

AWT计时器在自己的线程中运行。 如果“主线程”是指UI线程或事件队列,则然后:

也许你的封闭源代码正在访问Swing。只能从事件线程访问Swing组件。在计时器中运行时可能会遇到问题,但在主线程中运行正常。

如果是这样的话你很幸运。从另一个线程调用Swing通常有效。在我演示或客户端尝试使用它之前,我从来没有遇到任何问题。问题往往不可重复。