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
    连上进程,看堆内存曲线起伏。每次明显回落,往往对应一次回收。

观察时问自己三句:

  1. 内存为什么上涨?(不断 new)
  2. 为什么下降?(对象没引用了,被回收)
  3. 年轻代和整堆曲线有何不同?

名词对照(够用版)

名词 直觉
Eden 新对象优先分配区
Young GC / Minor GC 主要清理年轻代
Full GC 更重的整堆回收,通常更慢,需警惕频繁发生
STW (Stop-The-World) 某些 GC 阶段会暂停应用线程

本周练习清单

写在最后

GC 不是魔法,是「自动回收不再使用的堆内存」。理解它,你会少写一些无意义的 System.gc(),多写一些对生命周期有意识的代码。

清理无用,留下生长——这既是 GC,也是学习。

下周:中期复盘,把前 11 周盲点清单化。


YoungGc · Eden手记
学习是第一生产力。

posted @ 2026-08-10 09:30  Eden手记  阅读(4)  评论(0)    收藏  举报