標記清除法:
分為兩個階段,標記----清除
標記階段將所有需要回收的對象做標記,然后在清除階段將所有的標記對象回收
但是這種回收方法有很大的缺點,那就是這兩個過程的的效率並不高,兩個過程都是效率很低的過程
另外一個缺點就是標記清除之后,因為之前並沒有移動對象,每個標記的對象在空間的各個位置,清除
之后會有很多不連續的內存,在遇到需要分配一個比較大的對象的時候,會出現雖然總量上有空間容納,
但實際上因為這些內存不連續無法分配一個連續的較大的內存給這個較大對象的情況,而導致系統再次
觸發一次GC
復制算法:
復制算法是將空間分為兩個大小相等的部分,每次只使用其中的一塊,然后這一塊用完之后就將自己里面的
還存活着的對象復制到另一塊里面去,這樣的好處就是清除之后產生的內存不會出現不連續的情況,但缺點
也很明顯,那就是需要將內存縮小一半,這樣看來這種代價太大,所以之后的復制算法在這上面做出改進,將
內存分為了三個區域,一個Eden區域和兩個survivor區域(大小為8/1/1,值得提醒的是這里所說的都是新生代),
將在回收時將Eden區域和其中一個survivor中的存活的對象復制到另一個survivor中,然后將這這兩個清理,
相比於1/1的那種復制,顯然這種只浪費1/10的的空間,那么這里要問了,其實我當時也提出了這樣的問題,假如
存活對象是大於survivor的,那該怎么辦,書上給了解釋就是需要依賴其他內存來作為擔保.細節先不談,還有就是
這種復制算法,在存活對象比較多的情況下,比如老年代,效率自然就變低.所以產生了接下來這種算法
標記整理算法:
這算法之前的步驟跟第一個標記清除一樣,將對象一一標記,但之后不同的是不對對象進行處理,而是將存活對象向一端移動
然后清理另一邊的內存,這種算法更適用於老年代
分代收集:
其實就是因地制宜思想,在新生代這種會有大量對象死去的時候,采用復制算法,因為需要復制的內存少,而在老年代
就采用標記清理或者標記整理
垃圾收集器
收集算法不止一種,自然收集器也肯定不止一種,不同的收集器作用的范圍不同,所采用的算法也不同
如果將作用范圍划分為新生代和老年代的話:
連線代表兩者能搭配使用,所處區域代表作用范圍
依照書上畫了一張簡易的草圖來了解這些收集器的作用范圍,然后一一細說
Serial收集器
作用域:新生代
采用的收集算法:新生代Serial采用復制算法,老年代SerialOld采用標記整理
特點:單線程收集器,在進行收集的時候,需要暫停其他所有工作線程(Stop the world),簡單高效,對於桌面應用場景(新生代使用內存不大)是很好的選擇
缺點:在用戶不可見的情況下將用戶的工作線程都停掉,對其他應用造成影響
ParNew收集器
作用域:新生代
算法:新生代復制算法,老年代復制整理算法
特點:是Serial的多線程版本,其余跟Serial一樣,是設置-XX:+UserConcMarksSweepGC參數默認的收集器
通過設置jvm參數為-XX:+UserParNewGC來強制使用
只有以上兩種能與后面出現的並發收集器(CMS)同時工作
Parallel Scavenge收集器
作用域:新生代
采用的收集算法:復制算法
特點:多線程收集,關注點跟其他不同,他的目標是得到一個可以控制的吞吐量,即高效利用CPU時間,而其他則是盡可能縮短用戶線程的停頓時間,即有良好的相應速度提升用戶體驗
ps:吞吐量是指運行用戶代碼時間/(運行用戶代碼時間和垃圾收集時間)
Serial Old收集器
作用域:老年代
算法:標記整理算法
特點:兩大用途,一是jdk1.5之前和與ParallelScavenge一起用,另外就是作為CMS的后備方案
Parallel Old收集器
作用域:老年代
特點:注重吞吐量和CPU資源
CMS收集器(ConcurrentMarkSweep)
作用域:老年代
算法:標記清除算法
特點:以獲取最短回收停頓時間為目標
四個過程:初始標記(標記GCroot能直接關聯到的對象,GC管理的主要區域是堆,所以方法區,棧,本地方法區這些不被GC管理的區域的對象一般用於做GCRoots),
並發標記(GC root Tracing),重新標記(修正因為用戶操作而標記有變動的對象的標記記錄),並發清除,收集過程可以和用戶線程並發執行
缺點:-對CPU資源敏感,所以在跟用戶進程並發執行的過程中會占用CPU資源導致應用程序變慢,吞吐量降低
-無法處理浮動的垃圾,即在運行過程中產生的垃圾(收集過程中用戶進程沒有停止,所以垃圾還在產生)
-標記清除,會造成空間碎片化,在大的對象產生時候內存分配會遇到麻煩
G1收集器
作用域:
算法:整體標記整理局部復制算法
特點:四大特點:
1,並行與並發,G1能利用多CPU多核心的硬件優勢,來縮短STW的時間
2,分代收集
3,空間整合,上面所說的CMS的缺點就是空間碎片化,而G1采用整體標記整理局部復制算法的方法來使得空間的碎片化情況得到解決
4,可預測的停頓,建立了可以預測的停頓時間的模型,能讓使用者明確指定一個長度為M毫秒的時間片段內,消耗在垃圾收集上的時間不得超過N毫秒
感覺這部分知識還需要慢慢啃,一下子搬上來概念或者概述也沒啥用...