JVM
2026年9月12日大约 2 分钟
JVM
JVM内存区域
JVM由 方法区(元空间)、堆、虚拟机栈、本地方法栈、程序计数器 组成
- 按线程共享/私有划分
- 线程共享:堆、方法区
- 线程私有:虚拟机栈、本地方法栈、程序计数器
各区域的作用
- 堆:用于存放对象实例和数组,是垃圾回收的主要区域。
- 方法区:用于存放已加载类的信息(字段和方法的信息)、以及运行时常量池。
- 虚拟机栈:Java 方法运行所需的内存空间。每次方法调用对应一个栈帧,栈顶的活动栈帧对应当前执行栈帧。
- 本地方法栈:本地方法运行所需的内存空间。(本地方法:通过 JNI 等机制调用的、由 C++ 等语言实现的方法)
- 程序计数器:用于记录当前线程正在执行的字节码的地址。
类的生命周期
类的生命周期包括,加载、连接(验证、准备、解析)、初始化、使用、卸载
- 加载:将 class 文件 加载到jvm中。
- 验证:验证是否有危害jvm的代码。
- 准备:为类变量分配内存并初始化其默认零值。
- 解析:将运行时常量池中的符号引用替换为直接引用。
- 初始化:执行编译器生成的clinit方法;给静态字段赋程序中声明的值;执行静态代码块
- 使用:创建对象
双亲委派机制
在 class 类加载到jvm中,
- 先由类本身的classload 向上委派,委派到Application classload
- Applicatiohn classload 向上委派,委派到Extention classload
- Extention classload 向上委派,委派到BootStrap classload
- 如果BootStrap classload 无法加载,再向下尝试,直到由类本身进行加载。
垃圾回收
判断对象是否存活的方法
- 引用计数法
- 可达性分析法
常见的垃圾回收算法
- 标记-清除算法
- 缺点:回收后的内存空间是碎片的
- 复制算法
- 缺点:回收的内存占用大
- 标记-整理算法
- 分代整理算法
常见的垃圾回收器
- 串行收集器:
- 并行收集器
- CMS(Concurrent Mark Sweep)
- G1
- ZGC