本文为翻译的文章,作者PANKAJ,原文:
https://www.journaldev.com/21010/java-lang-outofmemoryerror-java-heap-space
当JVM无法分配内存来创建一个对象的时候,java.lang.OutOfMemoryError就被抛出。java.lang.OutOfMemoryError是一种Error并且在运行的时候发生。
java.lang.OutOfMemoryError
就像名称所表明的,当java运行时内存不足的时候,就会发生OutOfMemoryError。在这种情况下,垃圾收集器不能释放程序所需的更多空间,从而导致错误被抛出。
有两种主要原因导致java.lang.OutOfMemoryError:
1. 糟糕的编码 -- 死循环,没有关闭资源以释放内存等等
2. 内存不足 -- java运行的时候所需的内存不足
Java OutOfMemoryError – 糟糕编程示例
我们来看看会抛出以下异常的样例代码:java.lang.OutOfMemoryError: Java heap space,因为这个程序进入了死循环,对象被不断创建但没有被回收。所以JVM最终会耗尽内存。
当上面的代码被执行,一些时间后会抛出以下的异常:
这是一个糟糕编程的示例,好消息是,异常堆栈清楚地给我们指明错误发生的代码位置。然而有时候问题可能是在程序的其他地方,在这种情况下,我们需要象VisualVM这样的java剖析工具来找到哪个地方被分配了最多的内存以及如何来优化它。
Java OutOfMemoryError – 内存不足示例
我们来看看另外一个造成OutOfMemoryError的例子,因为我们没有正确地分配程序所需要的足够的内存。
当我们把JVM的最大内存限制为32MB来运行以上程序的时候,来看看发生了什么。
正如我们看到的,程序没有任何问题,只是我们以较低的内存来运行它。我们尝试把JVM内存从256MB增加到512MB来解决OutOfMemoryError。
当我们提供了足够的内存,这个程序运行得很好。
增加JVM内存是解决这个问题的快速办法,除非是运行在内存非常低的环境上面。如果你已经运行在较高的JVM内存上面,比如2GB或者更多,那么你应该检查程序代码来优化它,观察thread dump和java剖析工具的输出,以便找出你的程序为什么需要那么多内存的原因,以及能否降低所需要的内存。
原创文章,欢迎转载,但请注明出处。
欢迎大家关注本订阅号互联网全栈架构,长按下图即可。
领取专属 10元无门槛券
私享最新 技术干货