1. JVM内存结构
JVM内存像办公室:
- 线程私有(个人工位):程序计数器(代码进度条)、虚拟机栈(方法待办清单)、本地方法栈(对接外部方法清单);
- 线程共享(公共区域):堆(存对象,GC主战场)、元空间(存类信息/常量的档案柜)。
2. GC回收对象判断
GC是保洁阿姨,判断垃圾有两种方式:
- 引用计数法:给对象贴计数贴,计数0则清,但会漏清互相引用的对象;
- 可达性分析:从GC Roots(核心变量)遍历,找不到的对象就是垃圾,更靠谱。
3. 垃圾回收算法
保洁阿姨的打扫方式:
- 标记-清除:标垃圾再清,易留内存碎片;
- 标记-复制:仓库分两半,搬有用对象再清一半,无碎片但费空间;
- 标记-整理:标垃圾后挤拢有用对象,清剩余空间,无碎片但稍耗时。
4. 常见垃圾回收器
不同保洁团队,适配不同场景:
- SerialGC:单线程干活,清垃圾时全办公室等,适合小内存程序;
- ParallelGC:多线程追效率,适合批量处理数据的程序;
- CMS:多和办公并行,少卡顿,适合电商/接口等场景,易留碎片;
- G1:分仓库为小块,优先清垃圾多的块,兼顾效率和低卡顿,适配多数场景。
5. 类加载过程
Java类入职登记五步:
加载(读字节码)→验证(验合法性)→准备(静态变量赋默认值)→解析(换引用为地址)→初始化(静态变量赋真实值、执行静态代码)。
6. 类加载器
收类简历的三级人员,遵循双亲委派:
- 启动类加载器(大老板):加载JDK核心类;
- 扩展类加载器(二把手):加载JDK扩展类;
- 应用类加载器(普通员工):加载自定义/第三方类;
- 双亲委派:先找父加载器,父装不了才自己装,防伪造核心类。
7. OOM常见类型
JVM内存不够罢工报错:
- 堆溢出:对象太多,仓库装不下;
- 栈溢出:方法/递归调用太深,待办清单装不下;
- 元空间溢出:类信息/常量太多,档案柜满了。
8. 四种引用区别
对象占有权不同,GC处理方式不同:
- 强引用:GC绝不回收,宁肯报错;
- 软引用:内存不足时回收,适合做缓存;
- 弱引用:GC一执行就回收,适合临时缓存;
- 虚引用:无占有权,仅跟踪对象回收,几乎不用。
总结
- JVM内存分私有/共享区,堆是GC核心;
- GC靠可达性分析判垃圾,回收算法各有优劣,回收器适配不同场景;
- 类加载有固定流程,加载器遵循双亲委派;OOM因内存不足触发,四种引用核心区别是GC回收时机不同。
浙公网安备 33010602011771号