java垃圾回收到老年代次数,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
(一般能說出三點就可以,三點以上就更好)
總結
以上是生活随笔為你收集整理的java垃圾回收到老年代次数,Java垃圾回收之回收算法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php strval,PHP strva
- 下一篇: php中qq第三方登录演示,实现腾讯qq