JVM(Java虚拟机)概述(Java虚拟机(JVM)全面解析)
原创
一、JVM概述
Java虚拟机(Java Virtual Machine,简称JVM)是一种抽象的计算机,它可以在任何操作系统上执行Java字节码。JVM是Java运行时环境的一部分,负责运行Java应用程序。其关键目的是实现跨平台兼容性,即“一次编写,到处运行”。本文将全面解析JVM的架构、原理以及相关技术。
二、JVM架构
JVM关键由以下几个部分组成:
- 类加载器(Class Loader)
- 运行时数据区(Runtime Data Area)
- 执行引擎(Execution Engine)
- 本地库接口(Native Interface)
- 垃圾回收器(Garbage Collector)
2.1 类加载器
类加载器负责将Java类库中的class文件加载到JVM中。JVM中的类加载器分为三种类型:Bootstrap Class Loader、Extension Class Loader和System Class Loader。
2.2 运行时数据区
运行时数据区是JVM内存结构的核心部分,关键包括以下几个区域:
- 方法区(Method Area)
- 堆(Heap)
- 栈(Stack)
- 本地方法栈(Native Method Stack)
- 程序计数器(Program Counter Register)
2.3 执行引擎
执行引擎负责解释Java字节码,并将其转化为计算机的机器码。执行引擎包括解释器和即时编译器(JIT)。
2.4 本地库接口
本地库接口负责调用其他语言编写的本地库(如C/C++库),以便JVM能够与操作系统底层功能进行交互。
2.5 垃圾回收器
垃圾回收器负责自动回收不再使用的内存空间,以减少内存泄漏和手动内存管理的负担。
三、JVM类加载机制
JVM类加载机制包括以下几个过程:
- 加载(Loading)
- 验证(Verification)
- 准备(Preparation)
- 解析(Resolution)
- 初始化(Initialization)
3.1 加载
加载过程负责查找并加载类的二进制数据,并将其存储在方法区中。加载过程包括以下步骤:
- 通过类加载器读取类的二进制数据。
- 将二进制数据转换成方法区中的数据结构。
- 在堆中生成一个对应的java.lang.Class对象,作为方法区中类数据的访问入口。
3.2 验证
验证过程负责确保加载的类信息符合JVM规范,关键包括以下内容:
- 文件格式验证:确保class文件的格式正确。
- 语义验证:确保class文件中的字节码符合JVM规范。
- 字节码验证:确保字节码不会危害JVM的保险。
3.3 准备
准备过程负责为类变量分配内存,并设置默认初始值。这些变量所使用的内存都在方法区中进行分配。
3.4 解析
解析过程负责将类、接口、字段和方法的符号引用成为直接引用。符号引用是在类加载阶段或运行期间产生的,而直接引用是指向方法区的指针、偏移量或者是指向对象的引用。
3.5 初始化
初始化阶段是执行类构造器
四、JVM内存模型
JVM内存模型关键包括以下几个部分:
- 方法区(Method Area)
- 堆(Heap)
- 栈(Stack)
- 本地方法栈(Native Method Stack)
- 程序计数器(Program Counter Register)
4.1 方法区
方法区是JVM内存结构的一部分,用于存储已被虚拟机加载的类信息、常量、静态变量等数据。方法区是所有线程共享的内存区域。
4.2 堆
堆是JVM内存结构中最大的一块区域,用于存储对象实例。堆是所有线程共享的内存区域,其生命周期跟随虚拟机的生命周期。
4.3 栈
栈是线程私有的内存区域,用于存储局部变量。每个线程创建时都会创建一个栈,用于存储局部变量表、操作数栈、动态链接、方法出口等信息。
4.4 本地方法栈
本地方法栈是线程私有的内存区域,用于存储Native方法。本地方法栈与Java栈的作用类似,但用于服务Native方法。
4.5 程序计数器
程序计数器是线程私有的内存区域,用于存储指向下一条指令的地址。程序计数器是线程私有的,每个线程都有一个程序计数器。
五、JVM垃圾回收机制
JVM垃圾回收机制负责自动回收不再使用的内存空间。垃圾回收算法关键包括以下几种:
- 标记-清除算法(Mark-Sweep)
- 标记-整理算法(Mark-Compact)
- 复制算法(Copying)
- 分代收集算法(Generational Collection)
5.1 标记-清除算法
标记-清除算法分为标记和清除两个阶段。标记阶段标记出所有活动的对象,清除阶段清除未被标记的对象。
5.2 标记-整理算法
标记-整理算法在标记阶段与标记-清除算法相同,但在清除阶段,将所有存活的对象压缩到内存的一端,然后清理掉边界以外的内存。
5.3 复制算法
复制算法将可用内存划分为两块,每次只使用其中一块。在垃圾回收时,将存活的对象复制到另一块内存区域,然后清理掉旧的内存区域。
5.4 分代收集算法
分代收集算法将对象按照生命周期分为新生代和老年代,分别采用不同的垃圾回收算法。新生代使用复制算法,老年代使用标记-清除或标记-整理算法。
六、总结
JVM是Java运行时环境的核心组成部分,负责执行Java字节码。了解JVM的架构、类加载机制、内存模型和垃圾回收机制,对于深入懂得Java程序运行原理以及优化Java程序具有重要意义。