我的Java程序抛出了一个OutOfMemoryError
。我该如何调试和解决这个问题?
许多初学Java的人都很难应对
OutOfMemoryError
。本文试图创建一个规范问题,回答关于OutOfMemoryError
最常见的问题。我创建这个新问题,而不是改编以前关于OutOfMemoryError
的众多问题之一,因为那些问题及其答案与一个人遇到的特定问题紧密耦合。此问题与调试异常的通用建议不同,因为问题的原因并不总是在调用堆栈上,需要具体的建议。
我的Java程序抛出了一个OutOfMemoryError
。我该如何调试和解决这个问题?
OutOfMemoryError
。本文试图创建一个规范问题,回答关于OutOfMemoryError
最常见的问题。我创建这个新问题,而不是改编以前关于OutOfMemoryError
的众多问题之一,因为那些问题及其答案与一个人遇到的特定问题紧密耦合。OutOfMemoryError
是Java虚拟机(JVM)抛出的异常,因为它需要为一个(新的)对象分配内存,但是该对象所需的内存不足。 JVM首先尝试通过运行垃圾回收器来释放已经死亡对象所使用的内存。
由于OutOfMemoryError
是VirtualMachineError
,因此JVM允许在任何时候抛出该异常, 但必须首先尝试通过垃圾回收释放内存。
new
语句中抛出。因此,您应该首先检查与异常相关联的堆栈跟踪,以获取有关问题原因的线索,就像处理其他任何异常一样。
int[] values = new int[n]
)而抛出的,则原因可能是您正在尝试创建一个过大的数组(n
太大了)。您在计算所需数组大小时是否犯了错误?ArrayList.reserve(int)
和HashMap(int)
等方法必须为将来使用分配存储空间。您在计算所需容器大小时是否犯了错误?for
循环,您是否要求它循环正确的次数?-Xmx
和-Xms
。StackOverflowError
,而不是 OutOfMemoryError
。 - C. K. YoungStackOverflowError
,如果没有先引发OutOfMemoryError
的话! - Raedwald当Tomcat的内存配置小于应用程序所需的内存时,就会出现这个问题。
为了解决这个问题,请进入Tomcat bin目录并创建一个新文件setenv.bat,在该文件中定义PermSize如下:
set JAVA_OPTS=-Dfile.encoding=UTF-8 -Xms512m -Xmx1024m -XX:PermSize=512m -XX:MaxPermSize=1024m
根据应用程序的要求,可以将PermSize设置为更高的范围。