JVM由那些部分组成,运行流程是什么?

我们非常重视原创文章,为尊重知识产权并避免潜在的版权问题,我们在此提供文章的摘要供您初步了解。如果您想要查阅更为详尽的内容,访问作者的公众号页面获取完整文章。


JVM组成与运行流程摘要
1. JVM的组成与运行流程
Java虚拟机(JVM)是Java程序的运行环境,其优势包括“一次编写,到处运行”和自动内存管理。JVM主要由以下四部分组成:
- ClassLoader(类加载器): 将Java代码转换为字节码。
- Runtime Data Area(运行时数据区): 加载字节码至内存。
- Execution Engine(执行引擎): 翻译字节码为底层系统指令并交由CPU执行。
- Native Method Library(本地库接口): 支持调用其他语言的本地库接口实现功能。
JVM的运行流程为:
1. 类加载器将代码转换为字节码。
2. 字节码加载至运行时数据区并交由执行引擎处理。
3. 执行引擎将字节码翻译为底层指令,并调用本地库接口完成执行。
2. 程序计数器
程序计数器是线程私有的,用于记录当前线程执行的字节码指令地址。它在线程切换时保存线程的执行位置,确保挂起的线程可以继续执行。程序计数器不会发生OOM(OutOfMemoryError),也无需GC。
3. Java堆
Java堆是线程共享的内存区域,用于存储对象实例和数组。当内存不足时会抛出OutOfMemoryError异常。堆分为以下部分:
- 年轻代: 包括Eden区和两个Survivor区,用于存储生命周期短的对象。
- 老年代: 存储生命周期长的对象。
- 元空间: 在Java 8中取代持久代(永久代),使用本地内存存储类信息、静态变量等。
4. 虚拟机栈
虚拟机栈是线程私有的内存区域,用于存储方法执行时的局部变量表、操作数栈、动态链接及方法出口等信息。栈帧会在方法调用时入栈,方法执行完毕后出栈。栈内存不会进行GC,默认大小为1024k,过大会减少活动线程数。
5. 堆与栈的区别
- 存储内容: 栈存储局部变量和方法调用,堆存储对象实例和数组。
- 线程共享: 栈是线程私有的,堆是线程共享的。
- 异常错误: 栈内存不足会抛出StackOverFlowError,堆内存不足则抛出OutOfMemoryError。
6. 面试总结
JVM的组成包括ClassLoader、Runtime Data Area、Execution Engine和Native Method Library。运行时数据区包含堆、方法区、栈、本地方法栈及程序计数器,各部分功能不同。堆用于存储对象实例与垃圾回收,栈用于方法执行,程序计数器记录字节码行号支持线程切换。
想要了解更多内容?




白皮书上线