垃圾回收機制算法分析【乾貨】

想學會JVM優化,必須知道垃圾回收機制中的算法,今天大概給大家來說一下,自己能夠加深下印象。

垃圾回收機制算法:


什麼是垃圾回收機制?爲什麼會有垃圾回收機制呢?finalize的作用是幹嘛的?

a).什麼是垃圾回收機制?
所謂的垃圾回收機制就是定期的回收堆內存不可達對象(不可達對象指的是:一般用不上的對象),但是不能夠強制執行的。
b).爲什麼會有垃圾回收機制呢?
俗話說得好,有一句話叫做佔着茅坑不拉屎(雖然聽上去挺難受的,但是確實是這個一個道理),垃圾回收機制的最主要作用有效的防止內存泄漏,有效的利用內存。
c).finalize的作用是幹嘛的
這個finalize作爲Object類中的方法,因此所有的類都是繼承他的。finalize()這個方法主要就是垃圾回收之前,調用這個方法
package com.aaa.demogc;

public class DemoGC {
 
 public static void main(String[] args) {
 	//創建一個對象
 	DemoGC demoGC=new DemoGC();
 	//如果demoGC不爲null的時候,System.gc()可能不會回收的
 	demoGC=null;
 	System.gc();
 }
 
 @Override
 protected void finalize() throws Throwable {
 	//這個方法是Object的方法,就是調用垃圾的回首之前會調用一次
 	System.out.println("垃圾回收之前調用了一次啊。。。。。");
 	super.finalize();
 }

}


內存溢出和內存泄漏的區別,聯繫,以及解決方案


點擊我查看:內存溢出和內存泄漏的區別、產生原因以及解決方案


垃圾回收機制算法分類



引用計數法


給對象中添加一個引用計數器,默認次數爲15,每次GC會過來判斷是否有地方引用,如果有的話,就+1,沒有的話,就-1,如果次數大於15的話,就會進入S0,就這樣循環,然後進入老年代。如果=0的時候,就會被GC認爲不可達對象,被回收。
在這裏插入圖片描述

優點以及缺點?
優點:

執行的速度比較快。

缺點:

每次加減比較浪費內存。


複製算法(可以拿複製文件作對比)

主要用於新生代中,新生代中有S0,S1兩個區域,並且兩個區域內存是一樣的。
直接上圖:
在這裏插入圖片描述

優點:

指針移動,按順序分配,簡單高效

缺點:

每次都會使內存變爲原來的一半,浪費內存


標記清除法


主要就兩個動作,標記,清除

缺點:

動作不連續,清除之後會有遺留的碎片(佔用內存空間),還需要對碎片進行清除。


標記壓縮算法


標記壓縮法在標記清除基礎之上做了優化,把存活的對象壓縮到內存一端,而後進行垃圾清理。(java中老年代使用的就是標記壓縮法)

優點:

具有連續性,沒有碎片,節省空間。


分代收集算法


主要就是將內存分爲新生代,老年代。新生代又分爲edn區,S0區,S1區。剛開始創建對象的時候會將對象放在edn區,如果使用次數超過30,會進入S0區域,往後循環,然後進入老年代。
新生代使用的是複製算法,老年代使用的是標記壓縮算法。


什麼是垃圾收集器?作用是什麼?

串行回收器(Serial Collector):單線程執行回收操作,回收期間暫停所有應用線程的執行
-XX:+UseSerialGC:設置串行收集器

  	-XX:+UseParallelGC:設置並行收集器

  	-XX:+UseParalledlOldGC:設置並行年老代收集器

  	-XX:+UseConcMarkSweepGC:設置併發收集器
並行回收器(ParNew回收器):多線程操作回收
-XX:ParallelGCThreads=n:設置並行收集器收集時使用的CPU數。並行收集線程數。

  	-XX:MaxGCPauseMillis=n:設置並行收集最大暫停時間

  	-XX:GCTimeRatio=n:設置垃圾回收時間佔程序運行時間的百分比。公式爲1/(1+n)
--------------------- 
作者:wt520it 
來源:CSDN 
原文:https://blog.csdn.net/wt520it/article/details/88575634 
版權聲明:本文爲博主原創文章,轉載請附上博文鏈接!


Tomcat優化經驗


JMeter性能測試,完整入門篇

在實戰中學習,在快樂中成長

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章