一、JVM运行机制
java源代码通过java编译器编译成.class字节码文件,然后字节码文件被装入内存,被解释器转换成机器码执行。不同操作系统的机器码是不同的,我们需要使用对应系统的虚拟机,这也是java语言可以跨平台运行的原因。
二、JVM虚拟机
- 类加载器
将.Class 文件加载到JVM内存中,并形成一个内存对象 - 运行时数据区
虚拟机执行程序时,会将内存划分为若干区域,每个区域有不同的生命周期。这些区域分为线程共享和线程私有 - 字节码执行引擎
执行.class字节码,修改程序计数器
三、运行时数据区
1、堆(线程共享)
存放对象实例
2、方法区(线程共享)
又叫元空间,主要存放的是 Class信息、常量、静态变量。
其中常量或静态变量如果是对象的话,对象存放在堆中,该处存放的是堆的内存地址即指针引用
3、栈 (线程私有)
又叫虚拟机栈,每个线程拥有一块栈空间,用于存放局部变量。线程在执行每个方法的时候,都会创建一个栈帧
- 栈帧
1、局部变量:存放方法的局部变量,与方法区相同,如果是对象,存放对象在堆中的内存地址
2、操作数栈:方法中,操作数的临时内存空间
3、动态链接:符号引用转化为直接引用 存放内存地址
4、方法出口:调用该方法的位置,用于该方法执行完毕后在什么位置继续执行
4、程序计数器 (线程私有)
程序计数器是每个线程私有的,为线程正在执行的字节码的内存地址。多线程场景中线程轮流执行,当一个线程CPU时间片用完但未执行完毕挂起时,等待CPU下次分配到时间片后再从程序计数器处继续执行
5、本地方法栈(线程私有)
服务的对象是JVM执行的native方法