什么是OutOfMemoryError以及如何调试和修复它 [英] What is an OutOfMemoryError and how do I debug and fix it
问题描述
我的Java程序抛出了 OutOfMemoryError
。如何调试并修复此问题?
My Java program threw an OutOfMemoryError
. How do I debug and fix this problem?
Java的许多新手都在努力应对的OutOfMemoryError
。这是尝试创建一个规范问题,该问题将回答有关 OutOfMemoryError
的最常见问题。我正在创建这个新问题,而不是调整之前关于 OutOfMemoryError
的众多问题之一,因为这些问题及其答案紧密耦合到特定的一个人有问题。
Many newcomers to Java struggle to cope with an OutOfMemoryError
. This is an attempt to create a canonical question that will answer the most frequently asked questions about an OutOfMemoryError
. I'm creating this new question, rather than adapting one of the numerous previous questions about a OutOfMemoryError
because those questions and their answers are tightly coupled to the particular problem a person had.
推荐答案
OutOfMemoryError
是一个例外由Java虚拟机(JVM)抛出,因为它需要为(新)对象分配内存,但对象可用的内存不足。 JVM首先尝试通过运行垃圾收集器。
An OutOfMemoryError
is an exception thrown by the Java Virtual Machine (JVM) because it needs to allocate memory for a (new) object, but insufficient memory is available for the object. The JVM will have first tried to free memory used by dead objects, by running the garbage collector.
作为 OutOfMemoryError
是 VirtualMachineError
,允许JVM 把它扔到任何时间,虽然它必须尝试通过垃圾收集首先释放内存。
As an OutOfMemoryError
is a VirtualMachineError
, the JVM is permitted to throw it at any time, although it must try to release memory through garbage collection first.
然而,实际上很可能从一个 new
语句抛出,该语句试图创建一个无法分配内存的对象。因此,您应首先检查与异常相关的堆栈跟踪,以获取有关问题原因的线索,就像你对任何其他例外一样。
However, in practice it is likely to be thrown from a new
statement that tried to create an object for which memory could not be allocated. Therefore, you should first examine the stacktrace associated with the exception for clues about the cause of the problem, as you would for any other exception.
- 如果从尝试分配数组抛出异常(例如
int [] values = new int [n]
),原因可能是您正在尝试创建一个过大的数组(n
太大)。您是否在计算所需数组的大小时犯了错误? - 如果尝试在由其他人编写的容器类的方法中分配数组而引发异常原因可能是你的代码要求容器存储过多的东西。诸如
ArrayList.reserve(int)
和HashMap(int)
之类的方法必须分配存储以供将来使用。您是否在计算所需容器的大小时犯了错误? - 如果从循环内部抛出异常,原因可能是代码循环次数过多。你的循环终止条件是否正确?如果它是
- If the exception is thrown from an attempt to allocate an array (such as
int[] values = new int[n]
), the cause could be that you are trying to create an excessively large array (n
is too large). Have you made a mistake in the calculation of the size of array you need? - If the exception is thrown from an attempt to allocate an array in a method of a container class written by someone else, the cause could be that your code is asking the container to store an excessive number of things. Methods such as
ArrayList.reserve(int)
andHashMap(int)
must allocate storage for future use. Have you made a mistake in the calculation of the size of container you need? - If the exception is thrown from inside a loop, the cause could be that the code has looped too many times. Is your loop termination condition correct? If it is a
for
loop, are you asking it to loop the correct number of times?
如果堆栈跟踪没有提供足够的线索,您可以尝试使用堆分析器。这是一个监视程序,使您可以在程序运行时检查用于对象的内存,或检查程序退出时写入的堆转储。它可以提供有关存储在内存中的对象的大小,数量和类别的信息。
If the stacktrace does not provide enough clues, you could try using a heap profiler. That is a monitoring program that enables you to examine the memory used for objects while the program runs, or examies a heap dump written when the program exits. It can provide information about the sizes, number and classes of objects stored in memory.
JVM有有限的内存量可供它使用。您可能会得出结论,您的程序运行正常,但只需要运行的内存比可用的内存多。如果您没有明确告诉JVM要使用多少内存,大多数实现都会选择合理的默认值,但该数量对于您的程序来说可能太小。 JVM的命令行选项可以控制可用内存量。对于大多数JVM实现,其中最重要的选项是 -Xmx
和 -Xms
。
The JVM has a finite amount of memory made available to it. You might conclude that you program is behaving correctly, but just needs more memory to run than has been made available to it. If you do not explicitly tell the JVM how much memory to use, most implementations will choose a sensible default amount based on the amount of RAM that your computer has, but that amount could be too small for your program. Command line options for the JVM can control how much memory is made available. For most JVM implementations, the most important of those options are -Xmx
and -Xms
.
这篇关于什么是OutOfMemoryError以及如何调试和修复它的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!