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