YoungGc:我第一次看见 GC
笔名 YoungGc 不是随便起的。JVM 里,新生对象大多出生在 Young Generation(年轻代),而清理年轻代的回收,就叫 Young GC(也常称 Minor GC)。
本周我们不只背名词,还要 亲眼看见一次 GC。
先建立内存地图(极简版)
运行时数据里,和 GC 最相关的是堆(Heap):
堆 Heap
├─ 年轻代 Young
│ ├─ Eden(伊甸区,对象出生地)
│ ├─ Survivor From
│ └─ Survivor To
└─ 老年代 Old
大多数对象朝生夕死:在 Eden 分配 → 经过几次 Young GC 仍活着 → 晋升到 Old。
这和博客名 Eden手记 完全同构:记录在「出生地」发生的事。
用代码制造可观察的分配
public class GcDemo {
public static void main(String[] args) throws Exception {
List<byte[]> list = new ArrayList<>();
for (int i = 0; i < 1000; i++) {
list.add(new byte[1024 * 1024]); // 1MB
if (i % 50 == 0) {
list.clear(); // 制造可回收对象
System.out.println("cleared at " + i);
}
Thread.sleep(50);
}
}
}
如何「看见」GC
方法一:启动参数打印 GC 日志(概念)
java -Xms64m -Xmx64m -Xlog:gc*:file=gc.log GcDemo
(不同 JDK 日志参数略有差异,JDK 9+ 常用 -Xlog:gc*。)
方法二:用可视化工具
- JDK Mission Control / VisualVM / jconsole
连上进程,看堆内存曲线起伏。每次明显回落,往往对应一次回收。
观察时问自己三句:
- 内存为什么上涨?(不断 new)
- 为什么下降?(对象没引用了,被回收)
- 年轻代和整堆曲线有何不同?
名词对照(够用版)
| 名词 | 直觉 |
|---|---|
| Eden | 新对象优先分配区 |
| Young GC / Minor GC | 主要清理年轻代 |
| Full GC | 更重的整堆回收,通常更慢,需警惕频繁发生 |
| STW (Stop-The-World) | 某些 GC 阶段会暂停应用线程 |
本周练习清单
写在最后
GC 不是魔法,是「自动回收不再使用的堆内存」。理解它,你会少写一些无意义的 System.gc(),多写一些对生命周期有意识的代码。
清理无用,留下生长——这既是 GC,也是学习。
下周:中期复盘,把前 11 周盲点清单化。
YoungGc · Eden手记
学习是第一生产力。
如发现有错误欢迎指正,欢迎交流,接受反驳。 -- by不为 :)

浙公网安备 33010602011771号