JVM學習-垃圾收集器(二)

Serial回收器:串行回收
  • Serial收集器是最基本、歷史最悠久的收集器JDK1.3之前新生代唯一的選擇
  • Hotpot中Client模式下的默認新生代垃圾收集器
  • 采用復制算法,串行回收“Stop-the-world”機制的方式執行內存回收
  • 除了年輕代之外,Serial收集器還提供用于執行老年代垃圾收集的Serial Old收集器,Serial Old收集器同樣采用了串行回收和“Stop-the-world”機制,只不過內存回收算法使用的是標記-壓縮算法
  • Serial Old是運行在Client模式下的默認老年代垃圾回收器
  • Serial Old在Server模式下有兩個用途①與新生代Parallel Scavenge配合使用②作為老年代CMS收集器的后備垃圾收集方案
  • 優勢:簡單而高效,對于限定單個CPU的環境來說,Serial由于沒有線程交互的開銷,專心做垃圾收集
  • 在用戶的桌面應用場景中,可用內存一般不大,可以在較短時間內完成垃圾收集,只要不頻繁發生,使用串行回收器可以接受
  • 在Hotspot虛擬機中,使用-XX:+UseSerialGC參數可以指定年輕代和老年代都使用Serial
    在這里插入圖片描述
    注:Serial收集器是一個單線程收集器,單線程不僅僅說明它只會使用一個CPU或一條收集線程去完成垃圾收集工作,更重要的是在它進行垃圾收集時,必須暫停其他所有的工作線程,直到它收集結束(Stop The World)
//運行參數:-XX:+PrintCommandLineFlags -XX:+UseSerialGC
public class GCUseTest {public static void main(String[] args) {List<byte[]> list = new ArrayList<>();while (true) {byte[] arr = new byte[100];list.add(arr);try {Thread.sleep(10);} catch (InterruptedException e) {e.printStackTrace();}}}
}
//運行結果
-XX:InitialHeapSize=534181568 -XX:MaxHeapSize=8546905088 -XX:+PrintCommandLineFlags -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:-UseLargePagesIndividualAllocation -XX:+UseSerialGC 
ParNew回收器:并行回收
  • Serial收集器的多線程版本
  • Par是Parallel的縮寫,New:只處理的是新生代
  • ParNew收集器除了采用并行回收的方式執行內存回收外,兩款垃圾收集器之間幾乎沒有任何區別,ParNew收集器在年輕代中同樣也是采用復制算法、"Stop-The-World"機制
  • ParNew是很多JVM運行在Server模式下新生代的默認垃圾收集器
  • 對于新生代,回收次數頻繁,使用并行方式高效
  • 對于老年代,回收次數少,使用串行方式節省資源(并行需要線程切換,串行活動線程切換)
    在這里插入圖片描述
  • 參數配置:
  • -XX:+UseParNewGC手動指定使用ParNew收集器執行內存回收任務,表示年輕代使用并行收集器,不影響老年代,JDK9已經被移除了
  • -XX:ParallelGCThreads 限制線程數量,默認開啟和CPU數量相同的線程數
