第1课_JVM基本介绍
热度🔥:38 免费课程
授课语音
JVM 介绍
JVM(Java Virtual Machine,Java 虚拟机)是运行 Java 程序的核心组件之一。它是一种抽象的计算机,用于执行 Java 字节码,为 Java 提供跨平台特性,同时也支持其他语言(如 Kotlin、Scala、Groovy)编译成字节码运行。
1. JVM 的核心功能
1.1 跨平台性
JVM 实现了“一次编译,到处运行”。Java 源代码被编译为与平台无关的字节码(.class
文件),这些字节码可以在安装了 JVM 的任何设备上运行。
1.2 内存管理
JVM 管理程序运行时所需的内存,包括:
- 堆(Heap):存储对象实例和数组,供垃圾回收(GC)机制管理。
- 栈(Stack):用于方法调用和局部变量存储。
- 方法区(Method Area):存储类信息、常量、静态变量等。
- 程序计数器(PC Register):记录当前线程的字节码执行位置。
- 本地方法栈(Native Method Stack):为本地方法(如 C/C++)提供支持。
1.3 垃圾回收(Garbage Collection, GC)
JVM 自动管理内存,通过垃圾回收机制清理不再使用的对象,降低内存泄漏风险。
1.4 线程管理
JVM 提供了多线程支持,通过线程栈和同步机制(如锁和监视器)实现线程的并发执行。
2. JVM 的运行流程
Java 程序的执行通常包括以下几个步骤:
2.1 编译阶段
Java 源代码(.java
文件)通过 Java 编译器(javac
)编译为字节码(.class
文件)。
2.2 类加载阶段
JVM 类加载器(Class Loader)将字节码文件加载到内存中,执行验证、准备、解析和初始化等操作。
2.3 字节码执行
JVM 的执行引擎将字节码翻译为机器码:
- 解释执行:逐行解释字节码,速度较慢。
- 即时编译(JIT,Just-In-Time Compiler):将热点代码编译为机器码,提高执行效率。
3. JVM 的内存结构
3.1 运行时数据区
JVM 的内存区域可以分为以下部分:
(1) 堆(Heap)
- 用于存储对象实例和数组。
- 由垃圾回收器自动管理。
- 分为 年轻代 和 老年代:
- 年轻代(Young Generation):存储新创建的对象,分为 Eden 和 Survivor 区域。
- 老年代(Old Generation):存储生命周期较长的对象。
(2) 栈(Stack)
- 每个线程都有独立的栈。
- 存储方法的局部变量、操作数和方法返回地址。
- 如果栈深度过大可能导致
StackOverflowError
。
(3) 方法区(Method Area)
- 存储类元数据、常量、静态变量等。
- 在 JDK 8 之前使用永久代(Permanent Generation),JDK 8 开始使用元空间(Metaspace)。
(4) 程序计数器(PC Register)
- 每个线程都有一个程序计数器。
- 记录当前线程执行的字节码指令地址。
(5) 本地方法栈(Native Method Stack)
- 为调用本地方法(如 JNI 方法)提供支持。
4. JVM 组件
4.1 类加载器(Class Loader)
- 负责将
.class
文件加载到内存中。 - 按以下顺序加载:
- Bootstrap ClassLoader(引导类加载器):加载 JDK 核心类库。
- Extension ClassLoader(扩展类加载器):加载扩展类库。
- Application ClassLoader(应用类加载器):加载用户定义的类。
4.2 字节码执行引擎
- 解释器:逐行解释执行字节码,启动快但运行效率较低。
- JIT 编译器:将热点代码直接编译为机器码,提高性能。
4.3 垃圾回收器(Garbage Collector, GC)
- 根据不同的算法回收堆内存:
- 标记-清除(Mark-Sweep)
- 标记-复制(Mark-Copy)
- 标记-整理(Mark-Compact)
- 常见垃圾回收器:
- Serial GC
- Parallel GC
- CMS GC
- G1 GC(JDK 9 默认)
5. JVM 优化与调优
5.1 内存调优
- 调整堆大小:
-Xms
(初始堆大小),-Xmx
(最大堆大小)。 - 配置垃圾回收器:
-XX:+UseG1GC
,-XX:+UseParallelGC
等。 - 调整栈大小:
-Xss
。
5.2 性能分析工具
- JVisualVM:监控 JVM 内存、线程、GC 活动。
- JConsole:监控 JVM 性能和资源使用。
- Java Mission Control:JDK 提供的专业调优工具。
6. JVM 的跨语言支持
虽然 JVM 最初是为 Java 设计的,但它也支持其他语言,只要它们能够编译为字节码。例如:
- Kotlin:现代静态类型语言,与 Java 互操作性良好。
- Scala:支持函数式编程。
- Groovy:动态类型语言,适合快速开发。
- Clojure:JVM 上的 Lisp 方言,支持并发编程。
总结
JVM 是 Java 生态系统的核心,它不仅实现了跨平台性,还提供了内存管理、垃圾回收、线程支持等强大的功能。理解 JVM 的运行原理和内存结构是优化 Java 应用程序性能和解决问题的关键。