JVM线程私有数据区
2020-12-13 02:24
标签:运行时数据区 this 技术 ack tar turn 方法 内存模型 als 本章节内容参考:《深入理解Java虚拟机》 运行时数据区: 本章节只介绍线程私有的内存模型。 虚拟机栈(FILO):java方法执行的内存模型。 栈帧(线程执行的一个方法的内存模型,每调用一个方法,压入一个栈帧) 局部变量表:编译器可知的8种基本类型、reference类型、returnAddress类型 操作数栈:一个用于计算的临时数据存储区(明显,此栈是为了存放要操作的数据用的) 动态链接:支持java多态 返回地址:方法结束的地方。return/Exception 本地方法栈:Native方法执行的内存模型。 程序计数器:这个计数器记录的是正在执行的虚拟机字节码指令的地址(如果线程正在执行的是一个java方法)。 字节码解释器工作时,就是通过改变这个计数器的值来选取需要执行的字节码 指令(分支,循环,跳转、异常处理、线程恢复) 线程中,方法A调用方法B。 线程的执行的过程: 线程开始,分配虚拟机栈大小(JVM参数 -Xss:大小,1.5+默认1M),执行方法A时,创建一个栈帧A压入虚拟机栈顶,根据程序计数器中的记录的下一个要执行的字节码指令的地址,找到指令,执行指令(将要操作的数据压入操作数栈栈顶,将操作结果放入局部变量表中)。中间调用方法B,则创建栈帧B,接着执行方法B的指令,直到方法B结束(遇到方法返回的字节码指令或异常),B栈帧出栈,如果有返回数据,将返回数据压入栈帧A的操作数栈中,方法A接着执行。 为更形象的理解,结合代码演示(操作数栈和局部变量表): 源码: public void add() { int a = 3; int b = 4; int c = a + b; } javap结果: public void add(); descriptor: ()V flags: ACC_PUBLIC Code: stack=2, locals=4, args_size=1 0: iconst_3 // 将int类型常量3压入操作数栈顶 1: istore_1 // 将操作数栈顶的数据弹出,存入局部变量表索引1 2: iconst_4 // 将int类型常量4压入操作数栈栈顶 3: istore_2 // 将操作数栈顶的数据弹出,存入局部变量表索引2 4: iload_1 // 将局部变量表索引为1的数据加入到操作数栈顶 5: iload_2 // 将局部变量表索引为2的数据加入到操作数栈顶 6: iadd // 将栈中2个数相加,将结果入栈顶 (注意:如果栈中数据大于2了,也只做两个数据的相加处理) 7: istore_3 // 将栈顶结果弹出,存入局部变量表索引3 8: return LineNumberTable: line 26: 0 line 27: 2 line 28: 4 line 29: 8 LocalVariableTable: // 局部变量表,4个局部变量,this、a、b、c Start Length Slot Name Signature 0 9 0 this LCongoPengYuyan; 2 7 1 a I 4 5 2 b I 8 1 3 c I JVM线程私有数据区 标签:运行时数据区 this 技术 ack tar turn 方法 内存模型 als 原文地址:https://www.cnblogs.com/sleepingDogs/p/11032471.html