目录
线程作为系统运算调度的最小单位,在JVM中线程的行为体现就是函数调用,函数调用中数据的传递就是通过Java栈,Java栈顾名思义有着和数据结构中“栈”相似的属性,后进先出,出栈入栈,栈中保存的是栈帧,当JVM发生函数调用时,就会有一个栈帧被压入Java栈,当函数调用结束后,再从栈中弹出栈帧,当前正在执行的函数其对应的栈帧位于栈顶处,且保存有当前函数的局部变量表和栈数据区(保存一些中间结果等数据)。在函数返回,也就是有栈帧要从Java栈中弹出时,正常的情况是函数通过return返回,此时栈帧正常弹出,如果函数调用出现问题无法正常返回,则抛出异常,举个例子:我们每一次函数调用时都会对Java栈进行入栈操作,栈空间是一定的,随着不断入栈操作,例如递归函数调用,栈空间变得越来越小,最后达到最大可用深度时,就会抛出栈溢出异常,所以有时我们递归函数调用过程中出现的“StackOverflowError”,就是栈空间因为某些原因被占满了导致的。
局部变量表
函数对应的栈帧中有一个局部变量表,里面保存了调用函数的局部变量,参数等,这些参数和变量是跟着函数走的,只在当前函数调用中有效,函数调用结束后,栈帧就会弹出Java栈,局部变量表也就随之被销毁。来看一个简单的例子:

draw()方法中有3个入参和3个局部变量,

本文介绍了JVM中函数调用如何利用Java栈进行数据传递,重点讨论了局部变量表的索引复用、垃圾回收的影响以及栈数据区中的栈上分配策略。栈上分配能提高性能,避免GC回收,适用于线程私有的、不逃逸的对象。
最低0.47元/天 解锁文章
1万+

被折叠的 条评论
为什么被折叠?



