2015-09-02 151 views
1

我正在閱讀大文件(〜1 GB)到字節數組。然後我正在對它們執行各種讀取操作。不幸的是,我似乎遇到了內存問題。甚至有足夠的內存OutOfMemoryError

searchButton.addActionListener(new ActionListener() 
{ 
    public void actionPerformed(ActionEvent searchPerformed) 
    { 
     searchButton.setEnabled(false); 
     resultsArea.setText(""); 

     new SwingWorker<String, String>() 
     { 
      @Override 
      protected String doInBackground() throws Exception 
      { 
       readFilesAndProcessThem(); 

       return null; 
      } 

      @Override 
      public void done() 
      { 
       searchButton.setEnabled(true); 
      } 
     }.execute(); 
    } 
}); 

應用程序只根據Task Manager但執行一直太早停止消耗最多的RAM 3.5 GB。搜索開始後,搜索按鈕會變爲灰色,但不久之後會再次變爲啓用狀態。爲什麼已經調用done()方法? SwingWorker中的代碼不會引發異常,也不會完成。

爲了解決內存問題,我已經在Eclipse中添加了VM參數-Xmx,以允許更多內存並將其設置爲類似於10G的內容。我的電腦有10 GB可用的RAM,JVM可以使用它,但我的應用程序無法正常運行。

當我關閉應用程序(而不是完整的異常跟蹤)時,有時會在命令行上看到一條紅色線條OutOfMemoryError。這種奇怪的行爲如何解釋/解決?

我在運行Jar文件和VM argument-Xmx10G時遇到同樣的問題。結果不是100%確定性的,但通常停在同一個確切位置。除了SwingWorker之外,我沒有使用併發性。

+0

您使用的是哪種JRE版本(Oracle,OpenJDK,IBM等)?根據哪個版本,默認GC算法的行爲及其內存模型可能會提供一些線索。例如,如果它是一個世代模型,可以在其中一個世代領域獲得OOM,這意味着您可能需要調整默認大小。全部取決於您使用的是哪個JDK版本。此外,-verbose:gc可能會提供一些額外的線索 –

+1

您正在使用32位JRE還是64位JRE?一個32位JRE不能使用超過3.5GB左右。 – dsh

+0

請包括'readFilesAndProcessThem'的源代碼,作爲問題的最可能的罪魁禍首 – lolski

回答

0

您可能正在使用32位版本的Java運行時環境,請安裝x64版本並且它應該可以正常工作。

+0

在我看來,答案是一個糟糕的地方,把最終的評論 – Cubic

+0

不,我使用的是64位版本 – BullyWiiPlaza

相關問題