簡單分析java中CMS回收器
CMS(Concurrent Mark Sweep)回收器
它使用的是標記清除算法,同時又是一個使用多線程并行回收的垃圾回收器。
CMS主要工作步驟
CMS工作時主要步驟有初始標記、并發(fā)標記、預(yù)清理、重新標記、并發(fā)清除和并發(fā)重置。其中初始標記和重新標記是獨占系統(tǒng)資源的,而預(yù)清理、并發(fā)標記、并發(fā)清除和并發(fā)重置是可以和用戶線程一起執(zhí)行的。因此它可以在應(yīng)用程序運行過程中進行垃圾回收。

根據(jù)標記清除算法,初始標記、并發(fā)標記和重新標記都是為了標記出需要回收的對象。并發(fā)清理則是在標記完成后,正是回收垃圾對象。并發(fā)重置是指在垃圾回收完成后,重新初始化CMS數(shù)據(jù)結(jié)構(gòu)和數(shù)據(jù),為下一次垃圾回收做好準備。
在整個CMS回收過程中,默認情況下,在并發(fā)標記之后,會有一個預(yù)清理的操作(也可以設(shè)置參數(shù)-XX:CMSPrecleaningEnabled,不進行預(yù)清理)。預(yù)清理是并發(fā)的,除了為正式清理做準備和檢查以外,預(yù)清理還會嘗試控制一次停頓時間。由于重新標記是獨占CPU的,如果新生代GC發(fā)生后立即觸發(fā)一次重新標記,那么一次停頓時間可能很長。為了避免這種情況,預(yù)清理時,會可以等待一次新生代GC的發(fā)生,然后根據(jù)歷史性能數(shù)據(jù)預(yù)測一下新生代GC可能發(fā)生的時間,然后在當(dāng)前時間和預(yù)測時間的中間時刻,進行重新標記。這樣,最大程度上避免新生代GC和重新標記重合,盡可能減少一次停頓時間。
CMS主要參數(shù)設(shè)置
-XX:+UseConcMarkSweepGC啟用CMS回收器
-XX:ConcGCThreads 設(shè)置并發(fā)線程數(shù)量
-XX:CMSInitiatingOccupancyFraction 設(shè)置當(dāng)老年代使用率達到N時,執(zhí)行一次CMS回收。
-XX:+UseCMSCompactAtFullCollection CMS在垃圾收集完成后,進行一次碎片整理。
-XX:CMSFullGCsBeforeCompaction 設(shè)置當(dāng)進行N次CMS回收后進行一次內(nèi)存壓縮。
-XX:+CMSClassUnloadingEnabled 使用CMS機制回收Perm區(qū)Class數(shù)據(jù)
相關(guān)文章
解決springboot配置文件組解決自動配置屬性無法注入問題
在使用Spring Boot時,可能會遇到配置文件屬性注入失敗的問題,本文描述了一個案例,其中嘗試使用profile文件組指定不同環(huán)境下的配置文件,但遇到了屬性無法成功注入的情況,提供的解決辦法是將Spring Boot的版本號從2.2.0.RELEASE升級到2.4.02024-09-09
Spring Boot 2.x 實現(xiàn)文件上傳功能
這篇文章主要介紹了Spring Boot 2.x 實現(xiàn)文件上傳功能,本文分步驟通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-01-01
spring-spring容器中bean知識點總結(jié)
在本篇文章里小編給大家分享了關(guān)于spring-spring容器中bean知識點總結(jié),有需要的朋友們可以學(xué)習(xí)下。2019-08-08

