如何配置JVM等待抛出OutOfMemoryError

时间:2010-12-20 03:47:59

标签: java garbage-collection jvm

如何等待垃圾收集器而不是JVM抛出OutOfMemoryError?是否有一些JVM或其他选项的设置(如代码实践)?

我不想进入JVM内存设置或调整GC - 只等待没有OutOfMemoryError的GC因为我知道没有内存泄漏,只是垃圾阻止了新的分配。

2 个答案:

答案 0 :(得分:4)

我担心,你的问题没有多大意义。

在运行GC之后,通常会抛出一个OutOfMemoryException ,并且在回收足够的内存以便您继续操作时失败。等待GC(再次)运行不太可能有所帮助。如果它没有帮助,结果是你的应用程序将冻结。

此外,没有办法做到这一点。

答案 1 :(得分:3)

您可以调整JVM放弃并抛出OOM的阈值,但这是JVM在检测到垃圾收集未完成任何操作时通过设计进行的操作。请注意,JVM不会因为时间错误而抛出OOM,或者仅因为您创建了大量对象。它会检测到它已反复运行GC并且GC没有释放任何大量内存。

一些可能性:

  1. 您永久使用大量内存。这不一定是内存泄漏,也许你只是加载了一些巨大的数据,并没有意识到内存有多大。
  2. 您有内存泄漏或者您更喜欢“以意想不到的方式使用内存”。 Java提供了许多容易丢失内存的地方。我已被JSON库中的ThreadLocal缓存杀死,并且在适当时无法调用新的String(字符串)。
  3. 临时数据正在漂移到PermGen,因为它不是那么临时的行为。
  4. 你没有任何大问题,但你正在推动你分配的内存量并且你没有正确调整。打开并发标记清除垃圾收集器,打开GC日志记录,查看行为是否符合您对应用程序正在执行的操作的预期。
  5. 最后,运行一个分析器来查看你正在使用的内存。任何程序的第一次迭代几乎总是有很大的低成果来清理。