Java 虚拟机栈
Java 虚拟机栈:Java Virtual Machine Stacks,每个线程运行时所需要的内存
- 每个方法被执行时,都会在虚拟机栈中创建一个栈帧 stack frame
- Java 虚拟机规范允许 Java 栈的大小是动态的或者是固定不变的
- 虚拟机栈是每个线程私有的,每个线程只能有一个活动栈帧,对应方法调用到执行完成的整个过程
- 每个栈由多个栈帧组成,对应着每次方法调用时所占用的内存,每个栈帧中存储着:
- 局部变量表:存储方法里的 Java 基本数据类型以及对象的引用
- 动态链接:也叫指向运行时常量池的方法引用
- 方法返回地址:方法正常退出或者异常退出的定义
- 操作数栈或表达式栈和其他一些附加信息
设置栈内存大小:-Xss size
-Xss 1024k
- 在 JDK 1.4 中默认为 256K,而在 JDK 1.5+ 默认为 1M
虚拟机栈特点:
- 栈内存不需要进行垃圾回收,方法开始执行的时候会进栈,方法调用后自动弹栈,相当于清空了数据
- 栈内存分配越大越大,可用的线程数越少(内存越大,每个线程拥有的内存越大)
- 方法内的局部变量是否线程安全:
- 如果方法内局部变量没有逃离方法的作用访问,它是线程安全的(逃逸分析)
- 如果是局部变量引用了对象,并逃离方法的作用范围,需要考虑线程安全
异常:
- 栈帧过多导致栈内存溢出 (超过了栈的容量),会抛出 OutOfMemoryError 异常
- 当线程请求的栈深度超过最大值,会抛出 StackOverflowError 异常