【MapSheep】
[好记性不如烂笔头]

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一执行就回收,适合临时缓存;
  • 虚引用:无占有权,仅跟踪对象回收,几乎不用。

总结

  1. JVM内存分私有/共享区,堆是GC核心;
  2. GC靠可达性分析判垃圾,回收算法各有优劣,回收器适配不同场景;
  3. 类加载有固定流程,加载器遵循双亲委派;OOM因内存不足触发,四种引用核心区别是GC回收时机不同。
posted on 2026-01-27 11:42  (Play)  阅读(11)  评论(0)    收藏  举报