原理图
解释1:为什么递归会导致OOM?
因为每个方法对应一个栈帧,每个方法执行完成之后才会出栈,递归的方法只有递归完之后才会将所有方法出栈,所以容易产生OOM
解释2:程序计数器和方法栈是线程私有的。
解释3:JAVA字节码含义
源码
class Person {
public static void main(String[] args) {
Person p = new Person();
p.work();
}
public int work() {
int x = 3;
int y = 2;
return x + y;
}
}
work()方法对应字节码
// access flags 0x1
public work()I
L0
LINENUMBER 15 L0
ICONST_3 // 将变量为3的值放到操作数栈
ISTORE 1 // 将变量为3的值放到局部变量表下标为1的位置
L1
LINENUMBER 16 L1
ICONST_2
ISTORE 2
L2
LINENUMBER 17 L2
ILOAD 1 // 将局部变量表中下标为1的值放到操作数栈
ILOAD 2
IADD // 从操作数栈顶取出两个数出来进行加法运算 将结果压入操作数栈
IRETURN // 将结果返回
L3
LOCALVARIABLE this Lcom/lcj/lib_java/Person; L0 L3 0
LOCALVARIABLE x I L1 L3 1
LOCALVARIABLE y I L2 L3 2
MAXSTACK = 2
MAXLOCALS = 3