【问题标题】:How do I predict when I'm going to run out of memory我如何预测我什么时候会耗尽内存
【发布时间】:2011-07-06 03:01:59
【问题描述】:

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

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

【问题讨论】:

  • 不要查看可用内存;只需查看总内存并了解您的程序的“基线”。因此,如果在这些计算之前您通常为 50M(例如),总内存为 500M(例如),您可以预期 450M 可用
  • 另一个要考虑的问题:空闲内存/总内存/最大内存没有考虑到您的分配需要连续的事实(假设 jvm 和 clr 在这方面是相似的)。

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


【解决方案1】:

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

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

【讨论】:

  • +1 - 但请注意,您不能真正强制进行垃圾收集,您可以提示一下。
  • 这也是我们的想法,但我担心的是正如卢卡斯所说,垃圾收集器不能保证运行。
  • @Jay:你是对的,它不能保证运行,但在这种情况下“纾困”仍然比处理 OutOfMemoryError 更容易
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    我没有这方面的专业知识,但我觉得您可以使用ASM 采取额外的字节码分析步骤来抢占空指针异常、内存不足异常等错误。

    【讨论】:

    • 是的,AFAIK 我以前的雇主(最大的 Java 商店之一)在他们的生产机器上使用字节码分析。但是,这就是我所知道的。不幸的是,没有与那个团队合作。
    猜你喜欢
    • 1970-01-01
    • 2011-10-01
    • 2014-01-12
    • 1970-01-01
    • 1970-01-01
    • 2010-11-09
    • 2010-09-15
    • 1970-01-01
    • 2017-04-06
    相关资源
    最近更新 更多