核心概念

先进后出,后进先出。 First In Last Out (FILO)。

栈是一种数据结构,可以简单理解为桶的形状
桶.png

和他类似的数据结构类型是队列。
队列:先进先出,后进后出

栈内存,主管程序的运行,生命周期和线程同步;线程结束,栈内存释放。对于栈来说,不存在垃圾回收问题。一旦线程结束,栈就over。
栈主要存放:8大基本类型+方法的引用+对象的引用

栈帧

栈帧分为栈底和栈顶,每执行一个方法都会产生一个栈帧。


image.png

一个对象实例化的过程

代码

public class StudentTest {
    private String name;
    private int age;
    public static void main(String[] args) throws Exception {
        StudentTest studentTest = new StudentTest();//第一次初始这个类(第一次加载这个类)
        System.out.println("new 出来studentTest对象"+studentTest.age);
        System.out.println("new 出来studentTest对象"+studentTest.name);
        studentTest.testStudent();
    }
    void testStudent(){
        this.age=15;
        this.name="小余";
        System.out.println("对象调用testStudent方法中"+this.age);
        System.out.println("对象调用testStudent方法中"+this.name);
    }
}

程序执行到 main() 方法时,main()函数方法体会进入栈区,这一过程叫做进栈(压栈)


image.png

image.png

栈内存溢出

1.栈内存溢出会抛出Throwable级别的错误:java.lang.StackOverflowError
2.栈内存有两个主要原因:

1.栈中方法太多了(压栈过多),导致栈内存溢出。(图栈溢出1-1)
2.栈中方法过大,导致栈内存溢出(图栈溢出1-2)
栈溢出1-1.png

代码演示方法过多导致栈溢出

/**
 * @PROJECT_NAME: java-jvm
 * @DESCRIPTION: 栈内存溢出demo
 * @USER: 1
 * @DATE: 2022/11/30 15:10
 * @author: xiaoyu
 */
public class StockDemo01 {
    // 定义一个类变量,用于记录方法运行次数
    static int count;
    public static void main(String[] args) {
        try {
            test();
        }catch (Throwable e) {
            e.printStackTrace();
            System.out.println(count);
        }
    }
    // 错误的无限递归,进行压栈
    static  void  test(){
        count++;
        test();
    }
}
栈溢出1-2.png

你可能感兴趣的:(栈)