java栈内存溢出
- 原因
- 方法递归
- 对象互相引用
原因
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依赖
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;}
}
以上情况无法通过增大栈内存解决,应避免,针对以上方法调用自身应设置出口,员工中不应出现部门引用