检测OutOfMemory以查找该异常情况

时间:2011-12-18 03:38:15

标签: java

我有一个程序为目录(子)树中的每个文件创建一个对象。在更大和更大磁盘的这些日子里,没有办法知道将会有多少文件,尤其是。从现在开始不是几年(几个月?)

我的计划不是企业级的;它是用户分析该子树的工具。因此,可以告诉用户此环境中没有足够的内存来操作该子树。他可以通过选择该子树的子树来做他想做的事。

但程序只能死,或抛出堆栈跟踪,或者只有程序员才能喜欢的其他东西是不可接受的。我希望该程序能够给用户一些合理的反馈,并让他控制他对此的所作所为。

我已经在StackOverflow上阅读了一些关于OOM异常的帖子,主要是我同意一些观点:设计糟糕的应用程序,内存泄漏等都是需要考虑的问题。但在这种情况下,我可能有人试图在10T磁盘上使用我的工具,该磁盘只有比准备分析的程序更多的文件。而且我不是要编写工具,以便它可以在每个可能的子树上运行。

我已经看到过OOM可以像其他任何例外一样被捕获的建议;不幸的是,这不是一种强有力的做事方式。当OOM被抛出时,某些线程可能已经死亡,我们无法判断它将是哪一个,我们无法重启它。因此,如果它恰好是Swing的一个关键因素,那么我们就不走运了。

所以我目前的想法是,我的程序需要偶尔看看(至少)可用的可用内存量,如果低于某个阈值则自行停止。我可以测试一些东西,以确定一个阈值,允许我输出一个带有消息的对话框,然后擦除我对所有对象的引用。

但如果我错过了什么,或者有更好的方法可以解决问题,我想知道。

1 个答案:

答案 0 :(得分:1)

查看我的帖子here。为什么不在填充树时计算freeMemory,并在某些(可能是用户可配置的)点停止:90%堆占用。您应该尽量保持为每个文件创建的对象尽可能小。你可以粘贴这个数据结构的代码,这样我们就可以对它进行批评,看看它是否可以缩小?也许您不需要直接拥有对象,而是需要根据请求获取相关信息的代理对象。