我正在閱讀大文件(〜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
之外,我沒有使用併發性。
您使用的是哪種JRE版本(Oracle,OpenJDK,IBM等)?根據哪個版本,默認GC算法的行爲及其內存模型可能會提供一些線索。例如,如果它是一個世代模型,可以在其中一個世代領域獲得OOM,這意味着您可能需要調整默認大小。全部取決於您使用的是哪個JDK版本。此外,-verbose:gc可能會提供一些額外的線索 –
您正在使用32位JRE還是64位JRE?一個32位JRE不能使用超過3.5GB左右。 – dsh
請包括'readFilesAndProcessThem'的源代碼,作爲問題的最可能的罪魁禍首 – lolski