【Java 基础(人话版)】Java 虚拟机(JVM)

news/2025/3/4 23:04:37/

引言

学习 Java 时,我们经常听到 “一次编译,随处运行” 这句话。这背后的核心支撑技术就是 Java 虚拟机(JVM, Java Virtual Machine)。JVM 负责运行 Java 代码,使得 Java 具有良好的跨平台能力。

但你知道吗?JVM 并不只有一种实现!我们平时使用的 HotSpot VM 只是 JVM 规范的一种实现方式,除此之外,还有 J9 VM、Zing VM、JRockit VM 等不同的 JVM。不同 JVM 各有特点,适用于不同的场景。


1. JVM 是什么?

Java 虚拟机(JVM)是运行 Java 字节码(bytecode)的虚拟机
它的主要作用是:

  1. .class 字节码文件转换为机器码,交给底层操作系统执行。
  2. 实现 Java 语言的跨平台特性。
  3. 提供内存管理(如垃圾回收 GC)、线程管理等高级特性。

通俗一点,JVM 就像一个“翻译官”,它负责把 Java 代码转换成计算机能识别的机器语言,并且让不同操作系统上的 Java 程序表现一致。


2. “一次编译,随处运行” 是怎么实现的?

Java 之所以能跨平台,是因为它采用了 “编译 - 解释” 的混合执行模式

简单来说,Java 代码的执行过程如下:

  1. 编译阶段:Java 源代码(.java 文件)经过 Javac 编译器,转换成 字节码(.class 文件)
  2. 执行阶段:JVM 读取 .class 文件,并将字节码转换为当前系统的机器码,交给 CPU 执行。

🔹 示例:Java 代码的执行过程

java">// HelloWorld.java
public class HelloWorld {public static void main(String[] args) {System.out.println("Hello, JVM!");}
}

执行过程如下:

编译:javac HelloWorld.java → 生成 HelloWorld.class
运行:java HelloWorld  →  JVM 解析字节码,执行

这一过程适用于 Windows、Mac、Linux 等不同系统,所有 JVM 只要遵循相同的 JVM 规范,都能保证相同的 Java 代码在不同平台上运行时,结果是一致的。


3. JVM 并不是只有一种!

很多人以为 JVM 只有 Oracle 提供的 HotSpot VM,其实并不是这样。

只要符合 JVM 规范,任何公司、组织甚至个人都可以实现自己的 JVM。

常见的 JVM 实现有:

JVM 实现维护方主要特点
HotSpot VMOracle最常用的 JVM,性能稳定,GC 优化丰富
J9 VMIBM / Eclipse轻量级、启动速度快,适用于云环境
Zing VMAzul低延迟、高吞吐量,适合金融行业
JRockit VMOracle(已合并到 HotSpot)曾用于服务器端高性能计算

不同 JVM 适用于不同场景,例如 HotSpot 适合通用开发,而 Zing 适合高并发、低延迟的应用。


4. JVM 的核心功能

JVM 主要包含以下几个核心部分:

① 类加载(ClassLoader)

当 Java 程序运行时,JVM 需要先把 .class 文件加载到内存。这个过程由 类加载器(ClassLoader) 负责。

类加载机制采用 “双亲委派” 模型,即:

  1. Bootstrap ClassLoader(启动类加载器):加载 Java 核心类(如 java.lang.String)。
  2. ExtClassLoader(扩展类加载器):加载 ext 目录中的扩展库。
  3. AppClassLoader(应用类加载器):加载 Classpath 下的应用代码。

🔹 示例:打印当前的类加载器

java">public class ClassLoaderExample {public static void main(String[] args) {System.out.println("ClassLoader: " + ClassLoaderExample.class.getClassLoader());}
}

运行后会显示 sun.misc.Launcher$AppClassLoader,说明这个类是由 应用类加载器 加载的。


② 运行时数据区(JVM 内存模型)

JVM 运行时会划分出不同的内存区域,用来存储 代码、对象、方法、线程信息等

JVM 主要包含以下几个运行时内存区域:

