2012-09-26 54 views
3
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

一旦达到OOM状态,有一个在应用程序的状态没有保证。所有投注都关闭。 –

+0

你不能在eclipse.ini中为eclipse jvm设置更多内存吗? – kamuflage661

+0

我可以处理catch块中的异常吗? – Nikhil

回答

1

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

你当然可以捕捉到一个OOME。但成功恢复是另一回事。本答案讨论了一些问题:https://stackoverflow.com/a/1692421/139985

另一个要考虑的是,OOM​​E可能会被扔在不同的线程:

  • compileSelectedFiles()法或其他方法可以做另一个线程的工作和投掷OOME那里。

  • OOME可能会被引发到Eclipse的后台线程之一。

在这两种情况下,那catch显然不会捕捉它。

值得注意的是,在OOME之后调用System.gc()是浪费时间。我可以保证它不会释放任何不会被释放的内存。你所做的全部是,建议即JVM浪费时间的东西,不会帮忙。如果幸运的话,JVM会忽略这个建议。


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

+0

从我的答案相同的基本建议,但有很多额外的帮助信息:) – Ren

0

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

-Xmx1024m

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

1

有几乎总是由OOM恢复没有可靠的方法,因为什么,你尝试投入catch块需要更多的内存,这是不可用的。在OOM投放之前,GC已经尽力了,所以没有必要再问他了。

与往常一样,你可以增加可用内存量通过XMX选择您的应用程序,或修复您的应用程序它不要求那么多的记忆。

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