我正在Java 5上编写一个客户端Swing应用程序(图形字体设计器).最近,我遇到了错误,因为我对内存使用情况并不保守.用户可以打开无限数量的文件,程序将打开的对象保存在内存中.经过快速研究后,我在5.0 Java虚拟机中找到了人体工程学,其他人在Windows机器上说JVM默认最大堆大小为.java.lang.OutOfMemoryError: Java heap space64MB
鉴于这种情况,我该如何处理这种约束?
我可以使用java的命令行选项增加最大堆大小,但这需要找出可用的RAM并编写一些启动程序或脚本.此外,增加到一些有限的最大值并不能最终摆脱这个问题.
我可以重写我的一些代码来经常将对象持久化到文件系统(使用数据库是一回事)来释放内存.它可以工作,但它可能也很重要.
如果您可以向我指出上述想法的细节或某些替代方案,如自动虚拟内存,动态扩展堆大小,这将是很好的.
文档的java.lang.Error说:
Error是Throwable的子类,表示合理的应用程序不应该尝试捕获的严重问题
但是作为java.lang.Error子类java.lang.Throwable,我可以捕获这种类型的Throwable.
我明白为什么抓住这种例外不是一个好主意.据我所知,如果我们决定捕获它,catch处理程序不应该自己分配任何内存.否则OutOfMemoryError将再次抛出.
所以,我的问题是:
java.lang.OutOfMemoryError可能是一个好主意?java.lang.OutOfMemoryError,我们怎么能确定catch处理程序本身不分配任何内存(任何工具或最佳实践)?我正在开发一个需要大量内存的程序,我想在发生内存不足异常时捕获.我听说这是不可能做到的,但是如果在这方面有任何发展,我很好奇.
一般的建议是你不应该捕获java.lang.Error,除非在特殊情况下,请参阅捕获Throwable是不好的做法?例如.
我的情况是我有一个程序有时耗尽内存并抛出java.lang.OutOfMemoryError.虽然没有从中恢复但我确实想知道它发生了,所以我希望在日志中看到一些东西和非零退出代码.那么这样的建议是什么?
public static void main(String[] args)
{
try
{
...
}
catch (Exception e)
{
e.printStackTrace();
System.exit(1);
}
catch (OutOfMemoryError e)
{
e.printStackTrace();
System.exit(1);
}
}
Run Code Online (Sandbox Code Playgroud)
另一个程序是类似的,除了它可能是消耗所有内存的一个特定线程.在这种情况下,如果该线程退出,则可以继续处理,我真正想要的只是查看日志并最终具有非零退出代码.那么我应该在那个线程运行方法中捕获OutOfMemoryError吗?