Java虚拟机栈是线程私有的,它的生命周期和线程同步
一个线程每执行到一个方法,JVM就会创建一个栈帧(用于存储基本数据类型、对象指针和返回值等),并将栈帧压入栈中。
代码示例:
public class Example {
public static void main(String[] args) {
Example example = new Example();
example.m1();
}
public void m1() {
int x = 0;
m2();
}
public void m2() {
Apple y = new Apple();
m3();
}
public void m3() {
float z = 1.0f;
}
}
执行流程:
当方法执行完成后,所有的线程栈帧将按照后进先出的顺序逐一出栈,直至栈空为止
Java线程栈默认大小是由操作系统决定的,一般为1MB或2MB。如果需要调整线程栈的大小,可以使用-Xss
参数来设置。在实际开发中,默认的线程栈大小通常已经足够满足需求,只有在遇到线程栈溢出错误时才需要考虑调整大小。
一旦递归过深,线程栈的容量增长超过了允许的栈容量,就会抛出StackOverflowError(栈溢出) 错误。
那么什么是内存泄漏和内存溢出呢?
内存溢出异常抛出的原因(包括但不限于):
小结: