一. java栈:
java栈是一块线程私有的内存空间。如果说,java堆和程序数据密切相关,那么java栈就是和线程执行密切相关的。线程执行的基本行为是函数调用,每次函数调用的数据都是通过Java栈传递的。
java heap,java stack 与Javametaspace之间的关系:
00001.png
特点:
线程私有
栈由一系列帧组成(因此Java栈也叫做帧栈)
帧保存一个方法的局部变量、操作数栈、常量池指针
每一次方法调用创建一个帧,并压栈
1.栈的结构和组成:
1)栈的结构:
这是一块先进后出的数据结构,只支持出栈和入栈两种操作。在java栈中保存的主要内容是栈帧。每一次函数调用都会有一个相应的栈帧入栈,每个函数调用结束,都有一个栈帧弹出java栈。当前正在执行的函数对应的栈就是当前的帧(位于栈顶)。
每个栈帧中,至少包含局部变量表,操作数栈和帧数据区几个部分。
注意由于每次函数调用都会生成栈帧并占有一定的栈空间。因此如果栈空间不足,函数调用就无法进行下去。系统就会抛出StackOverflowOver栈溢出的错误。例如递归时,会有很多栈帧入栈。jvm提供了-Xss来指定线程的最大栈空间,这个参数决定了函数调用的深度。
2)栈组成:
栈由栈帧组成,栈帧由局部变量表,操作数栈,帧数据区组成。
局部变量表:
用于保存函数的