JVM 基础探秘:开启 Java 底层世界的大门

你是否好奇 Java 程序在运行时究竟发生了什么?Java 虚拟机(JVM)作为 Java 程序运行的核心,承载着代码执行、内存管理、垃圾回收等关键功能。对于每一位想要深入理解 Java 的开发者来说,掌握 JVM 基础都是必不可少的旅程。

本篇博客将从最基础的概念出发,带你逐步认识 JVM 的架构体系,包括类加载子系统如何将字节码文件加载到内存,运行时数据区又是怎样划分并管理不同类型的数据,以及垃圾回收机制如何自动清理不再使用的对象,释放宝贵的内存资源。无论是初涉 Java 领域的新手,还是有一定经验但渴望进一步探索底层的开发者,都能在这里找到对 JVM 基础知识的清晰解读与实用见解,为后续更深入的技术研究和项目开发筑牢根基。

第一章:什么是 JVM 以及 JVM 的作用

1.1什么是JVM

VM(Java Virtual Machine,Java 虚拟机)是一种能够执行 Java 字节码的虚拟计算机。它的核心职责是将 Java 源代码编译生成的 .class字节码文件解释或编译成对应平台的机器指令,从而实现 “一次编写,到处运行”(Write Once, Run Anywhere,WORA)的特性。

从结构上看,JVM 并不是一个真实存在的硬件设备,而是一个软件实现,它模拟了计算机的运算和控制单元,让 Java 程序能够在不同操作系统和硬件平台上运行而无需重新编译。

1.2jvm的作用

1.跨平台能力

  • JVM 将字节码解释或即时编译(JIT)成目标平台的机器码,使同一套 Java 程序可以在 Windows、Linux、macOS 等不同系统上运行,无需针对每个平台单独编译。

2.内存管理与自动垃圾回收

  • JVM 负责分配和管理程序运行时的内存(如堆、栈、方法区等),并在对象不再被引用时自动回收内存,减少内存泄漏的风险。
  • 开发者无需手动释放内存,大大降低了因内存操作不当导致的错误。

3.类加载与验证

  • JVM 在运行时按需加载 .class文件进入内存,并对字节码进行格式与安全性验证,防止恶意或损坏的代码被执行。

4.执行引擎

  • JVM 的解释器逐条解释字节码并执行;同时 JIT 编译器会将热点代码直接编译成本地机器码,提高执行效率。

5.提供运行时环境

  • JVM 为 Java 程序提供了线程调度、异常处理、安全管理等运行时支持,使程序在多线程环境下稳定运行。

image

第二章:JVM与JDK的关联剖析及运行机制揭秘

JVM和JDK的关系

这里我们可以通过配置好的jdk来查看我们的jvm,同样的这里也是为了我们更好的理解,通过cmd java -version ,我们可以看到HotSpot为jvm.

image

1.定义层面

  • JVM(Java Virtual Machine):即Java虚拟机,它是一种抽象的计算机,通过在实际的计算机上仿真模拟各种计算机功能来实现的。JVM的核心作用是加载字节码文件(.class文件),并解释或编译执行其中的字节码指令,从而实现Java程序的运行,提供了Java程序运行的基础环境。
  • JDK(Java Development Kit):Java开发工具包,它是Java开发人员用于开发、编译、调试和运行Java程序的一套工具集合。JDK包含了JRE(Java Runtime Environment,Java运行时环境)以及一系列的开发工具,如编译器(javac)、调试器(jdb)等。

2.包含关系

  • JDK包含JRE,而JRE又包含JVM。也就是说,JVM是JDK的一部分,是JDK能够支持Java程序运行的核心组件之一。具体来说,JDK除了JRE之外,还提供了诸如javac编译器,用于将Java源文件(.java)编译成字节码文件(.class);java命令用于启动JVM来运行字节码程序;还有一些辅助工具如jar用于打包Java类文件等。

image

3.功能协同

  • 开发人员在本地使用JDK中的javac编译器将编写好的Java源代码编译成字节码文件。这些字节码文件可以在任何安装了JRE(其中包含JVM)的机器上运行。

实现原理

1.字节码加载

JVM通过类加载器(Class Loader)子系统来加载字节码文件。类加载器分为启动类加载器(Bootstrap Class Loader)、扩展类加载器(Extension Class Loader)和应用程序类加载器(Application Class Loader)。启动类加载器负责加载Java的核心类库,如rt.jar等;扩展类加载器加载jre/lib/ext目录下的类库;应用程序类加载器加载用户应用程序的类路径(classpath)下的类库。

2.字节码执行

  • 解释执行:JVM的解释器(Interpreter)会逐行读取字节码指令,并将其翻译成对应的本地机器指令来执行。这种方式简单直接,但执行效率相对较低,因为每次执行都需要进行解释。
  • 即时编译(JIT):为了提高执行效率,JVM引入了即时编译技术。当某个方法或代码块被频繁调用时,JIT编译器会将其字节码编译成本地机器码,并缓存起来。下次再执行相同的代码时,就可以直接执行本地机器码,从而大大提高了程序的执行速度。JIT编译器会根据代码的执行情况,选择合适的方法进行编译优化,如方法内联、逃逸分析等。

3.内存管理

  • 堆:是Java对象存储的地方,也是垃圾回收器主要管理的区域。堆内存被划分为新生代和老年代,新生代用于存储新创建的对象,采用复制算法进行垃圾回收;老年代用于存储存活时间较长的对象,采用标记 - 清除或标记 - 整理算法进行垃圾回收。
  • 栈:每个线程都有自己独立的栈,栈中存储的是局部变量、方法参数、方法调用信息等。栈的操作是先进后出的,当一个方法被调用时,会在栈中创建一个栈帧,方法执行完毕后,栈帧会被弹出。
  • 方法区:用于存储类的元数据信息,如类的结构信息、静态变量、常量池等。在JDK 8及以后,方法区的实现变成了元空间(Metaspace),它使用本地内存,不再受限于JVM的堆内存大小。

image

posted @ 2026-01-29 18:06  白鹿为溪  阅读(4)  评论(0)    收藏  举报