JVM学习笔记
Java虚拟机内部体系结构:
虚拟机必须能够通过对象引用得到类数据:当程序在运行时需要转换某个对象引用为另一种类型时,虚拟机必须检查这种转换是否被允许,被转换的对象是否的确是被引用的对象或者是它的超类型。当程序在执行instanceof操作时,虚拟机也能进行同样的检查。最后,当程序中调用某个实例方法时,虚拟机必须动态绑定。
划分为对象池和方法池的对象如下:
保持对象数据在一起的方式如下:
对于一个运行中的Java程序而言,其中每一个线程都有自己的PC寄存器,它是该线程启动时创建的,PC寄存器的大小是一个字长,因此它可以持有一个本地指针,也可以持有一个returnAddress。当程序执行某个java方法时,PC寄存器的值总是下一条将被执行的指令的地址。如果线程正在执行一个本地方法,那么此时PC寄存器的值是“undifined”。
每当线程调用一个Java方法时,虚拟机都会在该线程的Java栈中压入一个新帧,而这个新帧自然就成为了当前帧。在执行这个方法时,它使用这个帧来存储参数、局部变量、中间运算结果等等数据。Java方法可以以两种方式完成:return和抛异常,两种情况都会将当前帧弹出Java栈。Java栈上所有的数据都是此线程私有的。栈帧的结构如下:
- 局部变量区:Java栈帧中的局部变量区组织成字长为单位的数组:int、float、reference和returnAddress占一项,byte、short和char的值在存入数组前将被转换成int值,long和double占两项(其中第一个参数是偷偷塞进去的this)。
- 操作数栈:通过标准的压入、弹出来操作,参数的处理与局部变量区相同。
- 帧数据区:Java栈帧需要一些数据来支持常量池解析、正常方法的返回和异常机制的派发。这些信息都保存在Java栈帧的帧数据区中。