gc只关注线程共享区域,因线程私有区域(程序计数器、虚拟机栈、本地方法栈)随线程生灭自动释放;堆是gc最主要目标,含新生代(eden、survivor)、老年代;jdk 8+元空间取代永久代存放类元数据,也参与gc;程序计数器、栈、堆外内存不参与gc。

JVM内存布局中,GC只关注线程共享区域,因为线程私有区域(如程序计数器、虚拟机栈、本地方法栈)随线程生灭自动释放,无需回收。
堆内存(Heap)是GC最主要的目标区域
所有通过 new 创建的对象实例、数组都分配在堆中。堆又被划分为:
- 新生代(Young Generation):含 Eden 区、Survivor From、Survivor To
- 老年代(Old Generation)
- (JDK 8+)元空间(Metaspace),取代了永久代,存放类元数据
GC行为按区域分工:
- Minor GC 针对新生代,触发条件是 Eden 区满
- Major GC / Old GC 针对老年代,通常由晋升对象填满老年代引发
- Full GC 涉及整个堆 + 元空间,常见于老年代或元空间不足、显式调用 System.gc()(不保证执行)
方法区(Method Area)及其子区域也参与GC
方法区存放类信息、常量池、静态变量等。JDK 8 后,这部分逻辑上归入元空间(Metaspace),由本地内存实现,当类加载过多导致元空间耗尽时,会触发元空间清理——这也属于GC范畴。
哪些区域完全不参与GC?
- 程序计数器(PC Register):无OOM风险,不涉及对象生命周期
- JVM 栈和本地方法栈:方法结束即自动弹栈,栈帧销毁,无垃圾回收机制
- 堆外内存(如 DirectByteBuffer 分配的内存):不受JVM GC管理,但堆内会保留引用以配合清理逻辑
GC Roots 的扫描范围始终限定在堆与方法区/元空间内,其他区域不在可达性分析路径中。











