更新時(shí)間:2023年07月13日09時(shí)54分 來源:傳智教育 瀏覽次數(shù):
垃圾分代收集是Java虛擬機(jī)(JVM)中一種常用的垃圾回收策略。該策略將堆內(nèi)存分為不同的代(Generation),通常分為年輕代(Young Generation)和老年代(Old Generation)。不同代的對象具有不同的生命周期和回收頻率。
下面是Java中垃圾分代收集的一般過程:
年輕代一般分為Eden區(qū)和兩個(gè)Survivor區(qū)(通常為From和To)。當(dāng)新對象被創(chuàng)建時(shí),它們會被分配到Eden區(qū)。當(dāng)Eden區(qū)滿時(shí),會觸發(fā)Minor GC(年輕代的垃圾收集),將所有存活的對象復(fù)制到其中一個(gè)Survivor區(qū),同時(shí)清空Eden區(qū)。在Survivor區(qū)進(jìn)行多次存活后的對象會被晉升到老年代。
老年代主要存放生命周期較長的對象。當(dāng)老年代空間不足時(shí),會觸發(fā)Major GC(或Full GC),進(jìn)行老年代的垃圾收集。老年代的垃圾收集過程通常比較耗時(shí),因?yàn)樗枰獙φ麄€(gè)堆進(jìn)行掃描和整理。
接下來我們看一段簡單的Java代碼演示,展示了垃圾分代收集的過程:
public class GarbageCollectionDemo { public static void main(String[] args) { // 創(chuàng)建對象1(位于年輕代) Object obj1 = new Object(); // 創(chuàng)建對象2(位于年輕代) Object obj2 = new Object(); // 對象1不再被引用,成為垃圾 obj1 = null; // 創(chuàng)建對象3(位于年輕代) Object obj3 = new Object(); // 垃圾收集(Minor GC) System.gc(); // 創(chuàng)建對象4(位于老年代) Object obj4 = new Object(); // 對象2不再被引用,成為垃圾 obj2 = null; // 對象3不再被引用,成為垃圾 obj3 = null; // 垃圾收集(Major GC) System.gc(); } }
在上面的示例中,首先創(chuàng)建了兩個(gè)對象(obj1和obj2),它們位于年輕代。然后將obj1設(shè)置為null,表示不再引用該對象,此時(shí)obj1成為垃圾。接著創(chuàng)建了另一個(gè)對象(obj3),也位于年輕代。然后通過System.gc()觸發(fā)了垃圾收集,進(jìn)行了一次Minor GC,清理了年輕代的垃圾。
接下來,創(chuàng)建了一個(gè)對象(obj4),它位于老年代。然后將obj2和obj3都設(shè)置為null,表示不再引用它們,這兩個(gè)對象成為垃圾。再次通過System.gc()觸發(fā)了垃圾收集,這次是一次Major GC,清理了整個(gè)堆,包括老年代的垃圾。
需要注意的是,垃圾收集的具體行為取決于JVM的實(shí)現(xiàn)和配置。不同的JVM可能有不同的垃圾回收算法和策略,因此實(shí)際行為可能會有所差異。以上示例只是一個(gè)簡化的演示,實(shí)際情況可能更加復(fù)雜。
北京校區(qū)