一、Java内存模型
二、 栈溢出(StackOverflowError)
栈是线程私有的,他的生命周期与线程相同,每个方法在执行的时候都会创建一个栈帧,用来存储局部变量表,操作数栈,动态链接,方法出口灯信息。局部变量表又包含基本数据类型,对象引用类型(局部变量表编译器完成,运行期间不会变化)
所以我们可以理解为栈溢出就是方法执行是创建的栈帧超过了栈的深度。那么最有可能的就是方法递归调用产生这种结果。
public class Main {
private int i = 0;
public void a(){
System.out.println(i++);
a();
}
public static void main(String[] args) {
new Main().a();
}
}
执行结果:
调节栈内存大写:-Xss2M
再次执行:
之前遇到一个问题:实体类里的属性太多,重写toString方法,编译时报栈内存溢出,通过上面的方式扩大栈内存还是不行,最后通过下面的方式设置栈内存,问题解决
具体原因不太清除,猜测可能是编译和运行时的内存有区别吧!
二、 堆溢出(OutOfMemoryError:java heap space)
heap space表示堆空间,堆中主要存储的是对象。如果不断的new对象则会导致堆中的空间溢出
public static void main(String[] args) {
List<String> list = new ArrayList<>();
try {
while (true){
list.add("admin");
}
} catch (Throwable e) {
System.out.println(list.size());
e.printStackTrace();
}
}
执行结果:
可以通过 -Xmx4096M 调整堆的总大小