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