内存管理与 GC

官官方信息技术老师·7 页·深入(追求细节与边界)·0 次浏览·33 天前
信息技术大学

内存管理与 GC

计算机基础面试八股 · 第 4 章 编程语言与工程素养

按 空格/→ 演示下一步

问一句
1 / 7 页

全部页面点击任意一页,跳回舞台从这页播放

信息技术大学

内存管理与 GC

计算机基础面试八股 · 第 4 章 编程语言与工程素养

1第 1 页 · 内存管理与 GC

GC 基本算法(标记清除/复

GC 的招式两段式:先标记出活对象,再清除、复制或整理;分代按年龄区别对待。

标记清除
标记存活后清除垃圾,简单但产生碎片
复制
活对象搬到另一半空间,无碎片但费空间
标记整理
标记后向一端移动压实,无碎片但搬移有成本
分代
新生代朝生夕死用复制,老年代稳定用整理
2第 2 页 · GC 基本算法(标记清除/复

主流语言 GC 对比(JVM/Go

同是 GC,取舍不同:JVM 分代精细,Go 追求极低停顿,JS 靠增量不让页面卡。

JVM
分代收集器家族,G1/ZGC 停顿毫秒级以内
Go
三色标记并发清扫,停顿亚毫秒
JS/V8
增量标记加分代,主线程不卡动画帧
3第 3 页 · 主流语言 GC 对比(JVM/Go

内存泄漏排查

GC 语言也会泄漏:被引用着的垃圾,要用堆快照对比找出谁扣着不放。

症状
内存阶梯式爬升,Full GC 越来越频繁
堆快照
两次快照对比增长对象,顺引用链找持有者
常见嫌犯
静态集合、无界缓存、未注销的监听器
4第 4 页 · 内存泄漏排查

逃逸分析

对象不一定上堆:逃逸分析发现对象没跑出方法,直接栈上分配或标量替换。

逃逸
被外部引用或返回即逃逸,必须堆分配
不逃逸
栈上分配随栈帧回收,GC 压力大减
同步消除
确认无线程竞争,锁直接被去掉
5第 5 页 · 逃逸分析

本节要点

  • ✓标记、复制、整理,分代区别对待
  • ✓JVM 精细分代,Go 亚毫秒停顿
  • ✓泄漏是「被引用的垃圾」,快照对比定位
  • ✓不逃逸就栈上分配,GC 减负
延伸主题:抓一次 Full GC 日志对比两份堆快照
6第 6 页 · 本节要点

课后思考

先自己回答,再展开参考答案——能讲出来才算真懂。

1复制算法空间利用率只有一半,为什么新生代还用它?

参考答案新生代对象朝生夕死,每次回收存活率不到 10%,Eden 加两块 Survivor 只需约 10% 的空间预留;用少量空间换无碎片、无搬移的高效回收,这笔账很划算。

2Go 的 GC 为什么不分代?

参考答案分代靠写屏障记录跨代引用,而 Go 的逃逸分析已把大量短命对象留在栈上,堆对象寿命分布不符合分代假设;并发三色标记做到亚毫秒停顿,已经足够好。

3有了 GC 为什么还谈内存泄漏?

参考答案GC 只回收不可达对象;被静态集合、监听器、ThreadLocal 长期可达的对象永远「活着」,这就是泄漏。GC 免去的是手动释放,免不了引用关系管理。

7第 7 页 · 课后思考
内存管理与 GC · 知识图解