内存区域作用
方法区(Metaspace)存放类信息、静态变量、常量池等
堆(Heap)存放对象实例,垃圾回收主要发生在这里
栈(Stack)每个线程都有自己的栈,存储局部变量、方法调用信息
程序计数器(PC)记录当前执行的指令地址
本地方法栈(Native Stack)处理 JNI 调用(例如调用 C 代码)

③ 垃圾回收(GC)

JVM 具备自动垃圾回收(GC)功能,负责回收 不再使用的对象,避免内存泄漏。

常见的 GC 垃圾回收器:

GC 算法特点
Serial GC适用于小型应用,单线程回收
Parallel GC适用于服务器端,多线程并行回收
G1 GC适用于大内存应用,减少 STW 停顿
ZGC低延迟,适用于大规模高并发系统

🔹 示例:手动触发 GC

java">public class GCExample {public static void main(String[] args) {System.gc();  // 建议 JVM 进行 GC,但不一定立即执行System.out.println("GC 触发");}
}

5. JVM 的发展趋势

现代 Java 生态系统已经不再局限于传统的 HotSpot VM,越来越多的新技术正在改进 JVM:

  1. GraalVM:支持 Java、Python、JavaScript、C 等多语言混合编程。
  2. Project Loom:引入虚拟线程(轻量级线程),提升并发能力。
  3. 新 GC(如 ZGC、Shenandoah GC):降低垃圾回收停顿,提高吞吐量。

http://www.ppmy.cn/news/1576662.html

相关文章

DeepSeek vs Grok vs ChatGPT:大模型三强争霸,谁将引领AI未来?

DeepSeek vs. Grok vs. ChatGPT:大模型三强争霸,谁将引领AI未来? 在人工智能领域,生成式模型的竞争已进入白热化阶段。DeepSeek、Grok和ChatGPT作为三大代表性工具,凭借独特的技术路径和应用优势,正在重塑…

【RAG】sPecialized KnowledgE and Rationale Augmented Generation

Why PIKE-RAG? 为什么选择PIKE-RAG? 看介绍,感觉能力特别高大上。看介绍,感觉功能接地气、很实用sPecialized KnowledgE and Rationale Augmented Generation 不是RAG (Retrieval Augmented Generation)In recent years, Retrieval Augmented Generation (RAG) systems h…

C++ Class 基础

在 C 中,class(类) 是面向对象编程(OOP)的核心概念之一。类用于定义对象的属性和行为,是封装数据和方法的基本单位。以下是 C 中类的基础知识。 1. 类的定义 类通过 class 关键字定义,基本语法…

jvm内存不够,怎么重新分配

目录 第一章、问题分析1.1)报错提示1.2)报错分析 第二章、解决方式2.1)修改IDEA的JVM内存设置2.2) 修改Spring Boot项目的JVM内存设置 友情提醒: 先看文章目录,大致了解文章知识点结构,点击文章目录可直接…

ACM-BufferedWriter---格式化输出浮点数

在 Java 中,BufferedWriter 本身不提供格式化功能,但可以结合 String.format() 或 PrintWriter 进行格式化浮点数输出。 方式 1:使用 String.format() import java.io.BufferedWriter; import java.io.FileWriter; import java.io.IOExcept…

第二十七天:Scrapy 框架-模拟登录

文章目录 一、Scrapy-Request和Response(请求和响应) 二、Request对象 三、请求子类 FormRequest对象 1. 请求使用示例 四、响应对象 五、模拟登录 一、Scrapy-Request和Response(请求和响应) Scrapy的Request和Response对…

js环境/electron环境,使用typeorm+sqlite数据库

大家有任何想法,都可以联系博主沟通。 本系列为实战文章,最终实现的桌面工具软件,获取方式:百度网盘地址:https://pan.baidu.com/s/1yrl0jYpti7QCn8CHBRT2lw?pwd=1234 正文开始 前言一、引读二、哪些人可以参考本文三、使用步骤四、使用typeOrm操作数据库4.1保存和修改数…

LeetCode 88 - 合并两个有序数组

LeetCode 88 - 合并两个有序数组 是非常基础的数组操作题目,考察双指针、逆序操作和空间优化等技巧。这个问题相当经典,对后续的归并排序、多指针问题、双数组相关问题都有指导意义。以下是详细的解法、模板与变体问题讲解。 题目描述 给定你两个有序整…