目的:寫給本身看的,不如其餘大神全,之後慢慢修修改改java
一:如何判斷數據是否垃圾數據算法
1.引用計數法服務器
當建立一個對象時,爲此對象分配一個引用計數器。當有其餘對象引用這個對象時,計數器就+1。當引用失效了,計數器-1。多線程
當一個對象的引用計數器=0時,此對象就能夠被回收。併發
優勢:原理簡單,實現方便。框架
缺點:不能解決對象間循環引用問題,容易形成內存泄漏。優化
String a=hello線程
String b=weold設計
a=b對象
b=a
上面的例子中,這兩個對象的引用計數器永遠不爲0,回收不掉,形成內存泄漏。
2.可達性分析法
這種算法的思想:判斷一個對象和GC Root是否有相連的引用鏈,若是沒有,則能夠進行回收。這種算法解決了引用計數法的缺點(對象間循環引用問題)
2、如何回收垃圾(回收垃圾的方法)
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的到來
3、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記錄了當前區域塊中對象的引用關係。