Java垃圾回收之回收算法


問題:談談你了解的垃圾回收算法

1、標記-清除算法(Mark and Sweep)

  標記:從跟集合進行掃描,對存活的對象進行標記

  清除:對堆內存從頭到尾進行線性遍歷,回收不可達對象內存

優點:簡單

缺點:容易出現碎片

這個算法會導致出現大量的不連續的內存碎片,可能會導致在之后的分配較大的對象時,無法找到足夠的連續內存,會觸發另外一次垃圾回收。上圖就出現了三個內存碎片塊

 

2、復制算法(copying 適用於對象存活率低的場景,年輕代)

   2.1 分為對象面和空閑面

  2.2 對象在對象面上創建

  2.3 存活的對象被對象面復制到空閑面

  2.4 將對象面所有對象內存清除

優點:

1、解決碎片化問題

2、順序分配內存,簡單高效

3、適用於對象存活率低的場景

缺點:

1、在面對對象回收率高的情況下,就顯得力不從心了。要進行較多的復制操作,效率將會變低,

2、更關鍵的是:如果不想浪費50%的空間,就需要額外的空間進行分配和擔保,為應對對象面中對象100%存活的極端情況。

 

3、標記-整理算法(Compacting,適用於老年代中)

  標記:從根集合進行掃描,對存活的對象進行標記

  清除:移動所有存活的對象,且按照內存地址次序依次排列,然后將末端內存地址以后的內存全部回收

 

優點:

解決了標記-清除算法導致的碎片化問題(避免了內存的不連續性)

不用設置兩塊內存互換

適用於存活率高的場景

 

4、分代收集算法(Generational Collector)

  4.1 垃圾回收算法的組合拳

  4.2 按照對象生命周期的不同划分區域以采用不同的垃圾回收算法(怎樣判斷對象的生命周期?)

  4.3 目的:提高JVM的回收效率

(三個模塊,年輕代,老年代,永久代)

-------------------------------------------

(永久代被取消了,只剩下,年輕代----》復制清除算法  和   老年代---》標記清除算法或標記整理算法)

 

分代收集算法的GC分類

Minor GC---->采用復制算法,用於年輕代中

Full GC ------>

 

年輕代:盡可能快速地收集掉那些生命周期短的對象

  Eden區----》對象剛剛被創建就是放在這里,當然,如果這里不夠放,就會放到survivro或老年代上

  兩個Survivor區---》

 

-XX: MaxTenuringThreshold  這個參考可以設置對象的“歲數”,默認對象的歲數是15歲,超過這個值就被轉移到老年代---》經過15次minor gc回收之后,還存活下來的對象

 

問題:對象如何晉升到老年代中?

   1、經歷一定Minor次數依然存活的對象

   2、Survivor區中放不下的對象

   3、新生成的大對象(-XX: +PretenuerSizeThreshold )

 

常用的調優參數:

  -XX:SurvivorRatio: Eden 和其中一個Survivor的比值,默認8:1

  -XX:NewRatio :老年代和年輕代內存大小的比例

  -XX: MaxTenuringThreshold :對象從年輕代晉升到老年代經過GC次數的最大閥值

 

老年代:存放生命周期較長的對象----》采用標記-清理算法 或  標記-整理算法

  1、Full GC 和 Major GC(一般的理解是Full GC等於 Major GC,收集整個GC堆。注意:如果有人問你Major GC的時候,一定要問清楚是Full GC 還是僅僅指老年代的GC

  2、Full GC 比 Minor GC 慢,但執行頻率低

 

問題:什么時候觸發Full GC?什么條件?

  1、老年代空間不足(為了避免Full GC的發生,就避免產生大對象的生成)

  2、永久代空間不足(這個只是針對JDK7和以前的版本,這也是為什么用元空間替代永久代的原因,為了降低Full GC的頻率!!!!

  3、CMS GC時出現 promotion failed ,concurrent mode failure 

  4、Minor GC晉升到老年代的平均大小大於老年代的剩余空間

  5、調用System.gc()----->注意:這只是碼農提醒虛擬機進行Full GC操作,實際上還是在不確定的時上進行Full GC

  6、使用RMI 進行RPC或管理的JDK應用,每小時執行1次Full GC

  (一般能說出三點就可以,三點以上就更好)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM