JVM基础
JVM组成部分
flowchart LR
A["javac Math.java"]
B["java Math.class"]
subgraph C["JVM虚拟机"]
direction TB
subgraph D["运行时数据区-内存模型"]
direction TB
堆
栈(线程)
本地方法
方法区-原空间
程序计数器
end
E["类装载子系统"]
F["字节码执行引擎"]
E -->D
F -->D
end
A-->B-->E
java运行
- 使用javac命令将.java文件编译成.class文件
- 使用java命令执行.class文件
- 执行时类装载子系统将类资源加载到内存模型中
- 字节码执行引擎运行内存数据
内存模型
堆
当new一个对象时便会将对象放入堆中。
分为年轻代和老年代,新生代又包含Eden区和Survivor(s0+s1)区。默认内存比例为Eden:s0:s1:老年代=8:1:1:20。
栈
当调用方法时,栈会为每个方法开辟方法独有的内存空间放入方法自身的局部变量,这块空间称为栈帧。主要存储局部变量、操作数栈、动态链接、方法出口
方法变量:方法局部变量,对象变量时会存对象在堆中的地址,方便调用
操作数栈:数据的加、减、乘、除等一些操作时,存放数据使用。操作时将数据压入压出
动态链接:存放方法的入口,调用方法时可以去方法区找
方法出口:记录调用方法时的位置,当调用方法执行完成后,主方法可以知道已经执行到哪里,并执行后续方法
方法执行完毕后会销毁所分配的内存空间,即出栈。由于java方法调用链关系,栈是先进后出
本地方法
存储本地方法,Thread类中private native void start0()方法即为本地方法。
方法区
储存常量、静态变量、类信息
当静态变量为类变量时,静态变量存储对应类在堆中的地址。
类信息是指类的.class数据信息
程序计数器
记录当前执行的代码行位置(也有些时记录即将执行的代码行位置,不同JVM有差异),执行时由字节码执行引擎更改。
当A线程执行时有更高级别的B线程执行,A线程将挂起,B线程执行完后可以通过程序计数器确认A线程应该执行的代码位置。

浙公网安备 33010602011771号