一、jvm---线程栈
每个线程都会从内存栈分配一块区域,这个区域里放了此线程变量(按方法,一个方法对应一块栈帧内存区域)。
Math.class字节码文件不是给人看的,idea中找到Math类,右键找到terminal,输入javap,底下-c对代码进行反汇编
命令:javap -c Math.class > math.txt
此时,Math类根目录下多了一个文件,是java虚拟机的汇编代码,可在官方查询命令的意思。
a=1的底层:
iconst:将int类型常量_1压入操作数栈 istore:将int类型存入局部变量1(实质:将常量1从操作数栈取出,存入变量a的内存)
程序计数器:程序马上要运行代码的行号(实质:内存地址),字节码执行引擎动态修改
iload_1:从局部变量中装载int类型值 iload_2:从局部变量中装载int类型值 iadd:从操作数栈弹出最上面俩值,进行add操作,然后push进操作数栈
bipush 10:将10放进操作数栈
imul:执行int类型的乘法 -----》从栈顶弹出两个最新的操作数,将结果压回操作数栈
动态链接:存方法的入口地址,方法出口:存方法出口的地址,方法嵌套时,就指向了下一个方法地址
Math math = new Math();
局部变量表里装载一个math变量,堆里产生一个Math对象,math变量存的是Math对象的地址,所以它其实指向了这个对象。栈和堆的关系由此出来:局部变量存对象的地址,为指向关系。
方法区:1.8之前叫持久代,1.8之后叫元空间。常量+静态变量+类信息。
static类型的user变量指向new出来的User对象。也是有指向关系。
本地方法:由native修饰的方法,底层由c++实现。线程运行过程中,用到本地方法了,就从本地方法栈取一块内存空间给这个线程本地方法用。
紫色部分:线程私有的。栈,本地方法栈。程序计数器。
粉色部分:线程公有的。堆。方法区。
堆:年轻代:老年代=1:2。 其中年轻代:eden区:survivor区=8:1:1。当eden区对象放满内存后,触发gc,底层可达性算法。
标签:操作数,int,方法,局部变量,线程,jvm,sql,优化,Math From: https://www.cnblogs.com/fengok/p/18055027