JVM是java虚拟机的缩写,是一个抽象出来的、虚拟的计算机。与操作系统进行交互,有自己完善的架构,如处理器、堆栈、寄存器,用来解析和运行java程序
Java为什么能实现跨平台关键在于使用java虚拟机,java代码不直接在cpu上运行,而是在java虚拟机上运行
java先把java文件编译成二进制的.class字节码文件,然后再加载到java虚拟机中,jvm解析成各个操作系统的机器指令,从而实现跨平台
jvm运行时的数据区域 类加载过程1、加载:把.class的二进制字节码文件加载近jvm中
2、连接
1)验证:确保被加载类的正确性
2)准备:为类变量(静态变量)分配内存,设置默认值(初始化之前不赋予初始值)
3)解析:把类中的符号引用转换成直接引用
3、初始化:为类变量赋予初始值
4、实例化:为新对象分配内存空间,为实例变量赋值
双亲委派机制
一个类加载器接受到类加载的请求时,会将请求委托给父类加载器,一直委托到最上层的父类加载器,父加载器加载失败时,会将类交给子加载器加载,所有加载器都加载不到时,抛出ClassNotFoundException异常。
双亲委派机制作用为确保java核心类库中的类不会被用户自定义的类所替代
模型工作工程:用户自定义的类加载器 --> 应用类加载器 Application ClassLoader --> 拓展类加载器Extension ClassLoader --> 根加载器 Bootstrap ClassLoader(顶端)
JVM五大数据区域本地方法栈(Native Method Stack)
服务于本地方法接口(JNI:Java Native Interface),JDK中带有native关键字的方法为本地方法,本地方法接口是为了融合不同的编程语言为java所用,在执行引擎执行的时候加载本地方法库,目前使用极少
程序计数器(Program Counter Register)
线程私有的区域,比较小的一块内存空间,用于记录当前线程要执行的字节指令所处的地址,通过程序计数器来选取下一条需要执行的字节码指令
方法区(Method Area)
也叫非堆,逻辑上存在物理上不存在,和堆一样是线程共享的区域
用于存放被虚拟机加载的类信息、常量池、方法数据、方法代码、符号引用等
JDK1.7以前是在永久代中,JDK1.8是在元空间中(元空间不在虚拟机中,使用本地内存)
栈(Stack)
线程私有的区域,存储基本类型的值,对象的引用、方法等,
线程中执行一个方法时往栈中插入一个栈帧,最先入栈的最后出栈,与队列相反遵循先进后出的原则,栈的生命周期与线程一致
堆(Heap)



