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.内存泄漏,原理是使用过的内存空间没有被及时释放,长时间占用内存,最终导致内存空间不足,而出现内存溢出。
总结