什么是OutOfMemoryError以及如何调试和修复它

Rae*_*ald 5 java exception out-of-memory

我的Java程序扔了一个OutOfMemoryError.如何调试并修复此问题?


Java的许多新手都在努力应对OutOfMemoryError.这是尝试创建一个规范问题,该问题将回答有关问题的最常见问题OutOfMemoryError.我正在创建这个新问题,而不是调整之前关于a的众多问题之一,OutOfMemoryError因为这些问题及其答案与一个人的特定问题紧密相关.

Rae*_*ald 10

An OutOfMemoryError是Java虚拟机(JVM)抛出的异常,因为它需要为(新)对象分配内存,但对象可用的内存不足.JVM首先尝试通过运行垃圾收集器来释放死对象使用的内存.

作为一个OutOfMemoryErrorVirtualMachineError,在JVM被允许在把它任何时候,但必须设法通过垃圾收集首先要释放内存.

但是,实际上很可能会从new试图创建无法分配内存的对象的语句中抛出.因此,您应首先检查与异常关联的堆栈跟踪,以获取有关问题原因的线索,就像对任何其他异常一样.

  • 如果从尝试分配数组(例如int[] values = new int[n])中抛出异常,原因可能是您尝试创建一个过大的数组(n太大).你在计算你需要的数组大小时犯了错误吗?
  • 如果尝试在由其他人编写的容器类的方法中分配数组而引发异常,则原因可能是您的代码要求容器存储过多的东西.诸如ArrayList.reserve(int)并且HashMap(int)必须分配存储以供将来使用的方法.你在计算所需容器的大小时犯了错误吗?
  • 如果从循环内部抛出异常,原因可能是代码循环次数太多.您的循环终止条件是否正确?如果它是一个for循环,你要求它循环正确的次数?

如果堆栈跟踪没有提供足够的线索,您可以尝试使用堆分析器.这是一个监视程序,使您可以在程序运行时检查用于对象的内存,或检查程序退出时写入的堆转储.它可以提供有关存储在内存中的对象的大小,数量和类别的信息.

JVM具有可用的有限内存量.您可能会得出结论,您的程序运行正常,但只需要运行的内存比可用的内存多.如果您没有明确告诉JVM要使用多少内存,大多数实现将根据您的计算机具有的RAM量选择合理的默认值,但该数量对于您的程序来说可能太小.JVM的命令行选项可以控制可用内存量.对于大多数JVM实现,其中最重要的选项是-Xmx-Xms.


Chr*_*ung 7

要调试OutOfMemoryError,请使用-XX:+HeapDumpOnOutOfMemoryError选项调用JVM ,这将导致在发生堆时转储堆转储OutOfMemoryError.然后使用VisualVM,jhatfasthat之类的工具查看堆转储.

您还可以使用带有该选项的jmap随时手动生成堆转储-dump.

披露:我是fasthat的维护者,这是一个jhat的分支.


归档时间:

查看次数:

2321 次

最近记录:

6 年,7 月 前