Parallel Scavenge回收器:吞吐量優先
  • Parallel Scavenge收集器同樣也采用了復制算法、并行回收和“Stop-The-World”機制
    • 和ParNew收集器不同,Parallel Scavenge收集器的目標則是達到一個可控制的吞吐量,它被稱為吞吐量優先的垃圾收集器
    • 自適應調節策略也是Parallel Scavenge與ParNew一個重要區別
  • 高吞吐量可以高效地利用CPU時間,盡快完成程序的運算任務,主要適合運算而不需要太多交互的任務,因此,常見在服務器環境中使用,如執行批量處理、訂單處理、工資支付、科學計算的應用程序
  • Parallel收集器在JDK1.6時提供了用于執行老年代垃圾收集的Parallel Old收集器,用來代替老年代的SerialOld收集器
  • Parallel Old收集器采用標記-壓縮算法,便同樣也是基于并行回收和Stop-the-world
  • JDK8中默認垃圾收集器
    在這里插入圖片描述
  • 參數配置
  • -XX:+UseParallelGC:手動指定年輕代使用Parallel并行收集器執行內存回收任務
  • -XX:+UseParallelOldGC:手動指定老年代都是使用并行回收器
  • 分別適用于新生代和老年代,默認jdk8開啟
  • 上面兩個參數,默認開啟一個,另一個也開啟**(互相激活)**
  • -XX:ParallelGCThreads:設置年輕代并行收集器的線程數,最好與CPU核心數相等,以避免過多的線程數影響垃圾收集性能。
  • 默認情況下,當CPU數量小于8個,ParallelGCThreads的值等于CPU數量
  • 當CPU數量大于8個,ParallelGCThreads的值等于3 + [5 * CPU_Count]/8
  • -XX:MaxGCPauseMills:設置垃圾收集器最大停頓時間,單位毫秒
  • 為了盡可能把停頓時間控制在MaxGCPauseMills以內,收集器在工作時會調整Java堆大小或者其他一些參數
  • 對于用戶來講,停頓時間越短體驗越好,但是在服務器端,我們注重高并發,整體的吞吐量,所以服務器端適合Parallel,進行控制
  • 該參數使用需謹慎
  • -XX:GCTimeRatio:垃圾收集時間占總時間的比例(1/(N+1))用于衡量吞吐量的大小
  • 取值范圍(0,100),默認99,也就是垃圾回收時間不超過1%
  • 當前一個-XX:MaxGCPauseMillis參數有一定矛盾性,暫停時間越長,Ratio參數容易超過設定的比例
  • -XX:UseAdaptiveSizePolicy:設置Parallel Scavenge收集器具有自適應調節策略
  • 在這種模式下,年輕代的大小、Eden和Surivior的比例、晉升老年代的對象年齡等參數會被自動調整,已達到在堆大小、吞吐量和停頓時間之間的平衡點
  • 在手動調優比較困難的場合,可以直接使用這種自適應的方式,僅指定虛擬機的最大堆、目的的吞吐量(GCTimeRatio)和停頓時間(MaxGCPauseMills),讓虛擬機自己完成調優工作
CMS回收器-低延遲
  • 在JDK1.5時期,Hotpot推出了一款在強交互應用中幾乎可認為有劃時代意義的垃圾收集器,CMS(Concurrent-Mark-Sweep)收集器,它第一次實現了讓垃圾收集線程與用戶線程同時工作
  • CMS收集器的關注點是盡可能縮短垃圾收集時用戶線程的停頓時間,停頓時間越短就越適合與用戶交互的程序,良好的響應速度對能提升用戶體驗
  • 目前很大一部分的Java應用集中在互聯網站或BS系統的服務器上,這類應用尤其重視服務的響應速度,希望系統停頓時間最短,以給用戶帶來較好體驗,CMS符合這類應用
  • CMS采用標記-清除算法,并且也會Stop-The-World
  • JDK14已經刪除
CMS工作原理
  • 初始標記(Initial-Mark)階段:這個階段中,程序中所有的工作線程都會因為Stop-the-World機制而出現短暫的暫停,這個階段的主要任務僅僅標記出GCRoots能直接關聯的對象,一旦標記完成后就會恢復之前被暫停的所有應用線程,由于直接關聯的對象比較小,所以速度很快
  • 并發標記(Concurrent-Mark)階段:從GC Roots的直接關聯對象開始遍歷整個對象圖的過程,這個過程耗時較長但是不需要停頓用戶線程,可以與垃圾收集線程一起并發運行
  • 重新標記(Remark)階段:由于在并發標記階段中,程序的工作線程會和垃圾收集線程同時運行或交叉運行,因此為了修正并發標記期間,因用戶程序繼續動作而導致產生變動的那一部分對象的標記記錄,這個階段的停頓時間會比初始標記階段稍長一些,但也遠比并發標記階段的時間短
  • 并發清除(Concurrent-Sweep)階段:此階段清理掉標記階段判斷的已經死亡的對象,釋放內存空間,由于不需要移動存活對象,所以這個階段也是可以與用戶線程同時并發的

待續… …

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/14026.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/14026.shtml
英文地址,請注明出處:http://en.pswp.cn/web/14026.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

