📚 分类
JVM
🕵🏽‍♀️ 问题描述
什么是虚拟机栈?
👨‍🏫 问题讲解
❒ Java Virtual machine Stacks (java 虚拟机栈)

✔ 栈是一种快速有效的分配储存方式,访问速度仅次于PC程序计数器
✔ 对于栈来说不存在垃圾回收问题(弹栈即释放栈内存)
✔ 栈中主要存放一些基本类型的变量(byte, short, int, long, float, double, boolean, char)和对象的引用变量。
✔ 每个线程运行时所需要的内存,称为虚拟机栈,先进后出。
✔ 每个栈由多个栈帧(frame)组成,对应着每次方法调用时所占用的内存。
✔ 每个线程只能有一个活动栈帧,对应着当前正在执行的那个方法。
✔ 栈有一个很重要的特殊性,就是存在栈中的数据可以共享(栈中的数据可以被多个变量引用 int a = 3, b = 3;)。

❒ 堆栈的区别是什么?

✔ 栈内存一般会用来存储局部变量和方法调用,但堆内存是用来存储Java对象和数组的的。堆会GC垃圾回收,而栈不会。
✔ 栈内存是线程私有的,而堆内存是线程共有的。
✔ 两者异常错误不同,但如果栈内存或者堆内存不足都会抛出异常。
✔ 栈空间不足:java.lang.StackOverFlowError。
✔ 堆空间不足:java.lang.OutOfMemoryError。
🏳️‍🌈 问题总结
❒ 垃圾回收是否涉及栈内存?

✔ 垃圾回收主要指就是堆内存,当栈帧弹栈以后,内存就会释放

❒ 栈内存分配越大越好吗?

✔ 未必,默认的栈内存通常为1024k,栈帧过大会导致线程数变少

❒ 方法内的局部变量是否线程安全?

✔ 如果方法内局部变量没有逃离方法的作用范围,它是线程安全的
✔ 如果是局部变量引用了对象,并逃离方法的作用范围,需要考虑线程安全

❒ 什么情况下会导致栈内存溢出?

✔ 栈帧过多导致栈内存溢出,典型问题:递归调用
✔ 栈帧过大导致栈内存溢出

📖 问题信息
📈 浏览次数:21 | 📅 更新时间:2025-12-15 08:35:08
📦 创建信息
🏷️ ID:128 | 📅 创建时间:2025-02-06 03:16:11