Java 如何将JVM配置为等待而不是抛出OutOfMemoryError

Java 如何将JVM配置为等待而不是抛出OutOfMemoryError,java,garbage-collection,jvm,Java,Garbage Collection,Jvm,如何等待垃圾收集器而不是JVM抛出OutOfMemoryError?是否有一些JVM或Otherr选项的设置(如代码实践) 我不想刺激JVM内存设置或调优GC-只等待GC,而不出现OutOfMemoryError,因为我知道没有内存泄漏,只是垃圾阻止了新的分配。恐怕你的问题没有多大意义 OutOfMemoryException通常在GC运行并且未能成功回收足够的内存以继续运行后引发。等待GC(再次)运行不太可能有帮助。如果它没有帮助,结果是你的应用程序将被冻结 此外,没有办法做到这一点。恐怕你的

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


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

恐怕你的问题没有多大意义

OutOfMemoryException通常在GC运行并且未能成功回收足够的内存以继续运行后引发。等待GC(再次)运行不太可能有帮助。如果它没有帮助,结果是你的应用程序将被冻结


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

恐怕你的问题没有多大意义

OutOfMemoryException通常在GC运行并且未能成功回收足够的内存以继续运行后引发。等待GC(再次)运行不太可能有帮助。如果它没有帮助,结果是你的应用程序将被冻结


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

您可能可以调整JVM何时放弃并抛出OOM的阈值,但这是JVM在检测到垃圾收集没有完成任何事情时根据设计所做的。请注意,JVM不会抛出OOM,因为时间安排不好,或者仅仅因为您创建了很多对象。它将检测到它已重复运行GC,并且GC未释放任何大量内存

一些可能性:

  • 您正在永久性地使用大量内存。这不一定是内存泄漏,也许你只是加载了一些大数据,却没有意识到它在内存中有多大
  • 您有内存泄漏,或者您更喜欢“以意外方式使用内存”。Java提供了许多容易丢失内存的地方。我被JSON库中的ThreadLocal缓存杀死,并且在适当的时候调用新字符串(String)失败
  • 临时数据正在漂移到PermGen中,因为它并不完全是临时的
  • 您没有任何大的问题,但是您已经分配了大量的内存,并且没有进行适当的调优。打开并发标记清理垃圾收集器,打开GC日志记录,查看行为是否符合您对应用程序正在执行的操作的期望

  • 最后,运行一个探查器来查看您正在使用的内存。任何程序的第一次迭代几乎总是会有巨大的、悬而未决的结果需要清理。

    您可能可以调整JVM何时放弃并抛出OOM的阈值,但这是JVM在检测到垃圾收集没有完成任何事情时的设计。请注意,JVM不会抛出OOM,因为时间安排不好,或者仅仅因为您创建了很多对象。它将检测到它已重复运行GC,并且GC未释放任何大量内存

    一些可能性:

  • 您正在永久性地使用大量内存。这不一定是内存泄漏,也许你只是加载了一些大数据,却没有意识到它在内存中有多大
  • 您有内存泄漏,或者您更喜欢“以意外方式使用内存”。Java提供了许多容易丢失内存的地方。我被JSON库中的ThreadLocal缓存杀死,并且在适当的时候调用新字符串(String)失败
  • 临时数据正在漂移到PermGen中,因为它并不完全是临时的
  • 您没有任何大的问题,但是您已经分配了大量的内存,并且没有进行适当的调优。打开并发标记清理垃圾收集器,打开GC日志记录,查看行为是否符合您对应用程序正在执行的操作的期望
  • 最后,运行一个探查器来查看您正在使用的内存。任何程序的第一次迭代几乎总是会有巨大的低垂果实需要清理