TG-5006CG溫補晶振在WiFi6無線路由器模塊的應用

WiFi6無線路由器是采用了wiFi6技術的無線網絡設備&#xff0c;旨在為家庭、辦公室或其他場所提供高速、穩定的無線網絡連接。它不僅能實現更高的數據傳輸速率和更低的延遲&#xff0c;還提供了更先進的加密和安全措施&#xff0c;確保用戶數據安全。為了支持這些高級功能&#…

深入 Rust 標準庫,Rust標準庫源代碼系統分析

系列文章目錄 送書第一期 《用戶畫像&#xff1a;平臺構建與業務實踐》 送書活動之抽獎工具的打造 《獲取博客評論用戶抽取幸運中獎者》 送書第二期 《Spring Cloud Alibaba核心技術與實戰案例》 送書第三期 《深入淺出Java虛擬機》 送書第四期 《AI時代項目經理成長之道》 …

Elasticsearch集群部署以及認證配置

文檔地址&#xff1a; 官網文檔地址&#xff1a; https://www.elastic.co/guide/index.html rpm包/源碼下載地址&#xff1a;https://www.elastic.co/cn/downloads 源碼安裝-環境準備&#xff1a; node-01 192.168.95.174 node-02 192.168.95.173 node-03 …

關于Mysql基本概念的理解

系列文章 關于時間復雜度o(1), o(n), o(logn), o(nlogn)的理解 關于HashMap的哈希碰撞、拉鏈法和key的哈希函數設計 關于JVM內存模型和堆內存模型的理解 關于代理模式的理解 關于Mysql基本概念的理解 關于軟件設計模式的理解 文章目錄 前言一、事務隔離級別二、存儲引擎1.…

【Python爬蟲】案例_斗魚

聲明&#xff1a;案例只用于學習&#xff0c;不得惡意使用 要求&#xff1a;獲取直播間標題、類型、主播、熱度&#xff0c;并實現翻頁 定位隨著網站更新可能不會實現&#xff0c;請自行更改 from selenium import webdriver from selenium.webdriver.chrome.options import…

【uniapp】CSS實現多行文本展開收起的文字環繞效果

1. 效果圖 收起狀態 展開狀態 2. 代碼實現 <view class"word-wrap" id"descriptionTxt"><view class"fold-text" v-if"isFold"><text class"fold-btn" click"changFold">全文</text&g…

【網絡安全】Linux 應急響應-溯源-系統日志排查知識點

Linux 應急響應-溯源-系統日志排查知識點匯總 1. 查看當前已經登錄到系統的用戶 (w 命令) w2. 查看所有用戶最近一次登錄 (lastlog 命令) lastlog lastlog | grep -v "Never logged in"3. 查看歷史登錄用戶以及登錄失敗的用戶 (last 和 lastb 命令) last lastb4. …

使用docker完整搭建前后端分離項目

1、docker的優勢&#xff0c;為啥用docker 2、docker的核心概念 鏡像【Image】- 只讀模板 容器【Container】- 運行鏡像的一個外殼&#xff0c;相當于一個獨立的虛擬機 倉庫【repository】- 鏡像的管理工具&#xff0c;可公開&#xff0c;可私有&#xff1b;類似git倉庫 3、c…

【前端】js通過元素屬性獲取元素

【前端】js通過元素屬性獲取元素 <div for"hc_opportunity_config">aaaaa</div>//通過屬性獲取元素document.querySelector([for"hc_opportunity_config"]) document.querySelector([屬性"屬性值"])

操作教程|通過DataEase開源BI工具對接金山多維表格

前言 金山多維表格是企業數據處理分析經常會用到的一款數據表格工具&#xff0c;它能夠將企業數據以統一的列格式整齊地匯總至其中。DataEase開源數據可視化分析工具可以與金山多維表格對接&#xff0c;方便企業更加快捷地以金山多維表格為數據源&#xff0c;制作出可以實時更…

包拯斷案 | MySQL5.7替換路上踩過的坑 一鍵get解決辦法@還故障一個真相

