Java 即使内存足够,OutOfMemoryError也会出错

Java 即使内存足够,OutOfMemoryError也会出错,java,out-of-memory,Java,Out Of Memory,我正在将大文件(~1GB)读入字节数组。然后我对它们执行各种读取操作。不幸的是,我遇到了内存问题 searchButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent searchPerformed) { searchButton.setEnabled(false); resultsArea.setText("");

我正在将大文件(~
1GB
)读入字节数组。然后我对它们执行各种读取操作。不幸的是,我遇到了内存问题

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();
    }
});
searchButton.addActionListener(新ActionListener()
{
已执行的公共无效操作(已执行的操作事件搜索)
{
searchButton.setEnabled(false);
结果区域setText(“”);
新SwingWorker()
{
@凌驾
受保护的字符串doInBackground()引发异常
{
readfilesandprocessem();
返回null;
}
@凌驾
公众假期结束()
{
searchButton.setEnabled(true);
}
}.execute();
}
});
根据
任务管理器
,应用程序最多只消耗
3.5 GB
内存,但执行总是过早停止。搜索按钮在开始搜索时变为灰色,但不久后再次启用。为什么已经调用了
done()
方法?
SwingWorker
中的代码不会引发异常,也没有完成

为了解决内存问题,我已经在中添加了VM参数
-Xmx
,以允许更多内存,并将其设置为类似
10G
。我的计算机有
10gb
的可用内存,允许JVM使用所有可用内存,但我的应用程序仍不能正常运行

有时,当我关闭应用程序时,我会在命令行上看到一条红线,上面写着
OutOfMemoryError
(不是完整的异常跟踪)。如何解释/纠正这种奇怪的行为


当作为
Jar
文件和
VM参数运行时,我遇到了相同的问题。结果不是100%确定的,但它通常停在同一个精确点。除了SwingWorker之外,我没有使用并发。您可能正在使用32位版本的Java运行时环境,安装x64版本,它应该可以工作。

您可能正在使用32位版本的Java运行时环境,安装x64版本,它应该可以工作。

您使用的JRE版本是什么(是Oracle、OpenJDK、IBM等)?根据哪个版本,默认GC算法的行为及其内存模型可能会提供一些线索。例如,如果它是一个世代模型,则可能在其中一个世代区域中获得OOM,这意味着您可能需要调整默认大小。这一切都取决于您使用的JDK版本。另外,-verbose:gc可能会提供一些额外的clues您使用32位JRE还是64位JRE?32位JRE的使用量不能超过3.5GB左右。请将
readFilesAndProcessThem
的源代码作为问题的最可能原因。我正在使用Oracle的JDK for Windows 64位:您使用的JRE版本是什么(是Oracle、OpenJDK、IBM等)?根据哪个版本,默认GC算法的行为及其内存模型可能会提供一些线索。例如,如果它是一个世代模型,则可能在其中一个世代区域中获得OOM,这意味着您可能需要调整默认大小。这一切都取决于您使用的JDK版本。另外,-verbose:gc可能会提供一些额外的clues您使用32位JRE还是64位JRE?32位JRE的使用量不能超过3.5GB左右。请包括
readFilesAndProcessThem
的源代码,作为问题的最可能原因。我正在使用Oracle的JDK for Windows 64位:在我看来,答案不适合放在最后的注释中。不,我使用的是64位版本。在我看来,答案是一个不好的地方来放置最终的注释。不,我使用的是64位版本