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

Java 虚拟机 (JVM) 是 Java 运行环境的核心部分,它负责执行 Java 字节码。JVM 由多个不同的组件组成,每个组件都负责不同的任务。下面我将详细介绍 JVM 的主要组成部分及其运行流程。

JVM 的组成部分

  1. 类加载器 (Class Loader)

    • 类加载器负责读取文件系统中的 .class 文件,并将其转换成 Java 虚拟机可以理解的形式。
    • 类加载器分为三个主要类型:启动类加载器(Bootstrap ClassLoader)、扩展类加载器(Extension ClassLoader)和应用程序类加载器(Application ClassLoader)。
  2. 运行时常量池 (Runtime Constant Pool)

    • 运行时常量池是方法区的一部分,它存放着类或接口编译期生成的各种字面量和符号引用。
  3. 方法区 (Method Area)

    • 方法区是各个线程共享的内存区域,它用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码缓存等数据。
    • Java 8 以后,方法区被称为"元空间"(Metaspace),它不再位于堆中,而是直接使用本地内存。
  4. 堆 (Heap)

    • 堆是 Java 虚拟机所管理的内存中最大的一块,几乎所有的对象实例都在这里分配内存。
    • 堆又被划分为新生代(Young Generation)和老年代(Old Generation),其中新生代又细分为 Eden 区、From Survivor 区和 To Survivor 区。
  5. 程序计数器 (Program Counter Register)

    • 程序计数器是一块较小的内存空间,它可以看作是当前线程所执行的字节码的行号指示器。
  6. 虚拟机栈 (Virtual Machine Stack)

    • 每个线程拥有一个独立的虚拟机栈,栈中存储的是栈帧。
    • 栈帧是方法执行的上下文信息,包括局部变量表、操作数栈、动态链接、方法出口等信息。
  7. 本地方法栈 (Native Method Stack)

    • 与虚拟机栈相似,但是本地方法栈为虚拟机使用到的 Native 方法服务。
  8. 垃圾回收器 (Garbage Collector)

    • 垃圾回收器负责回收不再使用的对象所占用的内存空间,以减少内存泄漏的可能性。
  9. 执行引擎 (Execution Engine)

    • 执行引擎负责解释执行字节码或执行由 JIT 编译器编译的本地代码。
  10. 编译器 (Compiler)

    • 包括即时编译器(JIT Compiler),它将频繁执行的热点代码编译成本地机器码,以提高性能。

JVM 的运行流程

  1. 加载类

    • 当 Java 程序启动时,类加载器会加载主类及其依赖的类。
    • 类加载过程包括加载、验证、准备、解析和初始化五个阶段。
  2. 创建线程

    • 创建主线程(main thread),执行 main 方法。
  3. 执行

    • 主线程开始执行 main 方法,调用其他方法或创建新的线程。
    • 每个线程都有自己的虚拟机栈和程序计数器。
  4. 分配内存

    • 对象实例在堆中分配内存。
    • 局部变量和方法参数在虚拟机栈中分配内存。
  5. 执行字节码

    • 执行引擎负责解释执行字节码。
    • 热点代码会被 JIT 编译器编译成本地代码以提高性能。
  6. 垃圾回收

    • 当内存不足时,垃圾回收器会被触发,回收不再使用的对象所占用的空间。
  7. 结束

    • 当所有线程执行完毕或者程序正常退出时,JVM 将终止。

总结

JVM 是一个复杂的软件系统,它不仅负责执行 Java 字节码,还管理内存、处理线程调度、执行垃圾回收等。

相关推荐
liang_jy1 小时前
文件管理(四)—— 文件存储空间管理
面试·操作系统
头发还在的女程序员1 小时前
医院陪诊管理系统怎么选择?——2026 年选型避坑与架构参考
java·开发语言·陪诊系统·陪诊app·医院陪诊陪护
liang_jy2 小时前
文件管理(三)—— 文件目录
面试·操作系统
CodeStats2 小时前
【Spring事务】Spring事务注解 @Transactional 完整体系:从 MySQL 隔离级别到 MyBatis 原理详解
java·spring·mybatis·事务·transactional
我命由我123452 小时前
Android 开发问题:为 PDFView 设置一个带有黑色边框的背景 drawable,但边框没有生效
android·java·java-ee·android studio·android jetpack·android-studio·android runtime
都叫我大帅哥5 小时前
从Python到Java:为什么企业级Agent最终会选择Java?
java·ai编程
wanderist.5 小时前
Lambda表达式在算法竞赛中的应用
java·开发语言·算法
腻害兔6 小时前
【若依项目-产品经理视角】RuoYi-Vue-Pro 源码拆解:IM 即时通讯模块,一个被低估的「全功能聊天系统」
java·前端·vue.js·产品经理·ai编程
心念枕惊7 小时前
.NET CORE 授权进阶-角色、策略与动态权限实现
java·前端·.netcore
feng尘7 小时前
深度解析布隆过滤器(Bloom Filter):原理、优缺点与 1000 万黑名单实战
后端·面试