3.jvm的执行流程
- 手机
- 2025-09-16 11:48:01

自上向下 编译:.java → .class。 加载:类加载器加载字节码到方法区,生成Class对象。 内存分配:对象实例存入堆,方法调用栈帧入虚拟机栈。 执行:解释器或JIT执行字节码,本地方法通过JNI调用。 回收:GC自动清理堆内存,优化资源利用
一、编译阶段源码转字节码 Java源代码(.java文件)通过编译器(如javac)转换为与平台无关的字节码文件(.class文件)。字节码包含类结构、方法指令等信息。 字节码内容:包括魔数(Magic Number)、版本号、常量池(符号引用、字面量)、方法表等。 验证:编译时进行语法、语义分析,确保符合Java规范。
二、类加载阶段类加载子系统(ClassLoader)负责将字节码加载到内存中,分为以下子阶段:
加载(Loading) 通过类全限定名定位.class文件,将二进制数据流转换为方法区的运行时数据结构。 在堆中生成java.lang.Class对象,作为类的访问入口。 链接(Linking) 验证:检查字节码的合法性(如格式、安全性)。 准备:为静态变量分配内存并赋默认值(如int初始化为0)。 解析:将符号引用(如类名、方法名)转换为直接引用(内存地址)。 初始化(Initialization) 执行静态代码块(方法),为静态变量赋实际值。 双亲委派机制:类加载器(Bootstrap→Extension→Application)按层级委托加载,避免重复加载和安全问题。
三、运行时数据区初始化JVM内存划分为以下区域:
堆(Heap) 存储对象实例和数组,线程共享,是垃圾回收的主要区域。分为新生代(Eden、Survivor)和老年代。 方法区(Method Area) 存储类元信息、常量池、静态变量(JDK8后为元空间Metaspace)。 虚拟机栈(VM Stack) 线程私有,每个方法调用对应一个栈帧,存储局部变量表、操作数栈、动态链接和方法出口。 程序计数器(PC Register) 记录当前线程执行的字节码指令地址。 本地方法栈(Native Method Stack) 支持非Java代码(如C/C++)的调用。 ##四、执行引擎处理 解释执行 解释器逐行解析字节码为机器指令,适合快速启动但效率较低。 即时编译(JIT) 热点代码(频繁执行的方法)被编译为本地机器码,提升执行效率。 本地方法接口(JNI) 调用操作系统或硬件相关的本地库(如C/C++实现的功能)。 栈帧执行示例: 以方法calculate()为例:
操作数栈:临时存储运算中间值(如v1=1加载到栈顶)。 局部变量表:保存方法参数和局部变量(如v3=(v1+v2)*5计算结果存入变量表)。 动态链接:将方法调用关联到实际内存地址。 五、垃圾回收与内存管理 垃圾回收(GC) 标记-清除:识别无用对象并回收内存。 分代回收:新生代用复制算法,老年代用标记-整理算法。 内存交互规则 通过lock/unlock、read/load等8种原子操作保证主内存与工作内存的一致性。 源码→字节码 → 2. 类加载(加载→链接→初始化) → 3. 内存分配(堆/栈/方法区) → 4. 执行引擎(解释/JIT) → 5. 操作系统指令执行 → 6. GC管理内存释放
3.jvm的执行流程由讯客互联手机栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“3.jvm的执行流程”
上一篇
Linux常见基本指令(二)