一、什麼是GC
Java GC(Garbage Collection,垃圾收集,垃圾回收)機制,是Java與C++/C的主要區別之一,在使用JAVA的時候,一般不需要專門編寫記憶體回收和垃圾清理程式碼。這是因為在Java虛擬機器中,存在自動記憶體管理和垃圾清掃機制。
二、關於GC的三種演算法
1、複製演算法(Copying):在JVM的堆記憶體當中,新生代使用的是複製演算法。新生代的記憶體區域又分成Eden、From、To三個區域,這三個區域的記憶體佔用比例是8:1:1,新建立(new)出來的物件存放在Eden區和From區中,當整兩個區的記憶體到達一定的佔用量後,會進行輕量級的垃圾回收(Minor GC),將存活下來的物件年齡+1,並將存活下來的物件複製到To區,此時Fron區和To區進行交換(區分From區和To區:誰空誰是To,並且From區和To區是不斷交換的)。當一個物件的年齡達到15時,將此物件從新生代移動到老年代。優點:不產生記憶體碎片問題,能保持物件的完整性。缺點:因為要一致保持To區是空的,浪費了一定的記憶體空間。
2、標記清除/標記整理演算法(Full GC 或者 Major GC):老年代一般是由標記清除或者是標記清除和整理的混合實現。
(1)標記清除演算法:Mark-Sweep步驟一:標記:從根集合開始掃描,對存活的物件進行標記步驟二:清除:再次掃描整個記憶體空間,回收未被標記的物件,使用free-list記錄可用區域。優點:兩次掃描,耗時嚴重,會產生記憶體碎片。缺點:不需要佔用額外空間。
(2)標記整理演算法:Mark-Compact標記/整理演算法唯一的缺點也是效率不高,不僅要標記所有存活物件,還要整理存活物件的引用地址。從效率上來說,標記/整理演算法要低於複製演算法
。三、三種演算法的一些小結記憶體效率:
複製演算法>標記清除演算法>標記整理演算法。
記憶體整齊度:複製演算法=標記整理演算法>標記清
一、什麼是GC
Java GC(Garbage Collection,垃圾收集,垃圾回收)機制,是Java與C++/C的主要區別之一,在使用JAVA的時候,一般不需要專門編寫記憶體回收和垃圾清理程式碼。這是因為在Java虛擬機器中,存在自動記憶體管理和垃圾清掃機制。
二、關於GC的三種演算法
1、複製演算法(Copying):在JVM的堆記憶體當中,新生代使用的是複製演算法。新生代的記憶體區域又分成Eden、From、To三個區域,這三個區域的記憶體佔用比例是8:1:1,新建立(new)出來的物件存放在Eden區和From區中,當整兩個區的記憶體到達一定的佔用量後,會進行輕量級的垃圾回收(Minor GC),將存活下來的物件年齡+1,並將存活下來的物件複製到To區,此時Fron區和To區進行交換(區分From區和To區:誰空誰是To,並且From區和To區是不斷交換的)。當一個物件的年齡達到15時,將此物件從新生代移動到老年代。優點:不產生記憶體碎片問題,能保持物件的完整性。缺點:因為要一致保持To區是空的,浪費了一定的記憶體空間。
2、標記清除/標記整理演算法(Full GC 或者 Major GC):老年代一般是由標記清除或者是標記清除和整理的混合實現。
(1)標記清除演算法:Mark-Sweep步驟一:標記:從根集合開始掃描,對存活的物件進行標記步驟二:清除:再次掃描整個記憶體空間,回收未被標記的物件,使用free-list記錄可用區域。優點:兩次掃描,耗時嚴重,會產生記憶體碎片。缺點:不需要佔用額外空間。
(2)標記整理演算法:Mark-Compact標記/整理演算法唯一的缺點也是效率不高,不僅要標記所有存活物件,還要整理存活物件的引用地址。從效率上來說,標記/整理演算法要低於複製演算法
。三、三種演算法的一些小結記憶體效率:
複製演算法>標記清除演算法>標記整理演算法。
記憶體整齊度:複製演算法=標記整理演算法>標記清