1. Java堆溢出
java.lang.OutOfMemoryError: Java heap space 堆内存溢出
案例:
先去设置应用的堆内存大小,如果不懂去设置,可以参考上一篇博客《深入理解JVM系列教程(05) - JVM参数配置》
import java.util.ArrayList;
import java.util.List;
public class OutOfMemoryErrorDemo {
public static void main(String[] args) {
List<Object> listObject = new ArrayList<>();
for (int i = 0; i < 10; i++) {
System.out.println("i:" + i);
Byte[] bytes = new Byte[1 * 1024 * 1024];
listObject.add(bytes);
}
System.out.println("添加成功...");
}
}
运行后:
解决办法:设置堆内存大小,设置大一点。
-Xms1m -Xmx10m -XX:+PrintGCDetails -XX:+HeapDumpOnOutOfMemoryError
2. 虚拟机栈溢出
java.lang.StackOverflowError 栈内存溢出
栈溢出产生于递归调用,循环遍历是不会的,但是循环方法里面产生递归调用, 也会发生栈溢出。
案例:
public class StackOverflowErrorDemo {
private static int count;
public static void count() {
try {
count++;
count();
} catch (Throwable e) {
System.out.println("最大深度:" + count);
e.printStackTrace();
}
}
public static void main(String[] args) {
count();
}
}
运行后:
解决办法 :设置线程最大调用深度
-Xss5m 设置最大调用深度
3. 内存溢出与内存泄漏的区别
1.Java内存泄漏就是没有及时清理内存垃圾,导致系统无法再给你提供内存资源(内存资源耗尽);
2.Java内存溢出就是你要求分配的内存超出了系统能给你的,系统不能满足需求,于是产生溢出。
3.内存溢出,说明存储空间不够大,就像倒水倒多了,从杯子上面溢出了来了一样。
4.内存泄漏,原理是使用过的内存空间没有被及时释放,长时间占用内存,最终导致内存空间不足,而出现内存溢出。