当前位置: 代码迷 >> 综合 >> java Exception in thread “main“ java.lang.StackOverflowError 栈内存溢出
  详细解决方案

java Exception in thread “main“ java.lang.StackOverflowError 栈内存溢出

热度:27   发布时间:2023-12-15 09:32:15.0

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;}
}

在这里插入图片描述

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

  相关解决方案