2012-09-26 53 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選擇您的應用程序,或修復您的應用程序它不要求那麼多的記憶。

另一個可能的錯誤來源是內存泄漏。在這種情況下,只有一個行動方案:找到並修復它。​​可以幫助。