首页 >Java >Java基础 >什么是Java虚拟机(JVM),它在内部如何工作?

什么是Java虚拟机(JVM),它在内部如何工作?

Emily Anne Brown
Emily Anne Brown原创
2025-03-14 17:05:04351浏览

什么是Java虚拟机(JVM),它在内部如何工作?

Java Virtual Machine(JVM)是​​Java运行时环境(JRE)的关键组成部分,它使计算机能够运行Java程序。 JVM是无关的,这意味着它可以在具有JVM实现的任何设备或操作系统上运行Java字节码。 JVM充当Java字节码和基础硬件之间的中介,确保可以执行Java应用程序,而无需在不同平台上重新编译。

在内部,JVM通过几个关键阶段工作:

  1. 加载:执行Java程序后,JVM首先加载包含字节码的.class文件。 ClassLoader子系统负责将这些文件加载​​到内存中。
  2. 验证:加载后,验证了字节码,以确保其不会违反Java的安全性或完整性约束。此步骤有助于防止恶意代码被执行。
  3. 准备:在此阶段,JVM分配了类变量的内存,并将其初始化为默认值。
  4. 解决方案:这涉及从代码中解决符号引用到直接引用。在此阶段,JVM可能需要加载其他类。
  5. 初始化:在此阶段发生静态变量的实际初始化和静态初始块的执行。
  6. 执行: JVM使用执行引擎执行字节码指令。执行引擎可以由解释器和即时(JIT)编译器组成。解释器一一读取并执行字节码指令,而JIT编译器将字节码转换为本机机器代码,以更快地执行。
  7. 垃圾收集: JVM管理内存分配和交易,以确保通过垃圾收集收回不再需要的内存。

JVM及其功能的关键组成部分是什么?

JVM由几个关键组件组成,每个组件都具有特定功能:

  1. 类Loader子系统:此组件负责加载,链接和初始化类和接口。它使用分层方法来加载来自不同来源的类(例如本地文件系统,网络位置)。
  2. 运行时数据区域(内存区域):这包括程序执行过程中使用的几个内存区域:

    • 方法区域:存储类结构,例如运行时常数池,字段和方法数据。
    • 堆区域:存储对象并在所有线程之间共享。
    • 堆栈区域:包含存储局部变量和部分结果的框架。每个线程都有自己的堆栈。
    • PC寄存器:保留线程执行的当前指令的地址。
    • 天然方法堆栈:类似于堆栈区域,但用于天然方法。
  3. 执行引擎:此组件执行字节码指令。它包括:

    • 解释器:一次执行字节码。
    • Just-On-time(JIT)编译器:将字节码编译到本机机器代码中,以更快地执行。
    • 垃圾收集器:通过回收不再使用的对象来管理内存。
  4. Java本机接口(JNI):允许Java代码通过其他语言(例如C,C和汇编)编写的本机应用程序和库来调用。
  5. 本机方法库: JVM要求的本机库的集合来支持本机方法的执行。

JVM如何管理内存并执行垃圾收集?

JVM中的内存管理涉及运行时数据区域内内存的分配和交易,尤其是堆和堆栈。这是JVM管理内存的方式:

  1. 内存分配:

    • 堆栈内存:用于存储本地变量和方法调用详细信息。在调用和返回方法时,将自动分配和划分内存。
    • 堆内存:用于存储对象。创建新对象并保留使用时,将分配内存,直到不再引用它们为止。
  2. 垃圾收集:

    • JVM使用垃圾收集来自动通过识别和删除不再引用的对象来自动管理堆内存。该过程涉及:

      • 标记阶段:垃圾收集器通过追踪根(全局变量,堆栈变量等)的所有参考来标识仍在使用的对象(可触及)。
      • 扫描阶段:垃圾收集器收回了标记阶段中被标识为垃圾的对象所占据的内存。
      • 紧凑型相(可选):一些垃圾收集器移动存活的物体以巩固自由空间并减少碎片化。
    • 常见的垃圾收集算法包括:

      • 串行GC:适用于单线程环境。
      • 并行GC:利用多个线程进行垃圾收集来提高性能。
      • 并发标记扫描(CMS)GC:通过与应用程序线程同时执行其大部分工作来最大程度地减少应用程序中的停顿。
      • 垃圾 - 首先(G1)GC:专为大堆内存区域而设计,平衡暂停时间和吞吐量。

JVM适用哪些优化来提高Java应用程序性能?

JVM应用多种优化来提高Java应用程序的性能:

  1. 及时(JIT)汇编:

    • JVM使用JIT汇编将字节码转换为运行时的本机机器代码。随着编译代码的执行速度比解释字节模式快得多,因此这会大大改善。
  2. 内部:

    • JIT编译器可以将小方法插入调用方法,以减少方法调用的开销。这种优化可以显着提高性能,尤其是在经常称为方法中。
  3. 循环展开:

    • JIT编译器可以展开循环以减少环路控制的开销,并有可能实现其他优化。这可以通过在单个循环迭代中执行更多循环迭代来提高性能。
  4. 消除代码:

    • JIT编译器可以检测和删除从未执行的代码,从而减少编译代码的大小并改善运行时性能。
  5. 逃生分析:

    • 该技术分析了是否可以在堆栈中分配对象而不是堆,从而有可能减少收集垃圾的需求并提高性能。
  6. 自适应优化:

    • JVM不断监视应用程序的性能,并动态调整其优化策略。例如,它可能会将经常执行的方法编译为本机代码,同时留下较少的关键代码要解释。
  7. 配置文件引导的优化:

    • JVM使用运行时分析数据来指导其优化决策。这包括跟踪方法调用频率和分支预测,以将优化工作集中在应用程序的最关键部分上。

这些优化使JVM能够通过动态适应所执行的代码的特定运行时特征和工作负载模式来显着提高Java应用程序的性能。

以上是什么是Java虚拟机(JVM),它在内部如何工作?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn