当前位置: 首页 > article >正文

什么是 JVM? JVM (Java Virtual Machine)

JVM(Java Virtual Machine,Java 虚拟机)是一个虚构出来的计算机,它是一种规范,有自己的指令集,并且在运行时操作各种内存区域。JVM 是 Java 平台的核心组成部分,负责执行 Java 字节码(.class 文件)。

主要功能:

  1. 加载类文件: JVM 的类加载器(ClassLoader)负责从文件系统、网络或其他来源加载 Java 类文件(.class 文件)。
  2. 管理内存: JVM 负责管理程序的内存,包括:
    • 堆 (Heap): 存放对象实例。
    • 方法区 (Method Area): 存放类信息、常量、静态变量、即时编译器编译后的代码等。
    • 虚拟机栈 (VM Stack): 存放局部变量、方法参数、返回值等。每个线程都有自己的虚拟机栈。
    • 本地方法栈 (Native Method Stack): 用于支持 native 方法(使用 C、C++ 等编写的方法)的执行。
    • 程序计数器 (Program Counter Register): 记录当前线程正在执行的字节码指令的地址。
  3. 执行字节码: JVM 的执行引擎负责执行 Java 字节码指令。
    • 解释执行: 逐条解释执行字节码指令。
    • 即时编译 (JIT Compilation): 将热点代码(经常执行的代码)编译为本地机器码,提高执行效率。
    • 自适应优化: JVM 会根据程序的运行情况, 动态地选择解释执行或 JIT 编译.
  4. 垃圾回收 (Garbage Collection): JVM 的垃圾回收器负责自动回收不再使用的对象,释放内存。
  5. 安全管理: JVM 提供了安全机制,例如类加载器的双亲委派模型、字节码校验器等,防止恶意代码的执行。
  6. 提供运行时环境: JVM 为 Java 程序提供了一个与平台无关的运行时环境.

JVM 架构 (主要组件):

  • 类加载器 (ClassLoader): 负责加载类文件。

    • 启动类加载器 (Bootstrap ClassLoader): 加载 Java 核心类库(JAVA_HOME/jre/lib 目录下的 rt.jar 等)。
    • 扩展类加载器 (Extension ClassLoader): 加载 Java 扩展类库(JAVA_HOME/jre/lib/ext 目录下的 jar 包)。
    • 应用程序类加载器 (Application ClassLoader): 加载应用程序的类(classpath 下的类)。
    • 自定义类加载器: 可以自定义类加载器,实现特殊的类加载逻辑。
    • 双亲委派模型: 类加载器在加载类时,会先委托父类加载器加载,只有当父类加载器无法加载时,才由自己加载。
  • 运行时数据区 (Runtime Data Areas): JVM 在运行时管理的内存区域。

    • 堆 (Heap): 存放对象实例。所有线程共享。
    • 方法区 (Method Area): 存放类信息、常量、静态变量、即时编译器编译后的代码等。所有线程共享。
      • 运行时常量池 (Runtime Constant Pool): 方法区的一部分,存放编译期生成的各种字面量和符号引用。
    • 虚拟机栈 (VM Stack): 存放局部变量、方法参数、返回值、操作数栈、动态链接、方法出口等。每个线程都有自己的虚拟机栈。
    • 本地方法栈 (Native Method Stack): 用于支持 native 方法的执行。每个线程都有自己的本地方法栈。
    • 程序计数器 (Program Counter Register): 记录当前线程正在执行的字节码指令的地址。每个线程都有自己的程序计数器。
  • 执行引擎 (Execution Engine): 负责执行字节码指令。

    • 解释器 (Interpreter): 逐条解释执行字节码指令。
    • 即时编译器 (JIT Compiler): 将热点代码编译为本地机器码,提高执行效率。
      • Client Compiler (C1): 优化速度快,但优化程度较低。
      • Server Compiler (C2): 优化速度慢,但优化程度较高。
      • 分层编译 (Tiered Compilation): 根据程序的运行情况,选择不同的编译器进行优化。
    • 垃圾回收器 (Garbage Collector): 负责自动回收不再使用的对象。
      • Serial GC: 单线程垃圾回收器。
      • Parallel GC: 多线程垃圾回收器。
      • CMS GC (Concurrent Mark Sweep): 并发标记清除垃圾回收器。
      • G1 GC (Garbage-First): 一种面向服务端应用的垃圾回收器。
      • ZGC: 一种低延迟垃圾回收器.
      • Shenandoah: 一种低延迟垃圾回收器.

