男女做a視頻網(wǎng)站seo1搬到哪里去了
JDK8中常用如下的垃圾收集器,它們分別運用在年輕代和老年代:
ParNew : 年輕代垃圾收集器,多線程,采用標(biāo)記—復(fù)制算法。
CMS:老年代的收集器,全稱(Concurrent Mark and Sweep),是一種以獲取最短回收停頓時間為目標(biāo)的收集器。
可以通過如下JVM參數(shù)進(jìn)行配置:
-XX:+UseParNewGC
-XX:+UseConcMarkSweepGC
一、ParNew
意為“Parallel New Generation”,需要說明的是, ParNew雖然是個minor gc,但它會Stop-The-World。因此ParNew間隔時間越長越好,并且每次執(zhí)行的時間越短越好。下面是一次ParNew打印的日志
[GC (Allocation Failure) [ParNew: 367523K->1293K(410432K), 0.0023988 secs] 522739K->156516K(1322496K), 0.0025301 secs] [Times: user=0.04 sys=0.00, real=0.01 secs]
其中的時間分別表示如下:
- 用戶態(tài)消耗的CPU時間
- 內(nèi)核態(tài)消耗的CPU事件
- 操作從開始到結(jié)束所經(jīng)過的墻鐘時間(Wall Clock Time)
這里需要說明一下CPU時間與墻鐘時間的區(qū)別:
墻鐘時間包括各種非運算的等待耗時,例如等待磁盤I/O、等待線程阻塞,而CPU時間不包括這些耗時,但當(dāng)系統(tǒng)有多CPU或者多核的話,多線程操作會疊加這些CPU時間,所以讀者看到user或sys時間超過real時間是完全正常的。
因此在查看GC日志時,主要關(guān)注real對應(yīng)的時間。
二、CMS
意為“Concurrent Mark Sweep”,CMS主要分為如下幾個階段
- CMS-initial-mark???????????????????????????????? # 需要Stop the word
- CMS-concurrent-mark
- CMS-concurrent-preclean
- CMS-concurrent-abortable-preclean
- CMS-remark?????????????????????????????????????? # 需要Stop the word
- CMS-concurrent-sweep? ?
- CMS-initial-mark
這里需要特別關(guān)注CMS-initial-mark和CMS-remark這2個階段,因為這2 個階段需要Stop-The-World。對于CMS來說,也是間隔時間戟長越好,每次執(zhí)行時間越短越好。
關(guān)于這幾個階段GC日志的具體內(nèi)容,可以到網(wǎng)上查找,這里就不再一一說明了。
另外,關(guān)于CMS需要關(guān)注2個JVM參數(shù):
-XX:CMSInitiatingOccupancyFraction
-XX:+UseCMSInitiatingOccupancyOnly
1、-XX:CMSInitiatingOccupancyFraction??
老年代堆占用了多大比例時,會做一次CMS。默認(rèn)值是-1,表示不啟用。大于等于0則直接取其值,小于0則根據(jù)如下公式來計算:
?((100 - MinHeapFreeRatio) + (double)( CMSTriggerRatio * MinHeapFreeRatio) / 100.0) / 100.0
CMSTriggerRatio在JDK1.8是80
MinHeapFreeRatio在JDK1.8是40
2、-XX:+UseCMSInitiatingOccupancyOnly
一直使用上述設(shè)定的閾值,如果不指定,JVM僅在第一次使用設(shè)定值,后續(xù)則自動調(diào)整。
三、DefNew
意為“Default New Generation”,新生代Serial收集器中。由于用的少,就不介紹了。它打印的GC日志大概是這樣的。
[DefNew: 78656K->78656K(78656K), 0.0000398 secs]
四、一些重要的JVM參數(shù)
-Xms -XX:InitialHeapSize??? ? 堆內(nèi)存初始大小
-Xmx -XX:MaxHeapSize??????? 堆內(nèi)存最大大小???????? ?
-Xss -XX:ThreadStackSize??? 單個線程棧大小???????? ?
-XX:NewSize????????????? ? ? ? ???? 新生代初始堆大小
-XX:MaxNewSize????????????????? 新生代最大堆大小
-XX:OldSize????????????????????????? 老年代堆大小
-XX:MetaspaceSize????????????? 元數(shù)據(jù)區(qū)初始值(JDK1.8)
-XX:MaxMetaspaceSize?????? 元數(shù)據(jù)區(qū)最大值(JDK1.8)
-XX:SurvivorRatio???????????????? 用來設(shè)置新生代中eden空間和from/to空間的比例.
-XX:MaxTenuringThreshold? 對象從新生代晉升到老年代的年齡閾值,默認(rèn)值15
-XX:NewRatio?????????????????????? 老年代/新生代的堆內(nèi)存比例,在設(shè)置了-XX:MaxNewSize的情況下,-XX:NewRatio的值會被忽略-XX:+PrintGCDateStamps
-XX:+PrintGCTimeStamps
-XX:+PrintGC
-XX:+PrintGCDetails
?使用jinfo查看進(jìn)程的JVM參數(shù)
jinfo -flags <pid>
查看JVM參數(shù)默認(rèn)值的方法
java -XX:+PrintFlagsFinal -version
?
參考文檔
GC(Allocation Failure)引發(fā)的一些JVM知識點梳理
https://blog.csdn.net/zc19921215/article/details/83029952
[case9]頻繁GC (Allocation Failure)及young gc時間過長分析
https://segmentfault.com/a/1190000013509330
JVM常用參數(shù)說明
https://www.cnblogs.com/shjr/p/14667216.html
CMS的CMSInitiatingOccupancyFraction解析
https://blog.csdn.net/insomsia/article/details/91802923
CMS收集器幾個參數(shù)詳解 -XX:CMSInitiatingOccupancyFraction, CMSFullGCsBeforeCompaction
https://blog.csdn.net/liubenlong007/article/details/88541589
Java開發(fā)中的問題排查,性能調(diào)優(yōu),先學(xué)會閱讀GC日志
https://cloud.tencent.com/developer/article/1478419
JVM中的垃圾收集器 -- CMS
https://blog.csdn.net/wodewutai17quiet/article/details/48895893