目录
JVM(Java Virtual Machine,Java虚拟机)是Java程序运行的核心环境,它使得Java具备“一次编写,到处运行”的跨平台能力。
JVM是Java生态的核心,通过自动内存管理、类加载和跨平台能力,为Java程序提供高效稳定的运行环境。
1. JVM的核心功能
- 跨平台执行:Java源码编译为字节码(.class文件),JVM负责将字节码翻译成不同平台的机器指令执行,屏蔽底层硬件和操作系统的差异。
- 内存管理:自动分配和回收内存,通过垃圾回收(GC)机制管理堆内存,减少内存泄漏风险。
- 类加载:通过类加载器动态加载、链接和初始化类文件。
- 执行引擎:解释或编译字节码(如JIT即时编译器),优化代码执行效率。
- 运行时数据管理:维护程序运行时的数据结构,如堆、栈、方法区等。
2. JVM核心组件
2.1 类加载子系统
- 类加载过程:
- 加载:查找并加载类的二进制数据。
- 链接:
- 验证:确保字节码符合规范。
- 准备:为静态变量分配内存并初始化默认值。
- 解析:将符号引用转为直接引用。
- 初始化:执行静态代码块和赋值操作。
- 类加载器层级:
- Bootstrap ClassLoader:加载核心Java类库(如
rt.jar
)。 - Extension ClassLoader:加载扩展库(
jre/lib/ext
目录)。 - Application ClassLoader:加载用户类路径(ClassPath)的类。
- 自定义加载器:用户可定义,遵循双亲委派模型(优先由父加载器处理,避免重复加载)。
- Bootstrap ClassLoader:加载核心Java类库(如
2.2 运行时数据区
- 线程私有区域:
- 程序计数器(PC Register):记录当前线程执行的位置。
- 虚拟机栈:存储方法调用的栈帧(局部变量、操作数栈等),每个方法对应一个栈帧。
- 本地方法栈:服务于Native方法(如C/C++代码)。
- 线程共享区域:
- 堆:存放对象实例和数组,分为新生代(Eden、Survivor区)和老年代。
- 方法区(元空间):存储类元数据、常量、静态变量等(JDK8后由本地内存实现的Metaspace替代永久代)。
2.3 执行引擎
- 解释器:逐行解释字节码,启动快但效率较低。
- JIT编译器(Just-In-Time):
- 将热点代码(频繁执行的代码)编译为本地机器指令,提升性能。
- 例如,HotSpot虚拟机的C1(Client编译器)和C2(Server编译器)。
- 垃圾回收器:
- 常见算法:标记-清除、复制、标记-整理、分代收集。
- 主流GC类型:Serial(单线程)、Parallel(多线程)、CMS(低停顿)、G1(分区收集)、ZGC(亚毫秒级延迟)。
3. JVM工作流程
- 编译:Java源码通过
javac
编译为字节码(.class文件)。 - 类加载:类加载器将字节码加载到内存。
- 执行:
- 解释器直接执行字节码。
- JIT编译器对热点代码进行编译优化。
- 内存回收:GC自动回收不再使用的对象,释放堆内存。
4. JVM的跨平台实现
- JVM本身是平台相关的,不同操作系统需要对应的JVM实现(如Windows、Linux、macOS版本)。
- 字节码作为中间层,统一由各平台的JVM解释或编译为本地指令,实现跨平台兼容性。
5. 常见JVM实现
- HotSpot(Oracle):最广泛使用的JVM,强调性能优化。
- OpenJ9(IBM/Eclipse):低内存占用,适合云环境。
- GraalVM:支持多语言(如JavaScript、Python),支持AOT(提前编译)。
6. JVM的应用场景
- 运行Java程序(如Spring、Hadoop等)。
- 支持其他JVM语言:Kotlin、Scala、Groovy等。
- 微服务、大数据、Android(基于JVM的ART/Dalvik虚拟机)等场景。
7. 性能调优
- 参数调整:设置堆大小(
-Xms
,-Xmx
)、选择GC算法(-XX:+UseG1GC
)。 - 监控工具:JConsole、VisualVM、Arthas等。
- 优化方向:减少GC频率、降低停顿时间、避免内存溢出(OOM)。