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
。我想停止线程并显示一个消息框并在我的应用程序中处理编译窗口。我写了下面的代码,但它不起作用。我可以捕获异常并处理它,还是有更好的解决方案?
答案 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
。