原因
1.每一个方法的执行对应着虚拟机栈中一个栈帧入栈到出栈,若方法中调用了其他方法,那么就继续入栈其它方法,
2.当两个对象互相引用时,进行json转换也会无限递归解析,导致StackOverflowError
因此方法递归过深或者互相引用就会导致StackOverflowError
方法递归
原因就是在method1()方法中调用了自身,会无限循环调用
public class Demo {
public static int count;
public static void main(String[] args) {
try {
method1();
} catch (Throwable e) {
System.out.println("count = " + count);
e.printStackTrace();
}
}
public static void method1() {
count++;
method1();
}
}

对象互相引用
原因就是Dept和Emp互相引用,在解析为json时部门包含员工,员工包含部门,部门包含员工。。。无限递归下去
使用到了fastjson依赖
public class Demo01 {
public static void main(String[] args) {
Dept dept = new Dept();
dept.setName("研发部");
Emp emp1=new Emp();
emp1.setName("小明");
emp1.setDept(dept);
Emp emp2=new Emp();
emp2.setName("小红");
emp2.setDept(dept);
dept.setEmps(Arrays.asList(emp1,emp2));
System.out.println(JSON.toJSON(dept));
}
}
class Emp {
private String name;
private Dept dept;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Dept getDept() {
return dept;
}
public void setDept(Dept dept) {
this.dept = dept;
}
}
class Dept {
private String name;
private List<Emp> emps;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public List<Emp> getEmps() {
return emps;
}
public void setEmps(List<Emp> emps) {
this.emps = emps;
}
}

以上情况无法通过增大栈内存解决,应避免,针对以上方法调用自身应设置出口,员工中不应出现部门引用

本文探讨了Java中栈内存溢出(StackOverflowError)的原因,包括方法递归过深及对象互相引用导致的无限递归解析。介绍了如何通过设置递归出口和优化对象引用结构来避免此类错误。
3346

被折叠的 条评论
为什么被折叠?



