上一篇 <<<JVM垃圾回收STW(Stop-The-World)代碼演示
下一篇 >>>JVM串行并行垃圾回收器的關(guān)注點(diǎn)
垃圾回收器的發(fā)展歷史
1999年:隨JDK1.3.1一起來的串行方式Serial GC(第一款GC)婉徘,ParNew GC是SerialGC的多線程版本。
2002年:2月26日播赁,Parallel GC和Concurrent Mark Sweep GC(即CMS)跟隨JDK1.4.2一起發(fā)布梆靖。Parallel GC在JDK6之后成為Hotspot默認(rèn)GC瓢湃。
2012年:在JDK1.7u4中法瑟,G1可用。
2017年:JDK9中G1成為默認(rèn)垃圾回收器酷麦,以替代CMS.
2018年:3月,JDK10中G1的并行完整垃圾回收喉恋,實(shí)現(xiàn)并行性能改善最壞情況的延遲沃饶。
9月母廷,JDK11發(fā)布,引入Epsilon GC糊肤,又稱為“No-Op無操作”回收器琴昆,同時(shí)引入ZGC:可伸縮的低延遲回收器(Experimental)
2019年:3月,JDK12發(fā)布轩褐。增加G1椎咧,自動(dòng)返回未使用堆內(nèi)存給操作系統(tǒng);同時(shí)把介,引入Shenandoah GC:地停頓時(shí)間的GC(Experimental)
9月勤讽,JDK13發(fā)布。增強(qiáng)ZGC拗踢,自動(dòng)返回未使用堆內(nèi)存給操作系統(tǒng)脚牍。
2020年:3月,JDK14發(fā)布巢墅。刪除CMS诸狭,擴(kuò)展ZGC,在mac和windows的應(yīng)用君纫。
頻繁推出垃圾回收器的原因驯遇?
主要解決STW問題。
怎樣避免垃圾收集器頻繁回收蓄髓?
可以內(nèi)存調(diào)優(yōu):
a叉庐、堆內(nèi)存空間設(shè)置比例較大
b、堆內(nèi)存初始化與最大值一定保持一致
c会喝、生成環(huán)境中不要去調(diào)用System.gc()
垃圾回收器何時(shí)觸發(fā)收集垃圾陡叠?
當(dāng)新生代或老年代內(nèi)存滿的時(shí)候。
垃圾回收器的7種類型
串行GC:采用單線程回收垃圾肢执,用戶線程處于等待狀態(tài)枉阵,適合于堆內(nèi)存空間比較小和個(gè)人小項(xiàng)目
并行GC:多條垃圾收集線程并行工作,但用戶線程仍然處于等待狀態(tài)预茄。
并發(fā)GC:用戶線程和垃圾收集線程同時(shí)執(zhí)行兴溜,他們運(yùn)行于不同的CPU上。(不一定是并行耻陕,可能是交替執(zhí)行)
回收器 | 類型 | 算法 | 作用位置 | 特點(diǎn) | 使用場景 |
---|---|---|---|---|---|
SerialGC | 串行收集器 | 復(fù)制算法 | 新生代 | 響應(yīng)速度快 | 適合單核的客戶端應(yīng)用程序下 |
SerialGCOld | 串行收集器 | 標(biāo)記整理算法 | 老年代 | 響應(yīng)速度快 | 適合單核的客戶端應(yīng)用程序下 |
ParNew | 并行收集器 | 復(fù)制算法 | 新生代 | 響應(yīng)速度快 | 適合多核的cpu情況下拙徽,默認(rèn)與cms配合使用 |
Parallel | 并行收集器 | 復(fù)制算法 | 新生代 | 吞吐量優(yōu)先 | 適合于后端多核cpu情況下 堆內(nèi)存不是很大 |
Parallel old | 并行收集器 | 標(biāo)記整理算法 | 老年代 | 老年代吞吐量優(yōu)先 | 適合于后端多核cpu情況下 堆內(nèi)存不是很大 |
CMS | 收集器并發(fā)收集器 | 標(biāo)記清除 | 老年代 | 響應(yīng)速度快 | 適合于企業(yè)級(jí)B/S項(xiàng)目 |
G1收集器 | 并發(fā)收集器 | 標(biāo)記整理算法/復(fù)制算法 | 老年代/新生代 | 響應(yīng)速度優(yōu)先 | 適合于大型服務(wù)器端 |
垃圾回收器的組合方式
如何查看當(dāng)前垃圾回收器
a、-XX:+PrintCommandLineFlags 參數(shù)可查看默認(rèn)設(shè)置收集器類型
命令:java -XX:+PrintCommandLineFlags -version
b淮蜈、JConsole工具
如何動(dòng)態(tài)設(shè)置當(dāng)前垃圾回收器
jinfo -flag +HeapDumpAfterFullGC pid
+號(hào)表示設(shè)置當(dāng)前參數(shù)為true斋攀,-號(hào)為false。*
靜態(tài)設(shè)置請(qǐng)參考JVM串行并行垃圾回收器的關(guān)注點(diǎn)梧田、一張圖看懂CMS垃圾回收器的底層原理
淳蔼、G1能作為JDK9默認(rèn)垃圾回收器的優(yōu)勢分析
垃圾回收器和垃圾回收算法區(qū)別
垃圾收集器:串行侧蘸、并行收集、CMS鹉梨、G1讳癌、Java11的ZGC收集器,能夠降低對(duì)我們用戶線程暫停的時(shí)間或者用戶線程和GC線程同時(shí)運(yùn)行存皂。
垃圾收集算法:回收算法:標(biāo)記清除晌坤、標(biāo)記整理、標(biāo)記復(fù)制旦袋、分代算法骤菠。
相關(guān)文章鏈接:
<<<JVM整體內(nèi)存結(jié)構(gòu)的圖解,直觀明了
<<<javap命令查看對(duì)象信息及操作方法在JVM層的實(shí)現(xiàn)原理
<<<javap命令反查匯編指令匯總
<<<ClassLoader類加載器順序Demo測試與雙親委派源碼解讀
<<<自定義SPI和熱部署技術(shù)破壞類加載器的雙親委派模式
<<<JVM中對(duì)象如何完成空間分配和初始化工作
<<<JVM元空間(方法區(qū))和棧內(nèi)存溢出原因及解決方案
<<<JVM堆內(nèi)存溢出和內(nèi)存泄露問題定位和解決
<<<JVM常見死鎖問題產(chǎn)生原因和多種診斷方式
<<<服務(wù)器CPU飆升為100%問題排查及如何避免
<<<JVM內(nèi)存診斷命令和排查工具匯總
<<<JVM新生代老年代算法匯總圖解
<<<JVM垃圾回收不要手動(dòng)System.gc的真正原因
<<<JVM垃圾回收引用計(jì)數(shù)法和根搜索算法圖解
<<<JVM垃圾回收STW(Stop-The-World)代碼演示
<<<JVM串行并行垃圾回收器的關(guān)注點(diǎn)
<<<一張圖看懂CMS垃圾回收器的底層原理
<<<G1能作為JDK9默認(rèn)垃圾回收器的優(yōu)勢分析
<<<CMS和G1的漏標(biāo)問題解決及三色標(biāo)記算法圖解
<<<GC中新生代進(jìn)入老年代的方式匯總
<<<GC常用日志參數(shù)配置及分析工具說明
<<<FullGC疤孕、MinorGC商乎、STW等常見問題如何解答
<<<JVM性能調(diào)優(yōu)的評(píng)估指標(biāo)及調(diào)優(yōu)示例