为什么会产生 java.lang.OutOfMemoryError: Java heap space 错误以及如何解决?

/ Java / 没有评论 / 1369浏览

为什么会产生 java.lang.OutOfMemoryError: Java heap space 错误以及如何解决?

关于 java.lang.OutOfMemoryError: Java heap space 错误,遇到的程序员可能不是很多,但是当你真的遇到的时候,你就会发现我的这篇文章对你的帮助非常的大!

引发 java.lang.OutOfMemoryError: Java heap space 错误的主要原因就是在创建新的对象时, 堆内存中的空间不足以存放新创建的对象时发生!

所以说,当有人问你:在 Java 中创建一个对象(new 一个正常的类)会不会发生异常?你应该这样回答:当堆内存中的空间不足时,可能会发生 java.lang.OutOfMemoryError: Java heap space 错误!

知道了 java.lang.OutOfMemoryError: Java heap space 错误的发生时机。我们来看看 Java 中为什么有这个异常或错误产生!

一般来说每个 Java 程序都只能使用一定量的内存,这种限制是由 JVM 的启动参数决定的。而更复杂的情况在于, Java 程序的内存主要分为两部分: 堆内存(Heap space)和 永久代(Permanent Generation,简称 Permgen): 堆内存和永久代

这两个区域的最大内存大小,由 JVM 启动参数 -Xmx 和 -XX:MaxPermSize 指定。如果没有明确指定,则根据平台类型(OS版本+ JVM版本)和物理内存的大小来确定。

就算机器上还存在空闲的物理内存,但只要堆内存使用量达到最大内存限制(注意,在 JVM 中如果 98% 的时间是用于 GC 且可用的 Heap size 不足 2% 的时候将抛出此异常信息),就会抛出 java.lang.OutOfMemoryError: Java heap space 错误。

产生 java.lang.OutOfMemoryError: Java heap space 错误的原因,通俗的讲就是一个人只能吃一碗米饭,吃完一碗后,你又给他乘了一碗,他说吃不下去了,吃饱了!

明白了这个原因,我们来看怎么解决它!

因为你现在饭做多了,所以让别人再吃一碗,别人也吃不下。所以,解决办法就有两种,一种就是你下次少做点饭,就只在做饭的时候就进行控制;还有一种就是一次别吃完,让它饿一下了再吃!

反映到 Java 应用程序上就是,你在程序启动的时候,把堆内存设置大一点,当然是不能超过物理内存大小的。还有一种办法就是,一些超大的,超预期的对象或数据分批来处理。例如,我定义了一个长度为 10 的数组,你就不能放置 20 个元素。你可以先放 10 个,等这 10 个用完后,再放 10 个。

另外就是,你的程序本身就有内存泄露的情况。

比如,代码中的某些错误,导致系统占用的内存越来越多。如果某个方法/某段代码存在内存泄漏的,每执行一次,就会(有更多的垃圾对象)占用更多的内存。随着运行时间的推移,泄漏的对象耗光了堆中的所有内存,那么在新创建对象等情况下就会爆发 java.lang.OutOfMemoryError: Java heap space 错误。

在启动的时候,把堆内存设置大一点的操作很简单,比如下面的配置:

JAVA_OPTS="-server -Xms800m -Xmx800m -XX:PermSize=64M -XX:MaxNewSize=256m -XX:MaxPermSize=128m -Djava.awt.headless=true "

或者也可以在 Tomcat 的 TOMCAT_HOME/bin/catalina.bat 中添加下面这句话:

set JAVA_OPTS= -Xmx1024M -Xms512M -XX:MaxPermSize=256m

除此之外,也可以在 Idea 或 Eclipse 的 Optional Java VM arguments中添加:

-Xmx1024M -Xms512M -XX:MaxPermSize=256m

如果是 SpringBoot 项目,直接执行 jar 文件,可以这样做:

java -jar -Xms258m -Xmx258m -XX:PermSize=512M -XX:MaxPermSize=512m xttblog.jar --spring.profiles.active=prod --server.port=80

上面这些设置虽然简单,但就是怕有些时候,问题的根本原因是你的程序存在内存泄露的情况。

这个时候,你扩大堆内存,只能延缓 java.lang.OutOfMemoryError: Java heap space 错误的触发时间。

所以,产生 java.lang.OutOfMemoryError: Java heap space 错误的时候,我建议你按照下面的步骤检查一边你的应用程序!

说了这么多,其实最重要的还是要加强自己的编码能力和良好的编码习惯!更多关于 JVM 的学习内容,我后面会一篇一篇的写,希望能够帮助到大家,并能得到大家的支持!

参考资料