1 運行時數據區
????????JVM運行時數據區是Java虛擬機管理的內存核心模塊,主要分為線程共享和線程私有兩部分。
? ? ? ? (1)線程私有
????????????????????????① 程序計數器:存儲當前線程執行字節碼指令的地址,用于分支、循環、異常處理等流程控制?
? ? ? ? ? ? ? ? ? ? ? ??② 虛擬機棧:存儲方法調用的棧幀,包含局部變量表、操作數棧、動態鏈接、方法返回地址等?
? ? ? ? ? ? ? ? ? ? ? ? ③ 本地方法棧:服務于Native方法(如C/C++實現的方法)的執行,結構與虛擬機棧類似?
? ? ? ? (2)線程共享
????????????????????????① 堆:存儲對象實例和數組,是垃圾回收(GC)的主要區域?
????????????????????????② 方法區:存儲類元信息(如類名、字段、方法)、運行時常量池、靜態變量、即時編譯后的代碼等?(JDK 8及之后:元空間(MetaSpace),使用本地內存)
2 三大GC算法
? ? ? ? 2.1 標記-復制算法(年輕代)
? ? ? ? ? ? ? ? 原理:將內存分為兩塊(如Eden區和Survivor區),每次僅使用一塊;存活對象復制到未使用的內存塊,原內存塊整體回收?
? ? ? ? ? ? ? ? 優點:無內存碎片,對象分配效率高?
? ? ? ? ? ? ? ? 缺點:需要一塊內存;復制對象過程比較耗時
? ? ? ? 2.2 標記-清除算法
? ? ? ? ? ? ? ? 原理:從GC Roots出發,標記所有可達對象(標記);回收未被標記的對象即垃圾(清除)?
? ? ? ? ? ? ? ? 優點:實現簡單,無需移動對象
? ? ? ? ? ? ? ? 缺點:有內存碎片問題,可能導致后續大對象分配失敗?
? ? ? ? 2.3 標記-整理算法
? ? ? ? ? ? ? ? 原理:從GC Roots出發,標記所有可達對象(標記);將存活對象向內存一端移動,清理邊界外的空間?(整理)
? ? ? ? ? ? ? ? 優點:避免內存碎片,支持連續內存分配?
? ? ? ? ? ? ? ? 缺點:整理過程需STW;復制對象過程比較耗時
? ? ? ? 無論什么GC回收算法,第一階段都是標記,根據根可達性分析,從GC Roots出發開始遍歷訪問,找出有效對象。
? ? ? ? 2.4 標記算法—三色標記法
? ? ? ? ? ? ? ? 三色
? ? ? ? ? ? ? ? ? ? ? ? ① 白色:尚未遍歷過
? ? ? ? ? ? ? ? ? ? ? ? ② 黑色:本對象已經遍歷過,而且本對象引用的其他對象也全部遍歷過
? ? ? ? ? ? ? ? ? ? ? ? ③?灰色:本對象已經遍歷過,而且本對象引用的其他對象尚未全部遍歷完
? ? ? ? ? ? ? ? 基本流程
? ? ? ? ? ? ? ? ? ? ? ? ① 初始階段:所有對象都在【白色集合】中
? ? ? ? ? ? ? ? ? ? ? ? ② 將GC Roots直接引用的對象挪到【灰色集合】中,并將其從【白色集合】中去掉
? ? ? ? ? ? ? ? ? ? ? ? ③ 從【灰色集合】中獲取對象,將本對象引用的其他對象全部挪到【灰色集合】中,并從【白色集合】中去掉,將本對象挪到黑色集合中
? ? ? ? ? ? ? ? ? ? ? ? ④ 重復 步驟③ 操作,直至【灰色集合】為空時結束
? ? ? ? ? ? ? ? ? ? ? ? ⑤ 結束后,仍在【白色集合】中的對象就是垃圾,可以回收
說明:圖片引用自?https://zhuanlan.zhihu.com/p/664929804?utm_id=0
3 常見垃圾收集器
? ? ? ? 3.1 新生代(標記-復制算法)
? ? ? ? ? ? ? ? Serial New:單線程收集器
? ? ? ? ? ? ? ? ParNew:并行收集器(Serial多線程版本)
? ? ? ? ? ? ? ? Parallel Scavenge:并行回收,追求高吞吐量,高效利用CPU
? ? ? ? 3.2 老年代
????????????????Serial Old:單線程收集器(標記-整理算法)
????????????????Parallel Old:并行收集器(標記-整理算法)
? ? ? ? ? ? ? ? CMS:以?低停頓?為目標,分階段并發執行<初始標記、并發標記、重新標記、并發清除>(標記-整理算法)
? ? ? ? ? ? ? ? ? ? ? ? (1)步驟:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ①?初始標記:SWT,僅標記GC Roots能直接關聯的對象,速度比較快
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ②?并發標記:可以和用戶線程并發執行,通過GC Roots可達性算法標記所有可達對象
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ③?重新標記:STW,對并發標記階段產生的垃圾對象進行標記修正,以及更新逃逸對象
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ④?并發清除:可以和用戶線程并發執行,清除可回收對象
? ? ? ? ? ? ? ? ? ? ? ? (2)優點:支持并發收集,低停頓,能保證短時間內執行完成,達到近似并發目的
? ? ? ? ? ? ? ? ? ? ? ? (3)缺點:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ① 無法清理浮動對象
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ② 使用標記-清除算法,會產生大量內存碎片
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ③ 必須要在老年代用盡之前完成垃圾回收,否則會觸發擔保機制,退化成Serial Old收集器來進行垃圾回收,效率低下
? ? ? ? ? ? ? ? ? ? ? ? (4)使用場景:老年代垃圾回收,需低停頓的交互式應用;堆內存不宜過大(避免并發標記耗時過長)?
? ? ? ? ? ? ? ? ? ? ? ? (5)配置參數
????????????????????????????????-XX:+UseConcMarkSweepGC:啟用CMS收集器?
????????????????????????????????-XX:CMSInitiatingOccupancyFraction:設置觸發CMS回收的老年代使用率閾值(默認92%)?
????????????????????????????????-XX:+CMSParallelRemarkEnabled:啟用并行重新標記(減少重新標記時間)?
? ? ? ? 3.3 不分代
? ? ? ? ? ? ? ? G1:將堆劃分為多個大小相等的Region,采用?標記-整理算法?(全局)和?標記-復制算法?(局部)
? ? ? ? ? ? ? ? ? ? ? ? (1)原理:分治法,將堆分成若干個等大的區域Region(默認2048個,每個1-32MB)
????????????????????????(2)優點: ?低停頓;基于標記-整理算法無內存碎片;大堆友好?,支持TB級堆內存
? ? ? ? ? ? ? ? ? ? ? ? (3)缺點:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ①?內存占用?:維護RSet(記憶集)和CSet(回收集)需額外內存?
????????????????????????????????② CPU消耗?:并發標記和RSet更新增加CPU開銷?
????????????????????????????????③ 復雜調優?:需平衡停頓時間、吞吐量和Region大小等參數?
? ? ? ? ? ? ? ? ? ? ? ? (4)使用場景:大內存服務端應用;低延遲需求?;JDK 9+默認收集器?
? ? ? ? ? ? ? ? ? ? ? ? (5)配置參數
????????????????????????????????-XX:+UseG1GC:啟用G1收集器?
????????????????????????????????-XX:MaxGCPauseMillis:設置最大GC停頓時間目標(默認200ms)?
????????????????????????????????-XX:G1HeapRegionSize:指定Region大小(需為2的冪)?
????????????????????????????????-XX:G1MixedGCLiveThresholdPercent:設置混合GC中Region存活對象占比閾值(默認85%,高于此值不回收)?
????????????????ZGC:基于?并發標記-整理算法?,使用染色指針和讀屏障技術,實現亞毫秒級停頓(支持TB級堆內存管理)
4 JDK各版本默認使用垃圾收集器
?????????≤1.5??? ?Serial + Serial Old
????????1.8??? ?Parallel Scavenge+ Parallel Old
????????9~21??? ?G1
????????11/17/21??? ?新增ZGC/Shenandoah/Epsilon
通過命令行查看當前JDK默認垃圾收集器
java -XX:+PrintCommandLineFlags -version