JVM概述
Java 虚拟机(JVM,Java Virtual Machine)是 Java 语言跨平台特性的核心。它提供了一个运行 Java 字节码的抽象计算机环境,负责加载字节码、执行代码、内存管理和垃圾回收等任务。JVM 是 Java 程序执行的关键组件,也是理解 Java 性能优化和调试的重要部分。
关于JVM知识点的相关博客文章:
# 1. JVM 体系结构
类加载子系统(Class Loader Subsystem):负责将
.class
文件加载到内存中,并进行验证、准备、解析和初始化等过程。JVM 的类加载器分为三种:- 启动类加载器(Bootstrap ClassLoader):负责加载 Java 核心类。
- 扩展类加载器(Extension ClassLoader):负责加载 Java 扩展库中的类。
- 应用类加载器(Application ClassLoader):负责加载应用程序路径中的类。
运行时数据区(Runtime Data Areas):JVM 在执行程序时会将数据存储在多个内存区域中,主要包括:
- 方法区(Method Area):存储类的元数据、静态变量、常量等信息。
- 堆(Heap):用于存储对象实例和数组,是 Java 垃圾回收管理的主要区域。
- 虚拟机栈(Java Stack):用于存储局部变量、操作数栈、动态链接等,每个线程都有独立的虚拟机栈。
- 本地方法栈(Native Method Stack):为 JVM 调用本地方法(如 C/C++ 代码)提供支持。
- 程序计数器(PC Register):记录当前线程正在执行的字节码指令的地址。
# 2. 执行引擎
- 解释器:将字节码逐行解释执行,适用于程序中的冷代码(即很少执行的代码)。
- JIT 编译器(Just-In-Time Compiler):将字节码编译为机器码,以提高程序执行效率。JIT 编译器适用于热点代码,通过即时编译和优化,显著提高了程序的执行速度。
- 垃圾回收器(Garbage Collector):负责回收堆内存中的无用对象,JVM 提供了多种垃圾回收算法和垃圾回收器,如 G1、CMS、Serial、Parallel 等。
# 3. JVM 内存管理
- 堆内存管理:堆被划分为新生代和老年代,新生代中又进一步分为 Eden 区和 Survivor 区。
- 新生代(Young Generation):存储新创建的对象,包括 Eden 区和两个 Survivor 区,年轻对象经过多次垃圾回收后会晋升到老年代。
- 老年代(Old Generation):存储生命周期较长的对象。
- 垃圾回收算法:JVM 采用了多种垃圾回收算法来管理内存:
- 标记-清除算法:标记出需要回收的对象,再清除它们。
- 复制算法:将存活对象从一块区域复制到另一块区域。
- 标记-整理算法:标记出存活对象并将它们整理到内存的一端,清除无效对象。
# 4. 类加载机制
- 双亲委派模型:JVM 的类加载机制采用双亲委派模型,加载类时,首先交由父类加载器加载,只有在父类加载器无法加载时,才由当前加载器加载。这样可以确保核心类库不会被重复加载。
- 类的生命周期:类的生命周期包括加载、验证、准备、解析、初始化、使用和卸载几个阶段。每个阶段都有特定的任务和处理方式。
# 5. JIT 编译与 AOT 编译
- JIT 编译器:JVM 的即时编译器会将热点代码编译为本地机器码,提升代码执行速度。JIT 编译能够在运行时进行代码优化,如内联方法、去除冗余代码等。
- AOT 编译器(Ahead-Of-Time Compiler):在 Java 9 中引入,用于在程序运行前将字节码编译为本地代码,减少启动时间。
# 6. JVM 调优工具
- JVM 参数:通过 JVM 参数可以调节 JVM 的行为,如堆大小、垃圾回收器类型等。常用参数包括
-Xmx
、-Xms
、-XX:+UseG1GC
等。 - 监控与诊断工具:
- JVisualVM:用于监控 JVM 的内存使用情况、线程活动、GC 等。
- JConsole:用于监控 JVM 和应用程序的运行状态。
- jstack:用于查看线程堆栈信息,帮助诊断死锁等问题。
- jmap:用于生成堆内存快照,分析内存泄漏。
# 7. 垃圾回收器
- Serial 垃圾回收器(JDK 1.3):单线程回收,适用于单核 CPU 的应用,停顿时间较长。JDK 8 默认用于客户端模式。
- Parallel 垃圾回收器(JDK 1.4):多线程回收,适用于需要高吞吐量的应用,停顿时间相对较长。JDK 8 默认用于服务器模式。
- CMS(Concurrent Mark-Sweep)(JDK 1.5):并发标记清除,减少了停顿时间,适用于需要低延迟的应用。
- G1(Garbage First)(JDK 1.7):适用于大内存应用,能够以可控的停顿时间回收垃圾,通过分区回收提高效率。JDK 9 及以上版本推荐使用,JDK 17 默认使用 G1 垃圾回收器。
# 8. JVM 的常见应用场景
- 内存溢出与泄漏排查:使用
jmap
和jhat
分析内存快照,定位内存泄漏的位置和原因。 - 性能调优:通过调整垃圾回收器、JVM 参数以及线程管理来优化程序性能,减少停顿时间,提高吞吐量。
- 类加载分析:使用
-verbose:class
参数查看类加载过程,了解类加载的顺序和原因。
# 9. 总结
JVM 是 Java 程序运行的基础,它提供了跨平台的支持和强大的内存管理机制。理解 JVM 的体系结构、执行引擎、垃圾回收机制、类加载过程以及内存管理,对编写高效的 Java 程序至关重要。在日常开发中,JVM 的调优和监控工具能够帮助开发者诊断性能问题,优化应用程序的运行效率。
上次更新: 2024/11/01, 13:45:14