Java 内存回收机制是如何工作的?
在 Java 的世界里,内存管理的核心任务交给了垃圾回收器(Garbage Collector,简称 GC)。
Java 的内存布局大致分为堆(Heap)和栈(Stack)等区域。绝大多数对象实例都诞生在堆上。当我们 new 一个对象时,JVM 就会在堆空间中划出一块内存给它。
GC 的主要职责就是清理那些已经'死亡'的对象,把占用的内存还回去。那么它怎么知道谁该走呢?靠的是可达性分析算法。
想象一下,GC 从一组被称为 GC Roots 的对象出发,顺着引用链往下找。如果某个对象跟任何 GC Roots 都连不上线,那它就是不可达的,自然也就成了回收对象。
常见的 GC Roots 来源包括:
- 虚拟机栈中引用的对象
- 方法区中类静态属性引用的对象
- 方法区中常量引用的对象
- 本地方法栈中 JNI 引用的对象
实际运行中,GC 动作通常会伴随 Stop The World (STW)。这意味着为了安全起见,GC 会先暂停所有正在运行的应用线程。之后才会进入具体的回收流程,比如标记、清除或者复制。
- 标记阶段:识别哪些对象是存活的,哪些是死的。
- 清除阶段:直接回收那些被标记为不可达对象的内存。
- 复制阶段:将存活的对象复制到另一个区域(通常是 Survivor 区),以此整理碎片并腾出空间。
理解这套机制,对于排查 OOM 问题或优化 JVM 参数很有帮助。

