JVM
2025/9/22大约 3 分钟
JVM
运行时数据区域
线程独享
- 虚拟机栈
- 本地方法栈
- 程序计数器(pc)
线程共享
- 方法区
- 堆

分配内存
- 指针碰撞
- 要求内存是规整
- TLAB形式
- 空闲列表
- 需要有个记录
对象内存分布
- 对象头
- markword
- 指向对象类型的指针
- 数组长度(如果是数组的话)
- 实例数据
- 对其填充
对象的访问定位
- 句柄
- 直接指针
如何判定一个对象已经死了
引用计数法
加一个计数,有引用就+1 失效就-1 为0就回收
- 实现很简单
- 当遇到循环引用的时候 很不好解决
可达性分析
- GC Roots
- 虚拟机栈中的对象
- 方法区中 静态属性
- 方法区常量引用
- 本地方法栈 JNI引用对象
- 虚拟机内部引用
- 同步锁持有的
java引用分类
- 强
- 软
- 弱
- 虚
练习
分别找出强软弱虚引用的例子或者在java 中本身就使用的例子
⭐垃圾收集算法
分代收集理论
- 弱分代假说
- 大部分的对象 活不过明天早起
- 强分代假说
- 活着的可以活很久
- 跨带引用假说
- 跨带的比同代的少很多
标记清除算法
- 效率不稳定
- 空间碎片化
复制算法
移动对象
实现很简单 很高效
没有碎片
空间利用率笔比较低
标记整理算法
- 移动对象
- 移动对象带来的开销很大
- 内存是规整的
卡表 写屏障 三色标记
要有基础的认识 面试加分项
经典垃圾收集器
- g1
- region
- 停顿时间模型
- 面向整堆 但又不全堆收集 的混合收集模式
- 整体上看 基于标记整理 局部上看 标记复制
- cms
- 初始标记
- 并发标记
- 重新标记
- 并发清除
- 标记--清除算法
- 并发收集 低停顿
- 处理器资源敏感
- 浮动垃圾问题
- 空间碎片问题
- zgc&&Shenandoah
内存分配和回收策略
优先在eden
大对象直接进入老年代
长期存活的进入到老年代(活过15岁)
如果同年龄的大于survivor的一半 那么该年龄以及大于该年龄的进入老年代
空间分配担保

类文件结构
⭐类加载机制
类加载过程
加载
- 三板斧
连接阶段
- 验证
- 各种验证
- 准备
- 静态域初始化为零值
- final static 初始化为对应值
- 解析
- 符号引用->直接引用
- 验证
初始化
- 就把静态变量赋值了
使用
- new
卸载

触发初始化
对这个类主动进行调用
new 对象
读写静态域的值
调用静态方法
反射
父类优先于子类
main方法所在类
动态语言支持的是 涉及到四中类型方法句柄的
接口有默认方法 如果实现接口子类初始化 那么要优先初始化接口
类加载模型
双亲委派
启动类加载器
扩展类加载器
应用程序类加载器
工作流程
破坏型双亲委派
- java 1.2 之前
- 自己缺陷导致 jndi jdbc
- OSGi
运行时的栈帧结构
局部变量包
没有存储变量的名字
优化
- 方法内联
- 冗余访问消除
- 复写传播
- 无用代码消除
逃逸分析
- 栈上分配
- 标量替换
- 同步消除