JVM 的优点:

  • 平台无关性 (Write Once, Run Anywhere): Java 字节码可以在任何安装了 JVM 的平台上运行。
  • 自动内存管理 (Garbage Collection): 开发者无需手动管理内存,降低了内存泄漏的风险。
  • 安全性: JVM 提供了安全机制,防止恶意代码的执行。
  • 性能优化 (JIT Compilation): JVM 可以将热点代码编译为本地机器码,提高执行效率。

JVM 的缺点:

  • 性能开销: JVM 本身需要占用一定的系统资源。
  • 启动时间: JVM 的启动时间可能比较长。
  • 复杂性: JVM 的内部结构比较复杂,理解和调优需要一定的专业知识。

JVM、JRE 和 JDK 的关系:

  • JDK (Java Development Kit): Java 开发工具包,包含了 JRE 以及开发 Java 程序所需的工具(如编译器 javac、调试器 jdb、javap 等)。
  • JRE (Java Runtime Environment): Java 运行环境,包含了 JVM 以及 Java 核心类库。
  • JVM (Java Virtual Machine): Java 虚拟机,负责执行 Java 字节码。
+-------------------------------------------------+
|                  JDK (开发工具)                   |
| +---------------------------------------------+ |
| |             JRE (运行环境)                  | |
| | +-----------------------------------------+ | |
| | |       JVM (虚拟机)                        | | |
| | +-----------------------------------------+ | |
| | +-----------------------------------------+ | |
| | |          Java 核心类库                    | | |
| | +-----------------------------------------+ | |
| +---------------------------------------------+ |
| +---------------------------------------------+ |
| |  javac, java, javadoc, jar, jdb, ...        | |
| +---------------------------------------------+ |
+-------------------------------------------------+

常见的 JVM 实现:

  • HotSpot VM: Oracle 官方提供的 JVM,也是目前使用最广泛的 JVM。
  • OpenJDK: HotSpot VM 的开源版本。
  • GraalVM: Oracle 提供的另一个高性能 JVM,支持多种语言。
  • J9 VM: IBM 提供的 JVM。
  • Zing VM: Azul Systems 提供的 JVM,专注于低延迟和高吞吐量。
  • Microsoft JVM: 微软提供的JVM.
  • Amazon Corretto: 亚马逊提供的OpenJDK发行版.

总结:

JVM 是 Java 平台的核心组成部分,它是一个虚拟的计算机,负责加载类文件、管理内存、执行字节码、垃圾回收、安全管理等。JVM 的平台无关性、自动内存管理、安全性和性能优化等特性使得 Java 成为一种流行的编程语言。


http://www.kler.cn/a/573870.html

相关文章:

  • 【Elasticsearch】Rollover 操作与Skip Rollover
  • go语言数据类型
  • ESP32-P4 支持哪些 RISC-V 汇编指令?
  • 将 PHP 函数转换为 Python
  • 低空经济-飞行数据平台 搭建可行方案
  • H5DS编辑器是如何让企业快速构建动态页面
  • 【JAVA架构师成长之路】【JDK源码】第5集:Map集合框架与泛型
  • leetcode日记(74)扰乱字符串
  • 科技解密丨赫思嘉·惟愿:深耕医美领域,以创新科技引领行业新篇章
  • DSP笔记
  • 【Aioredis实战总结】如何修改aioredis的最大连接数。
  • 13、TCP和UDP的区别【高频】
  • Linux部署Redis集群
  • 如何用deepseek写游戏(思路教程分享)【附图文】
  • Flink:大数据处理的“双面侠”
  • 【报错:HikariPool-1 - Exception during pool initialization.】
  • Gpt翻译完整版
  • Linux kill 命令
  • Elasticsearch:解锁深度匹配,运用Elasticsearch DSL构建闪电般的高效模糊搜索体验
  • java基础(算法用)