PS:堆內(nèi)存是指JVM的內(nèi)存大小包括堆區(qū)和非堆區(qū);
-server 服務(wù)器模式運(yùn)行,-client表示客戶端運(yùn)行模式;
-Xms1G 最小JAVA虛擬機(jī)內(nèi)存1G,是JVM的內(nèi)存大小而不是堆區(qū)的大心怼;
-Xmx2G 最大JAVA虛擬機(jī)內(nèi)存2G跃赚,是JVM的內(nèi)存大小而不是堆區(qū)的大邪蚀辍;
What(是什么)
Serial(串行)垃圾收集器是最基本纬傲、發(fā)展歷史最悠久的收集器满败。
Serial收集器是串行GC收集器,其作為JVM的-client模式下的默認(rèn)收集器叹括,使用復(fù)制算法算墨,在進(jìn)行垃圾回收時(shí)會暫停其他所有的工作線程(stop the world,簡稱STW)直至回收結(jié)束汁雷,因此會影響用戶的正常使用體驗(yàn)净嘀。
JDK1.3.1前是HotSpot新生代收集的唯一選擇。
Why(為什么)
Serial收集器是串行收集器侠讯,因?yàn)樯倭硕嗑€程切換的開銷挖藏,相較于其他收集器能夠更加專注于垃圾回收,在單核場景下效率極高厢漩,并且在回收較小內(nèi)存(幾十或者一兩百兆)時(shí)膜眠,停頓時(shí)間是毫秒級的。推薦使用場景:年輕代占用幾十兆到一兩百兆的桌面應(yīng)用溜嗜。
How(怎么做)
- 使用方式:-XX:+UseSerialGC宵膨,打開該開關(guān)后,使用Serial(年輕代)+Serial Old(老年代) 組合進(jìn)行GC粱胜。
- 主要特點(diǎn):針對新生代;采用復(fù)制算法狐树;單線程收集焙压;進(jìn)行垃圾收集時(shí),必須暫停所有工作線程,直到完成涯曲;即會"Stop The World"野哭;
- Serial/Serial Old組合收集器運(yùn)行示意圖如下:
- 設(shè)置參數(shù):
"-XX:+UseSerialGC":添加該參數(shù)來顯式的使用串行垃圾收集器;
- 設(shè)置參數(shù):
- 應(yīng)用場景:依然是HotSpot在Client模式下默認(rèn)的新生代收集器幻件;
也有優(yōu)于其他收集器的地方:簡單高效(與其他收集器的單線程相比)拨黔;對于限定單個(gè)CPU的環(huán)境來說,Serial收集器沒有線程交互(切換)開銷绰沥,可以獲得最高的單線程收集效率篱蝇;在用戶的桌面應(yīng)用場景中,可用內(nèi)存一般不大(幾十M至一兩百M(fèi))徽曲,可以在較短時(shí)間內(nèi)完成垃圾收集(幾十MS至一百多MS),只要不頻繁發(fā)生零截,這是可以接受的。
- 應(yīng)用場景:依然是HotSpot在Client模式下默認(rèn)的新生代收集器幻件;
- Stop The World說明:JVM在后臺自動(dòng)發(fā)起和自動(dòng)完成的秃臣,在用戶不可見的情況下涧衙,把用戶正常的工作線程全部停掉,即GC停頓奥此,會帶給用戶不良的體驗(yàn)弧哎。但是從JDK1.3到現(xiàn)在,從Serial收集器-》Parallel收集器-》CMS-》G1稚虎,用戶線程停頓時(shí)間不斷縮短撤嫩,但仍然無法完全消除;
補(bǔ)充
ParNew收集器和Serial收集器的差異
ParNew收集器在單CPU的環(huán)境中絕對不會有比Serial收集器更好的效果祥绞,甚至由于存在線程交互的開銷非洲,該收集器在通過超線程技術(shù)實(shí)現(xiàn)的兩個(gè)CPU的環(huán)境中都不能百分之百地保證能超越Serial收集器。當(dāng)然蜕径,隨著可以使用的CPU的數(shù)量的增加两踏,它對于GC時(shí)系統(tǒng)資源的利用還是很有好處的。它默認(rèn)開啟的收集線程數(shù)與CPU的數(shù)量相同兜喻,在CPU非常多(譬如32個(gè)梦染,現(xiàn)在CPU動(dòng)輒就4核加超線程,服務(wù)器超過32個(gè)邏輯CPU的情況越來越多了)的環(huán)境下朴皆,可以使用-XX:ParallelGCThreads參數(shù)來限制垃圾收集的線程數(shù)帕识。
并行與并發(fā)的區(qū)別
- 并行(Parallel):指多條垃圾收集線程并行工作,但此時(shí)用戶線程仍然處于等待狀態(tài)遂铡。
- 并發(fā)(Concurrent):指用戶線程與垃圾收集線程同時(shí)執(zhí)行(但不一定是并行的肮疗,可能會交替執(zhí)行),用戶程序繼續(xù)運(yùn)行扒接,而垃圾收集程序運(yùn)行于另一個(gè)CPU上伪货。
GC日志參考示例
[GC [DefNew:1986K->128K(2112K), 0.0011191 secs] 27809K->27808K(30528K), 0.0011425secs] [Times: user=0.00 sys=0.01, real=0.00 secs]
和
[GC [ParNew:1990K->132K(2112K), 0.0007742 secs] 24112K->24110K(30528K), 0.0007964secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
[GC [ParNew 表示使用的是parNew收集器们衙。
[GC [DefNew 表示用的是serial收集器。