一.Serial和Serial Old垃圾回收器
分别用來回收新生代和老年代的垃圾對象。工作原理就是單線程運作,垃圾回收的時候會停止我們自己寫的系統的其他工作線程,讓我們系統直接卡死不動,然後讓他們垃圾回收,這個現在一般寫背景Java系統幾乎不用。
二.ParNew和CMS垃圾回收器
ParNew現在一般都是用在新生代的垃圾回收器,CMS是用在老年代的垃圾回收器,他們都是多線程并發的機制,性能更好,現在一般是線上生産系統的标配組合。
G1垃圾回收器
統一收集新生代 和老年代,采用了更加優秀的算法和設計機制。
他最大的一個特點,就是把Java堆記憶體拆分為多個大小相等的Region,可以讓我們設定一個垃圾回收的預期停頓時間。
G1可以做到讓你來設定垃圾回收對系統的影響,他自己通過把記憶體拆分為大量小Region,以及追蹤每個Region中可以回收的對象大小和預估時間,最後在垃圾回收的時候,盡量把垃圾回收對系統造成的影響控制在你指定的時間範圍内,同時在有限的時間内盡量回收盡可能多的垃圾對象。
JVM的痛點:Stop the World
在垃圾回收的時候,盡可能要讓垃圾回收器專心緻志的幹工作,不能随便讓我們寫的Java系統繼續對象了,是以此時JVM會在背景直接進入“Stop the World”狀态。也就是說,他會直接停止我們寫的Java系統的所有工作線程,讓我們寫的代碼不再運作!
jvm的優化,就是避免觸發gc,避免進入Stop the World狀态