虚拟机是什么
1)抽象规范
2)具体实现
3)运行中的虚拟机实例
虚拟机体系结构
类装载器子系统,运行时数据区,执行引擎。
运行时数据区包括 方法区,堆,Java栈,PC寄存器,本地方法栈 。
其中java栈是线程独享的,每个java栈由栈帧组成,存储线程中java方法的调用状态,包括局部变量,被调用时传进来的参数,返回值,以及运算的中间结果。
java虚拟机没有寄存器。其指令集使用java栈存储中间数据。这样是为了其指令集尽量紧凑。
数据类型:基本类型和引用类型,基本类型变量都有初始值,而引用类型的变量持有初始值
用户自定义的类装载器以及Class类的实例都放在内存中的堆区,而装载的类型信息则都位于方法区。
装载连接以及初始化
1)装载-------- 查找并装载类型的二进制数据
2)连接--------执行验证,准备,以及解析(可选)
3)初始化------把类变量初始化为正确的初始化值
在Class。forName中知执行操作后以上3不都要进行,而用.class方法 则第三布在特定情况下才执行,具体见java编程思想、14章。
启动类加载器 在系统的类的安装路径中查找要装入的类 系统类加载器搜索classpath目录
方法区
虚拟机提取class文件的类型信息,并把它存入方法区中
注意常量池
所有常量的集合 包括直接常量,和对其他类型。字段和方法的引用。
堆
把堆分为两部分
句柄池,常量池。 虚拟机中每个对象都有对象锁,用于协调多个线程的同步。其上的wait notify notifyAll 方法。
java中数组是真正的对象,存于数组中。同一维度的素组都是同一类的实例,不管其长度。
java栈
每个线程独享一个java栈,栈有栈帧组成,栈不要求内存连续分配。
栈帧由:局部变量区,操作数栈和帧数据区。
类型为int,float,reference,returnAddress 的值在数组中占一项,long和double 两项 ,byte,short,char 转换为int。
执行引擎
java虚拟机规范定义了规则:所有基本类型除了long 和double 都必须是原子级的。