上一篇文章《实战Jvm内存溢出之GC overhead limit exceeded》我们介绍了jvm堆内存溢出的第一种方式GC overhead limit exceeded,这篇文章我们介绍下最常见的JVM内存溢出之Java heap space。一般常见的报错如下:
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space at java.util.Arrays.copyOfRange(Arrays.java:3664) at java.lang.String.<init>(String.java:207) at java.lang.StringBuilder.toString(StringBuilder.java:413) at com.oom.demo.OomDemo.Demo1.main(Demo1.java:9)
出现这种问题其实还是主要是堆内存溢出,因此这里我们还是来演示+解决下。
一、模拟异常
这里我们模拟异常,完整代码如下:
package com.oom.demo.OomDemo; public class Demo1 { public static void main(String[] args) { String aaa = ""; for(int i = 0 ;i< 10000000;i++) { aaa += "this is a test "; } System.out.println(aaa); } }
然后在启动的时候添加下堆内存的大小:
-Xms2m -Xmx2m
然后运行起来,就会直接抛错
二、解决异常
出现这种问题首先我们可以根据日志来查看对应的报错信息,这里几乎可以定位到第九行
aaa += "this is a test ";
但是代码是没有问题的,主要还是排查对应的逻辑,可以看到这里
for(int i = 0 ;i< 10000000;i++) { aaa += "this is a test "; }
结合这个逻辑我们可以看到某个对象太大了,完全超出了堆内存,所以这里的解决方案如下:
1、查看是否有必要这么大的单个对象,例如sql中的in是不是过多。
2、代码逻辑合理的情况下就增加堆内存
-Xms2G -Xmx2G
还没有评论,来说两句吧...