Java面向對象編程中的垃圾回收機制(Garbage Collection,簡稱GC)是Java虛擬機(JVM)自動管理內存的一種方式。它的主要作用是回收程序中不再使用的對象所占用的內存空間,從而避免內存泄漏和系統資源的浪費。
Java堆內存主要分為以下幾個部分:
新生代(Young Generation):新創建的對象會被分配到新生代。新生代又分為Eden區和兩個Survivor區(S0和S1)。大部分對象在創建后很快會被回收,只有經過一定次數的垃圾回收仍然存活的對象才會被晉升到老年代。
老年代(Old Generation):經過多次垃圾回收仍然存活的對象會被放入老年代。當老年代空間不足時,會觸發Full GC,回收整個堆內存(包括新生代和老年代)。
永久代(Permanent Generation):在Java 8之前,永久代用于存儲類的元數據信息。從Java 8開始,永久代被元空間(Metaspace)取代,元空間使用本地內存,大小不再受限于JVM的最大可用內存。
Java的垃圾回收機制主要包括以下幾種算法:
標記-清除(Mark-Sweep):首先標記所有可達對象,然后清除所有未被標記的對象。
復制算法(Copying):將內存分為兩個相等的部分,每次只使用其中一半。當這一半內存用完時,將存活的對象復制到另一半內存中,并清空原來的內存區域。這種算法常用于新生代的垃圾回收。
標記-整理(Mark-Compact):在標記-清除的基礎上,將存活的對象向一端移動,以便整理出連續的空閑內存。
分代算法(Generational):根據對象的生命周期,將內存劃分為新生代和老年代,針對不同代采用不同的垃圾回收策略。
Java的垃圾回收機制有多種實現方式,如Serial、Parallel、CMS(Concurrent Mark Sweep)和G1(Garbage First)。這些實現方式在垃圾回收的策略、效率和應用場景上有所不同。JVM會根據程序的運行情況自動選擇合適的垃圾回收器。