JVM
JVM是什么?
Java虚拟机(JVM) 是一个抽象的计算机,它是一个运行时环境,用于执行Java字节码或编译后的Java程序。JVM屏蔽了底层操作系统的差异,使得Java程序可以在任何支持JVM的操作系统上运行。
JVM能做什么?
- 执行Java字节码:JVM能够加载、验证和执行Java字节码。
- 内存管理:JVM负责内存分配和垃圾回收,自动管理内存,减少开发者的负担。
- 安全控制:JVM提供了多种安全机制,如类加载器、字节码验证器等,确保程序的安全性。
- 性能优化:通过即时编译(JIT)等技术,JVM能够动态优化代码性能。
JVM能给我带来什么好处?
- 平台无关性:编写一次,到处运行(Write Once, Run Anywhere)。JVM使得Java程序可以在不同的操作系统上运行,无需重新编译。
- 自动内存管理:JVM的垃圾回收机制减少了内存泄漏的风险,提高了程序的稳定性。
- 安全性:JVM提供了多种安全机制,保护应用程序免受恶意代码的攻击。
- 性能优化:JVM通过即时编译等技术,能够在运行时动态优化代码性能。
JVM如何使用?
- 编写Java代码:使用Java编程语言编写源代码文件(.java)。
- 编译Java代码:使用javac命令将源代码编译成字节码文件(.class)。
- 运行Java程序:使用java命令启动JVM,并指定要运行的字节码文件。
JVM的原理是什么?
- 类加载器:负责将字节码文件加载到内存中。
- 运行时数据区:包括方法区、堆、栈、程序计数器和本地方法栈等,用于存储各种运行时数据。
- 执行引擎:负责执行字节码,包括解释器、即时编译器(JIT)等。
- 垃圾回收器:自动管理内存,回收不再使用的对象,释放内存空间。
JVM的内存模型
- 方法区(Method Area):存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。
- 堆(Heap):所有对象实例以及数组都在堆上分配内存。堆是垃圾收集器管理的主要区域。
- 虚拟机栈(VM Stack):每个线程在创建时都会创建一个虚拟机栈,存储局部变量表、操作数栈、动态链接、方法出口等信息。
- 本地方法栈(Native Method Stack):与虚拟机栈类似,但为本地方法服务。
- 程序计数器(Program Counter Register):当前线程所执行的字节码的行号指示器。
JVM垃圾回收机制
- 标记-清除(Mark-Sweep):首先标记出所有需要回收的对象,然后统一回收这些对象。缺点是会产生内存碎片。
- 复制(Copying):将内存分为两个相等的区域,每次只使用其中一个区域。当一个区域用完后,将存活的对象复制到另一个区域,然后清理已使用过的区域。适用于新生代(新生代默认)。
- 标记-整理(Mark-Compact):标记出所有需要回收的对象,然后将存活的对象向一端移动,最后清理掉边界外的内存。适用于老年代(老年代默认)。
- 分代收集(Generational Collection):将堆内存分为新生代和老年代,不同代使用不同的垃圾回收算法。新生代使用复制算法,老年代使用标记-整理算法。
垃圾回收器
- Serial:单线程垃圾回收器,适用于客户端模式下的简单应用。
- Parallel:多线程垃圾回收器,适用于多核处理器的服务器应用。
- CMS(Concurrent Mark Sweep):以获取最短回收停顿时间为目标的垃圾回收器。
- G1(Garbage First):面向服务器的垃圾回收器,目标是实现高吞吐量和低延迟。
- ZGC 和 Shenandoah:新一代的低延迟垃圾回收器,适用于大内存和高性能要求的应用。
JVM架构图
以下是一个简化的JVM架构图,展示了JVM的主要组件及其关系:
+-------------------+
| JVM |
+-------------------+
| |
| +----------------+ |
| | 类加载器 | |
| +----------------+ |
| | 启动类加载器 | |
| | 扩展类加载器 | |
| | 应用类加载器 | |
| +----------------+ |
| |
| +----------------+ |
| | 运行时数据区 | |
| +----------------+ |
| | 方法区 | |
| | 堆 | |
| | 虚拟机栈 | |
| | 本地方法栈 | |
| | 程序计数器 | |
| +----------------+ |
| |
| +----------------+ |
| | 执行引擎 | |
| +----------------+ |
| | 解释器 | |
| | 即时编译器 (JIT) | |
| +----------------+ |
| |
| +----------------+ |
| | 垃圾回收器 | |
| +----------------+ |
| | Serial | |
| | Parallel | |
| | CMS | |
| | G1 | |
| | ZGC | |
| | Shenandoah | |
| +----------------+ |
| |
+-------------------+
JVM总结
- JVM 是Java程序运行的基础,提供了平台无关性、自动内存管理和安全性等特性。
- 通过JVM,开发者可以编写一次代码,在多种操作系统上运行,大大提高了开发效率和程序的可移植性。
- JVM的内部机制,如类加载器、运行时数据区、执行引擎和垃圾回收器,共同协作,确保Java程序的高效、稳定运行。
- 内存模型 和 垃圾回收机制 是JVM的重要组成部分,理解它们有助于更好地优化Java程序的性能和内存使用。