java堆結構和垃圾回收

JVM內存結構和垃圾回收
1、JVM垃圾收集算法
一、引用計數算法
每一個對象有一個引用計數屬性,新增一個引用時計數加1,引用釋放時計數減1,計數爲0時能夠回收。
此方法簡單,沒法解決對象互相循環引用的問題,還有一個問題是如何解決精準計數。
二、根搜索算法
從GC Root開始向下搜索,搜索所走過的路徑稱爲引用鏈,當一個對象到GC Root沒有任何引用鏈相連時,
則證實此對象是不可用的,不可達對象。
在java語言中,GC Root包括:
虛擬機棧中引用的對象
方法區中類靜態屬性實體引用的對象
方法區中常量引用的對象
本地方法棧中JNI引用的對象
2、垃圾回收算法
一、複製算法(Copying)java


複製算法採用從根集合掃描,並將存活對象複製到一塊新的,沒有使用過的空間中,但這種算法當控件存活的對象比較少時,
極爲高效,可是帶來的成本是須要一塊內存交換空間用於進行對象的移動。
此算法用於新生代內存回收,從E區回收到SO或者S1
二、標記清除算法(Mark-Sweep)算法


標記-清除算法採用從根集合進行掃描,對存活的對象標記,標記完畢後,再掃描整個空間中未被標記的對象,進行回收。
標記-清除算法不須要進行對象的移動,而且僅對不存活的對象進行處理,在存活對象比較多的狀況下極爲高效,
但因爲標記-清除算法直接回收不存活的對象,所以會形成內存碎片
三、標記整理壓縮算法(Mark-Compace)多線程


標記-整理算法採用標記-清除算法同樣的方式進行對象標記,但在清除時不一樣,再回收不存活的對象佔用的空間後,會將
全部的存活對象往左端空閒空間移動,並更新對應的指針,標記-整理算法是在標記清除算法的基礎上,又進行了對象的移動,
所以成本更高,可是卻解決了內存碎片的問題。併發

串行回收(serial收集器):GC單線程內存回收、會暫停全部用戶線程
一、是一個單線程的收集器,只能使用一個CPU或者一條線程去完成垃圾收集;在進行垃圾收集時,必須暫停全部其餘工做線程,直到收集完成;
二、缺點:Stop-The-World
三、優點:簡單,對於單CPU的狀況,因爲沒有多線程交互開銷,反而能夠更高效,是Client模式下默認的新生代收集器。性能


使用方法:
-XX:+UseSerialGC來開啓
Serial New+Serial Old的收集器組合進行內存回收
使用複製算法(新生代)/標記壓縮算法(老年代)
獨佔式的垃圾回收(一個線程進行GC,串行,其餘工做線程暫停)spa


並行回收(Parallel收集器):多個gc線程並行工做,但此時用戶線程是暫停的
並行回收器也是獨佔式的回收器,在收集過程當中應用程序會所有暫停,但因爲並行回收器使用多線程進行垃圾回收,所以,在併發能力比較
強的CPU上,它產生的停頓時間要短於串行回收器,而在單CPU或者併發能力較弱的系統中,並行回收器的效果不會比串行回收器好,因爲多線程
的壓力,它的實際表現極可能比串行回收器差線程


使用方法:
-XX:+UseParNewGC開啓
新生代使用並行回收收集器,老年代使用串行收集器
-XX:ParallelGCThreads指定線程數
默認是CPU的核心數,過多的線程數會影響垃圾收集性能
使用複製算法
並行的、獨佔式的垃圾回收器
新生代Parallel Scavenge回收器
一、吞吐量優先回收器
關注CPU吞吐量,即運行用戶代碼的時間/總時間,好比:JVM運行100分鐘,其中運行用戶代碼99分鐘,垃圾收集1分鐘,則吞吐量是99%,
這種收集器能最高效率的利用CPU,適合運行後臺運算
二、-XX:+UseParallelGC開啓
使用Parallel Scavenge+Serial Old的收集器組合進行垃圾回收,這也是Server模式下的默認值
三、-XX:GCTimeRatio
設置用戶執行時間佔總時間的比例,默認99,即1%的時間用來進行垃圾回收
四、-XX:MaxGCPauseMillis
設置GC的最大停頓時間
五、使用複製算法
老年代Parallel Old回收器
一、-XX:+UseParallelOldGC開啓
使用Parallel Scavenge+Parallel Old的收集器組合進行垃圾回收
二、使用標記整理算法
三、並行的、獨佔式的垃圾回收器3d


併發回收(CMS收集器):用戶線程與GC線程同時執行(不必定是並行,可能交替,但整體上是同時執行的),不須要停頓用戶線程
在CMS中用戶線程仍是須要停頓的,只是很是短,GC線程在另外一個CPU上執行
運做過程分爲4個階段:
初始標記(CMS initial mark):值標記GC Roots能直接關聯到的對象
併發標記(CMS concurrent mark):進行GC RootsTracing的過程
從新標記(CMS remark):修正併發標記期間因用戶程序繼續運行而致使標記發生改變的那一部分對象的標記
併發清除(CMS concurrent sweep)
其中標記和從新標記兩個階段仍然須要Stop-The-World,整個過程當中耗時最長的併發標記和併發清除過程當中收集器均可以和用戶線程一塊兒工做。指針


一、標記-清除算法
同時它又是一個使用多線程併發回收的垃圾收集器
二、-XX:ParallelCMSTheads
手工設定CMS的線程數量,CMS默認啓動的線程數是(ParallelGCTheads+3)/4
三、-XX:+UseConcMarkSweepGC開啓
使用ParNew+CMS+Serial Old的收集器組合進行內存回收,Serial Old做爲CMS出現"Concurrent Mode Failure"失敗後的後備收集器使用
四、-XX:CMSInitiatingOccupancyFraction
設置CMS收集器在老年代空間被使用多少後觸發垃圾收集,默認爲68%,僅在CMS收集器時有效,-XX:CMSInitiatingOccupancyFraction=70
五、-XX:+UseCMSCompactAtFullCollection
因爲CMS收集器會產生碎片,此參數設置在垃圾收集器後是否須要一次內存碎片整理過程,僅在CMS收集器時有效
六、-XX:+CMSFullGCBeforeCompaction
設置CMS收集器在進行若干次垃圾收集後再進行一次內存碎片整理過程,一般與UseCMSCompactAtFullCollection參數一塊兒使用
七、-XX:CMSInitiatingPermOccupancyFraction
設置Perm Gen使用達到多少比率時出發,默認92%對象

 

HotSpot垃圾回收器

相關文章
相關標籤/搜索