栈
2022-11-30 本文已影响0人
小鱼_a563
核心概念
栈是一种数据结构,可以简单理解为桶的形状先进后出,后进先出。 First In Last Out (FILO)。

和他类似的数据结构类型是队列。
队列:先进先出,后进后出
栈
栈内存,主管程序的运行,生命周期和线程同步;线程结束,栈内存释放。对于栈来说,不存在垃圾回收问题。一旦线程结束,栈就over。
栈主要存放:8大基本类型+方法的引用+对象的引用
栈帧
栈帧分为栈底和栈顶,每执行一个方法都会产生一个栈帧。

一个对象实例化的过程
代码
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()函数方法体会进入栈区,这一过程叫做进栈(压栈)


栈内存溢出
1.栈内存溢出会抛出Throwable级别
的错误:java.lang.StackOverflowError
2.栈内存有两个主要原因:
1.栈中方法太多了(压栈过多),导致栈内存溢出。(图栈溢出1-1)
2.栈中方法过大,导致栈内存溢出(图栈溢出1-2)

代码演示方法过多导致栈溢出
/**
* @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();
}
}