提問&#xff1a;作為DBA運維的你&#xff0c;是否有過這些煩惱 1、業務系統進行替換投產時&#xff0c;發現數據庫回放并行度低 2、雖然2個數據庫集群使用同一份數據&#xff0c;卻在關閉雙一后&#xff0c;二級從庫的回放效率依舊緩慢&#xff0c;不知是什么原因&#xff1f…

機器人開源項目分享,助力一戶一機器人

最初&#xff0c;因隋煬帝思念心切&#xff0c;命工匠按照柳抃的形象制作了木偶機器人&#xff0c;被認為是歷史上最早的機器人之一。這些木偶機器人通過精巧設計的機關&#xff0c;能夠執行坐、起、拜、伏等動作。 如今&#xff0c;隨著科技的發展&#xff0c;機器人已經廣泛…

從ES5邁向ES6:探索 JavaScript 新增聲明命令與解構賦值的魅力

個人主頁&#xff1a;學習前端的小z 個人專欄&#xff1a;JavaScript 精粹 本專欄旨在分享記錄每日學習的前端知識和學習筆記的歸納總結&#xff0c;歡迎大家在評論區交流討論&#xff01; ES5、ES6介紹 文章目錄 &#x1f4af;聲明命令 let、const&#x1f35f;1 let聲明符&a…

Linux磁盤初始化與fstab文件更新

環境&#xff1a; Redhat 7.9 本文操作&#xff1a; >>給disk設置分區 &#xff08;fdisk&#xff09; >>給disk設置file system格式 (mkfs ) >>創建路徑&#xff0c;并將disk mount上(mkdir和mount ) >>修改fstab文件 初始化Disk 初始化前&#xff…

Vue組件通信 - 組件傳值 / 什么是組件

1.什么是組件通信&#xff1a; 組件&#xff08;.vue&#xff09;通過某種方式來傳遞信息以達到某個目的 2.組件通信可以解決什么問題&#xff1a; 每個組件之間都有獨立的作用域&#xff0c;組件間的數據是無法共享的&#xff0c;但在實際開發中我們常常需要讓組件之間共享…

【計算機網絡原理】對傳輸層TCP協議的重點知識的總結

?????? write in front ??????? ?????????大家好&#xff0c;我是xiaoxie.希望你看完之后,有不足之處請多多諒解&#xff0c;讓我們一起共同進步????? . ?? ?xiaoxie?????????—CSDN博客 本文由xiaoxie????????? 原創 CSDN 如…

Spring Bean Map漫游:遍歷背后的生命周期奧秘

1. 引言 在Spring框架中&#xff0c;Bean的生命周期是一個復雜而精妙的過程。其中&#xff0c;遍歷存儲Bean實例的Map&#xff08;通常是DefaultSingletonBeanRegistry中的singletonObjects&#xff09;是這一過程中的重要環節。理解這個遍歷過程以及它在Bean生命周期中的作用…

桌面文件不見了怎么恢復?五種方法解決文件恢復難題,建議收藏

不小心誤刪除了桌面文件&#xff0c;導致文件丟失。事實上誤刪的文件并沒有被永久刪除&#xff0c;而是被移動到了回收站中&#xff0c;可以恢復這些文件。本文將分享多種方法&#xff0c;具體步驟如下。 方法一&#xff1a;從回收站中恢復 大多數操作系統都有回收站或垃圾桶的…

【C語言】結構體內存對齊:熱門面試話題

&#x1f525;引言 書接上文&#xff0c;我們了解關于結構體的基本知識&#xff0c;這篇將深入剖析結構體中一個重要的知識點:內存對齊 關于內存對齊是屬于熱門面試話題&#xff0c;對此單獨放在一篇來分享 &#x1f308;個人主頁&#xff1a;是店小二呀 &#x1f308;C語言筆記…

3D工業視覺

前言 本文主要介紹3D視覺技術、工業領域的應用、市場格局等&#xff0c;主要技術包括激光三角測量、結構光、ToF、立體視覺。 一、核心內容 3D視覺技術滿足工業領域更高精度、更高速度、更柔性化的需求&#xff0c;擴大工業自動化的場景。 2D視覺技術基于物體平面輪廓&#…