视频字幕
JVM内存模型是Java虚拟机管理内存的核心机制。它主要包括堆内存、方法区和栈内存等几个重要区域。堆内存用于存储对象实例,是垃圾回收的主要目标区域。方法区存储类信息和常量池。栈内存存储方法调用的局部变量和操作数栈。理解这些内存区域的作用是掌握垃圾回收原理的基础。
堆内存采用分代设计理念,基于大部分对象朝生夕死的假设。新生代包含Eden区和两个Survivor区,新创建的对象首先分配在Eden区。当Eden区满时触发Minor GC,存活对象被复制到Survivor区。对象在两个Survivor区之间来回复制,每次GC后存活年龄加一。当对象存活年龄达到阈值时,会被晋升到老年代。老年代存储长期存活的对象,空间更大但回收频率较低。
判定对象是否需要回收有两种主要算法。引用计数法通过统计对象被引用的次数来判定,但无法解决循环引用问题。可达性分析算法从GC Roots开始,通过引用链遍历所有可达对象,未被遍历到的对象即为垃圾对象。GC Roots包括虚拟机栈中的引用、方法区中的静态引用等。图中展示了从GC Roots可以到达对象A和B,而对象C和D形成循环引用但不可达,因此会被回收。可达性分析是现代JVM采用的主流算法。
经典的垃圾回收算法有三种。标记-清除算法分为标记和清除两个阶段,先标记所有需要回收的对象,然后统一回收,但会产生内存碎片。标记-复制算法将内存分为两块,每次只使用其中一块,回收时将存活对象复制到另一块上,然后清理当前块,解决了碎片问题但浪费一半内存。标记-整理算法结合了前两者优点,标记后不是直接清理,而是让存活对象向一端移动,然后清理边界外的内存,既避免了碎片又不浪费空间,但移动对象的成本较高。
分代回收策略根据对象存活特点采用不同的回收算法。新生代中大部分对象朝生夕死,采用复制算法进行频繁的Minor GC,回收速度快。当Eden区满时触发Minor GC,存活对象被复制到Survivor区。经过多次Minor GC后仍存活的对象会晋升到老年代。老年代中的对象存活时间长,回收频率低,采用标记-整理算法进行Major GC。当老年代空间不足时触发Major GC,这个过程耗时较长但能回收大量内存。这种分代策略充分利用了对象存活规律,提高了垃圾回收的整体效率。