java heap space 解决方法_内存溢出错误:java堆空间

本文为翻译的文章,作者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最终会耗尽内存。

96f972288022bfc2889f21628a3d2099.png

当上面的代码被执行,一些时间后会抛出以下的异常:

46aeb1c63ff782abb2b1f228b66f1464.png
7b7f5bdc7d1fab73ce11742f22c09c77.png

这是一个糟糕编程的示例,好消息是,异常堆栈清楚地给我们指明错误发生的代码位置。然而有时候问题可能是在程序的其他地方,在这种情况下,我们需要象VisualVM这样的java剖析工具来找到哪个地方被分配了最多的内存以及如何来优化它。

Java OutOfMemoryError – 内存不足示例

我们来看看另外一个造成OutOfMemoryError的例子,因为我们没有正确地分配程序所需要的足够的内存。

2ee9cd904c2f626e0fef77c2d3719c11.png

当我们把JVM的最大内存限制为32MB来运行以上程序的时候,来看看发生了什么。

08d5e9f6c0071db19886ad97f8109016.png

正如我们看到的,程序没有任何问题,只是我们以较低的内存来运行它。我们尝试把JVM内存从256MB增加到512MB来解决OutOfMemoryError。

1d6d411a1e1953dd8715e55c5bca215e.png

当我们提供了足够的内存,这个程序运行得很好。

增加JVM内存是解决这个问题的快速办法,除非是运行在内存非常低的环境上面。如果你已经运行在较高的JVM内存上面,比如2GB或者更多,那么你应该检查程序代码来优化它,观察thread dump和java剖析工具的输出,以便找出你的程序为什么需要那么多内存的原因,以及能否降低所需要的内存。

9918d63edf720d9a2d8f41218eee2e69.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值