本文共 1312 字,大约阅读时间需要 4 分钟。
java棧和函数调用的关系图
【名词解释】
--->java棧是一块线程的私有空间--->java的棧是先进后出的数据结构。函数返回,则该函数的棧帧被弹出。--->一个函数对应一个棧帧,一个棧帧里包含局部变量表,操作数棧,棧数据区【行为解释】--->每次函数调用都会生成相应的棧帧,从而占用一定的棧空间,因为棧空间不足,那么函数调用自然无法继续进行下去。当请求的棧深度大于最大可用深度时,系统会抛出StackOverflowError的棧溢出错误【异常】--->棧内存溢出java.lang.StackOverflowError【参数设定】--->-Xss128k 代表线程的最大棧空间为128K【棧帧包含的内容解释】《局部变量表》 --->保存所指函数的局部变量,参数。函数局部变量和参数越多则棧帧越大,所占棧空间越多,影响函数的嵌套调用次数。 --->long和double类型的局部变量占用2个字大小。 --->int,short,byte,对象引用等占用1个字大小 --->字:计算机内存中占据一个单独内存单元编号的一组二进制串。一般32位计算机上一个字为4个字节的长度 --->每个局部变量表中有:作用域范围,所在槽位(索引,变量名,数据类型)后边变量槽位可复用前边已经失去作用域变量的槽位,达到节省空间的目的。/** * * @param a * @param b * 局部变零表中:this ,a,b,c,d * 槽位:this(0),a(1),b(2),c(3),d(4) * 所站字的大小为:5个字 * */ public static void test1(String a,int b){ int c=0; System.out.println("Test2.test1()"+c); long d=2; } /** * * @param a * @param b * 局部变零表中:this ,a,b,c,d * 槽位:this(0),a(1),b(2),c(3),d(3) * 所站字的大小为:4个字 */ public static void test2(String a,int b){ if(true){ int c=0; System.out.println("Test2.test2()"+c); } int d=2; }《操作数棧》 --->操作数棧也是棧帧中重要的内容之一,主要保存计算过程的中间结果,同时作为计算过程中变量临时存储空间 --->先进后出的数据结构《帧数据区》 --->访问常量池的指针,方便程序访问常量池 --->异常处理表。当程序发生异常,根据该表查找相应的异常,进行处理棧上分配: --->是java虚拟机提供的一项优化技术,基本思想:对于那些线程私有的对象(这里指不可能被其他线程访问的对象),可以将他们打散分配在棧上,而不是分配在堆上。分配在棧上的好处是可以在函数调用结束后自行销毁,而不需要垃圾回收器介入,从而提高系统性能。 --->棧上分配的一个技术基础是进行逃逸分析。逃逸分析的目的是判断对象的作用域是否有可能逃逸出函数体。转载地址:http://bsbnm.baihongyu.com/