1.1 JVM:
即java虚拟机,模拟操作系统,JVM也需要模拟内存,class就是指令。
本地方法栈 本地方法栈是为JVM使用到本地(Native)(如sleep)服务
1.2线程-虚拟机栈:
(先进后出,弹夹)
每个线程对应一个虚拟机栈,用来存储当前线程运行java方法所需的数据,指令,返回地址
-Xss:设置虚拟机栈大小,默认值如下linux64为1M
由于限制了栈大小,如果线程请求的栈深度大于虚拟机所允许的深度,所以会出现栈异常
1.3栈帧:
每个方法在运行时虚拟机栈会分配对应的内存,叫栈帧,方法执行完,栈帧出栈。
1.3.1局部变量表:
包含8大基本类型,以及new的对象的索引在操作数栈中,new出来的对象放在堆中。
操作数栈:执行引擎的一个工作区
个人理解:
类的静态变量和常量保存在方法区上,其他成员变量都在堆上,只有方法里面定义的基础变量,在方法里面定义的其他对象的引用放在栈上(这个时候被引用的对象和它的成员变量还是在堆上)
cpu + 缓存 + 主内存
jvm执行引擎+ 操作数栈 + 栈,堆
1.3.2操作数栈:
相当于cpu的缓存,局部变量表默认第一个放this自身引用
int x =1;
int y =2;
int z =(x+y)*10;
return z;
对应下图的左侧黑色部分的指令:
iconst_1 : 常量1压入到操作数栈
istore_1 : 将常量1从操作数栈存储到局部变量表
注意:局部变量表的数据(主内存)iload_index进入操作数栈(缓存)中,本身不会删除
1.3.3动态链接:
1.3.4完成出口:
正常返回(调用程序计数器中的地址作为返回)、异常的话(通过异常处理器表<非栈帧中的>来确定)
1.4程序计数器:
程序计数器是一块很小的内存空间,主要用来记录各个线程执行的字节码的地址
