我怎么预测我什么时候会用完内存

时间:2011-02-28 22:38:08

标签: java memory-management out-of-memory

我们有一个基于swing的应用程序,可以对数据进行复杂的处理。我们软件的先决条件之一是任何给定的列都不能有太多的唯一值。如果数字是数字,则用户需要先将数据离散化,然后才能使用我们的工具。

不幸的是,我们使用的算法在内存中是组合昂贵的,这取决于每列的唯一值的数量。现在使用错误的数据集,应用程序将很快耗尽内存。在执行其中一个内存不足的操作之前,我们应该能够大致计算出操作需要多少内存。如果我们可以检查应用程序当前正在使用多少内存,估计应用程序是否将耗尽内存,并相应地显示错误消息而不是耗尽内存,那将是很好的。使用java.lang.Runtime,我们可以找到空闲内存,总内存和最大内存,但这真的有用吗?即使看起来我们没有足够的堆空间,也许如果我们等待30毫秒垃圾收集器将运行,突然我们有足够的堆空间来运行我们的操作。反正真的可以预测我们是否会耗尽记忆力吗?

3 个答案:

答案 0 :(得分:2)

我为数据库应用程序做了类似的事情,无法估计加载的行数。因此,在处理结果集的循环中,我正在调用一个“MemorWatcher”方法来检查可用的内存。

如果可用内存低于某个阈值,观察者将强制进行垃圾收集并重新检查。如果仍然没有足够的内存,则观察者方法会向调用者发出异常信号。调用者可以从该异常中优雅地恢复 - 而不是OutOfMemoryException,这有时会使Swing完全不稳定。

答案 1 :(得分:0)

我没有这方面的专业知识,但我觉得你可以使用ASM进行额外的字节码分析,以抢占空指针异常,内存异常等错误。

答案 2 :(得分:0)

除非你从一开始就使用你需要的最大内存量运行你的应用程序(使用-Xms)我不认为你可以实现任何有用的东西,因为其他应用程序将能够在你的应用程序之前消耗内存需要它。

您是否考虑过使用Soft / WeakReferences,让垃圾收集能够获得可以动态重新计算/重新生成的对象?