编译文件时内存不足异常

时间:2012-09-26 10:00:57

标签: java out-of-memory

 Compilefile.this.compileThread = new Thread() {
    @Override
    public void run() {
        try {
            synchronized (this) {
                Application.getDBHandler().setAutoCommit(false);
                MIBParserUtils.getDefaultMibsMap();
                compileSelectedFiles();
                Application.getDBHandler().CommitTrans();
                Application.getDBHandler().setAutoCommit(true);
            }
        }
        catch(OutOfMemoryError exp) {
            JOptionPane.showMessageDialog(null, "Compilation Stopped.. Insufficient Memory!!!");
            CompileMib.this.compileThread.interrupt();
            System.gc();

            dispose();
            NmsLogger.writeDebugLog(exp);   
        }
        finally {
        }
    }

我试图在一个线程中编译一些文件。 UI选择要编译的200多个文件。在编译期间,由于Eclipse中有足够的内存,因此发生了OutOfMemoryError。我想停止线程并显示一个消息框并在我的应用程序中处理编译窗口。我写了下面的代码,但它不起作用。我可以捕获异常并处理它,还是有更好的解决方案?

3 个答案:

答案 0 :(得分:1)

  

我可以在catch块中处理异常吗?

你当然能抓到一个OOME。但成功恢复完全是另一回事。本回答讨论了一些问题:https://stackoverflow.com/a/1692421/139985

另一件需要考虑的事情是OOME可能会被抛到另一个线程上:

  • compileSelectedFiles()方法或其他方法之一可以在另一个线程上进行工作并将OOME抛给那里。

  • 可能会在Eclipse的一个后台线程上抛出OOME。

在任何一种情况下,catch显然都无法捕捉到它。

值得注意的是,在OOME之后调用System.gc()是浪费时间。我可以保证它不会释放任何无法释放的内存。您所做的只是建议 JVM浪费时间在无用的东西上。如果幸运的话,JVM将忽略该建议。


我的建议是通过更改eclipse.ini文件中的-Xmx JVM参数来增加Eclipse的堆大小。

答案 1 :(得分:1)

几乎总是没有可靠的方法从OOM中恢复,因为你试图放入catch块的任何东西都需要更多的内存,这是不可用的。在OOM被抛出之前,GC已经尝试过了,所以再次问他是没有意义的。

与往常一样,您可以通过Xmx选项增加应用程序可用的内存量,也可以修复应用程序,而不需要太多内存。

另一个可能的错误来源是内存泄漏。在这种情况下,只有一个行动方案:找到并修复它。 Plumbr可以提供帮助。

答案 2 :(得分:0)

您是否尝试将以下内容添加到eclipse.ini(与eclipse.exe位于同一文件夹中):

-Xmx1024m

这增加了Eclipse可用的堆空间。如果您的问题是在编译期间,这可能会解决它。它提供1GB的内存作为堆空间限制。如果您不想分配相当多的空间,请尝试-Xmx512m