目的:寫給自己看的,不如其他大神全,以後慢慢修修改改 一:如何判斷數據是否垃圾數據 1.引用計數法 當創建一個對象時,為此對象分配一個引用計數器。當有其他對象引用這個對象時,計數器就+1。當引用失效了,計數器-1。 當一個對象的引用計數器=0時,此對象就可以被回收。 優點:原理簡單,實現方便。 缺點 ...
目的:寫給自己看的,不如其他大神全,以後慢慢修修改改
一:如何判斷數據是否垃圾數據
1.引用計數法
當創建一個對象時,為此對象分配一個引用計數器。當有其他對象引用這個對象時,計數器就+1。當引用失效了,計數器-1。
當一個對象的引用計數器=0時,此對象就可以被回收。
優點:原理簡單,實現方便。
缺點:不能解決對象間迴圈引用問題,容易造成記憶體泄漏。
String a=hello
String b=weold
a=b
b=a
上面的例子中,這兩個對象的引用計數器永遠不為0,回收不掉,造成記憶體泄漏。
2.可達性分析法
這種演算法的思想:判斷一個對象和GC Root是否有相連的引用鏈,如果沒有,則可以進行回收。這種演算法解決了引用計數法的缺點(對象間迴圈引用問題)
二、如何回收垃圾(回收垃圾的方法)
1.Mark-Sweep 標記清除演算法
缺點:回收之後會產生大量不連續的記憶體碎片,導致記憶體環境質量下降。印象是:當分配一個較大對象時,如果找不到連續的記憶體地址空間,則會提前出發一次GC(Full GC-全堆GC)
2.Copying演算法 複製演算法
優點:解決了Mark-Sweep的記憶體碎片問題
缺點:記憶體利用率較低,只有50%
根據研究,新生代的對象98%都是用完即扔。所以再劃分記憶體空間大小時,按Eden(80%)和兩塊Survivor(10%)。每次是使用Eden和其中的一塊Survivor。所以在這種優化下,新生代的記憶體利用率達到了90%。
3.Mark-Compact 標記整理演算法
這種演算法是基於標記清除演算法做的改進。在進行垃圾清除過後進行碎片整理。
針對老生代的垃圾數據回收:①Mark-Sweep ②Mark-Compact
補充的概念:
新生代的GC稱為:Minor GC 頻率高
老生代的GC稱為:Major(Full) GC 頻率低
當發生Full GC時,是全堆GC,所以GC時間很長。
所以GC調優的目的是:儘量減少Full GC的出現或者延遲Full GC的到來
三、GC收集器
左圖表示Java目前所支持的7種垃圾收集器。有連線表示可以配合使用。比如Serial和Serial Old可以一起使用。如果沒有連線,就不能一起使用。
1.Serial 單線程收集器,特點是:垃圾回收時,會暫停所有的工作線程,而且停頓時間較長。這是java最早的收集器。
Serial的使用場景:可以回收桌面系統的垃圾
2.ParNew 多線程收集器。用於回收新生代的垃圾數據。因為是多線程收垃圾,所以停頓時間比Serial更短。
此外,ParNew還可以和CMS配合使用。CMS收集器停頓時間是最短的。
3.CMS(Concurrent Mark Sweep)
併發低停頓收集器。即回收垃圾時,CMS的間隔最短。
CMS的使用場景:對於伺服器響應要求低延遲的場景使用,即註重伺服器的低延遲相應速度。
比如HBase框架,後臺在回收垃圾時,用的就是CMS。
CMS將垃圾回收分為4個過程:
1)初始標記 有停頓,僅是掃描對象引用鏈,所以停頓時間非常短。
2)併發標記
3)重新標記 有停頓,僅是掃描對象引用鏈,所以停頓時間非常短,作用是修正併發標記階段的引用鏈變化
4)併發清除 垃圾清除階段變為和用戶併發處理機制,因為清除垃圾的時間是最長的,所以這樣設計的目的可以極大的降低停頓的時間。並且清除垃圾的線程數可以調節。
優點:停頓時間最短,所以也稱為併發停頓收集器
缺點:
①:CMS會產生浮動垃圾,這些浮動垃圾只能等到下一次GC時才能收掉。
②:垃圾收集線程和用戶線程一起工作,共同搶用CPU時間片,所以可能會降低正常工作線程的執行效率。
③:CMS(Concurrent Mark Sweep)底層在回收垃圾時,用的時標記-清除演算法,雖然快,但是會產生記憶體碎片。所以需要定期做碎片整理。
4.Parallel 吞吐量優先收集器
這類收集器並不關註回收的停頓長短,而是關註回收的吞吐量。
5.G1GC
G1GC捨棄了傳統GC收集器的特點,不再將整個heap分為新生代和老生代,而是再heap創建一個一個的區域塊(大小可以設置,最小是1MB,最大是32MB)進行處理。每一個區域塊內部不進行新舊分區。而是整體被標記為Eden/Survivor/Old。
優點:
1.記憶體利用率非常高,利用了整個Heap的記憶體空間。而之前的傳統GC收集器可能出現的情況:新生代記憶體緊張,老生代記憶體空餘,這就是一種資源浪費的體現。
所以對一個伺服器來說,記憶體越大,G1GC優勢越明顯。
2.對於GC,有兩種,分別是Minor GC和Full GC。如果使用G1,觸發Full GC的條件是:在整個Heap中找不到全空區域時才會發生Full GC。
所以,使用G1,發生Full GC的頻次更低。
3.G1 GC引入了RememberSet的概念,避免在整個堆中掃描引用鏈,使得每個區域塊的GC更快、更加獨立。RememberSet記錄了當前區域塊中對象的引用關係。