因此停頓時間和吞吐量不可能同時調優
Jvm知識學習(五)-GC參數
一,JAVA堆
Java 堆是被所有線程共享的一塊內存區域,在虛擬機啓動時創建。這個區域是用來存放對象實例的,幾乎所有對象實例都會在這裏分配內存。堆是Java垃圾收集器管
理的主要區域(GC堆),垃圾收集器實現了對象的自動銷燬。Java堆可以細分爲:新生代和老年代;再細緻一點的有Eden空間,From Survivor空間,To Survivor空間
等。Java堆可以處於物理上不連續的內存空間中,只要邏輯上是連續的即可,就像我們的磁盤空間一樣。可以通過-Xmx和-Xms控制
二,串行收集器
(1)最古老,最穩定
(2)效率高
(3)可能會產生較長的停頓
(4)-XX:+UseSerialGC
新生代、老年代使用串行回收
新生代複製算法
老年代標記-壓縮
使用示例圖:
三,並行收集器
1,ParNew收集器
(1)參數:-XX:+UseParNewGC
新生代並行
老年代串行
(2)Serial收集器新生代的並行版本
(3)複製算法
(4)多線程,需要多核支持
(5)-XX:ParallelGCThreads:限制線程數量
使用示例圖:
2,Parallel收集器
(1)參數:-XX:+UseParallelGC(使用Parallel收集器+ 老年代串行)
類似ParNew
新生代複製算法
老年代 標記-壓縮
更加關注吞吐量
(2)參數:-XX:+UseParallelOldGC(使用Parallel收集器+ 並行老年代)
使用示例圖:
並行收集器參數:
-XX:MaxGCPauseMills :最大停頓時間,單位毫秒 ,GC盡力保證回收時間不超過設定值
-XX:GCTimeRatio :0-100的取值範圍,垃圾收集時間佔總時間的比 ,默認99,即最大允許1%時間做GC
這兩個參數是矛盾的:GC很頻繁,最大停頓時間變短,吞吐量變小,GC很少,最大停頓時間變長,吞吐量增大。
三,CMS收集器
CMS收集器:Concurrent Mark Sweep 併發(與用戶進程一起執行)標記清除,使用標記-清除算法,併發階段會降低吞吐量,老年代收集器(新生代使用ParNew)。
參數:-XX:+UseConcMarkSweepGC
CMS運行過程比較複雜,着重實現了標記的過程,可分爲
(1)初始標記 :根可以直接關聯到的對象,速度快。
(2)併發標記(和用戶線程一起) :主要標記過程,標記全部對象
(3)重新標記 :由於併發標記時,用戶線程依然運行,因此在正式清理前,再做修正
(4)併發清除(和用戶線程一起) :基於標記結果,直接清理對象
使用示例圖:
CMS收集器特點 :
(1)儘可能降低停頓
(2)會影響系統整體吞吐量和性能
比如,在用戶線程運行過程中,分一半CPU去做GC,系統性能在GC階段,反應速度就下降一半
(3)清理不徹底
因爲在清理階段,用戶線程還在運行,會產生新的垃圾,無法清理
因爲和用戶線程一起運行,不能在空間快滿時再清理
(4)-XX:CMSInitiatingOccupancyFraction設置觸發GC的閾值
如果不幸內存預留空間不夠,就會引起concurrent mode failure
如下圖:
碎片:當進行標記清除時,會產生一定量的內存碎片。
CMS收集器參數:
-XX:+ UseCMSCompactAtFullCollection: Full GC後,進行一次整理 ,
整理過程是獨佔的,會引起停頓時間變長
-XX:+CMSFullGCsBeforeCompaction:
設置進行幾次Full GC後,進行一次碎片整理
-XX:ParallelCMSThreads :
設定CMS的線程數量
四,GC參數整理
-XX:+UseSerialGC:在新生代和老年代使用串行收集器
-XX:SurvivorRatio:設置eden區大小和survivior區大小的比例
-XX:NewRatio:新生代和老年代的比
-XX:+UseParNewGC:在新生代使用並行收集器
-XX:+UseParallelGC :新生代使用並行回收收集器
-XX:+UseParallelOldGC:老年代使用並行回收收集器
-XX:ParallelGCThreads:設置用於垃圾回收的線程數
-XX:+UseConcMarkSweepGC:新生代使用並行收集器,老年代使用CMS+串行收集器
-XX:ParallelCMSThreads:設定CMS的線程數量
-XX:CMSInitiatingOccupancyFraction:設置CMS收集器在老年代空間被使用多少後觸發
-XX:+UseCMSCompactAtFullCollection:設置CMS收集器在完成垃圾收集後是否要進行一次內存碎片的整理
-XX:CMSFullGCsBeforeCompaction:設定進行多少次CMS垃圾回收後,進行一次內存壓縮
-XX:+CMSClassUnloadingEnabled:允許對類元數據進行回收
-XX:CMSInitiatingPermOccupancyFraction:當永久區佔用率達到這一百分比時,啓動CMS回收
-XX:UseCMSInitiatingOccupancyOnly:表示只在到達閥值的時候,才進行CMS回收
五,Tomcat實例演示
環境 :Tomcat 7,JSP 網站
工具 :JMeter
目的 :測試網站吞吐量和延時,讓Tomcat有一個不錯的吞吐量
系統結構:
示例1:
示例3:
示例4:
示例5:
示例6:
示例7:
示例8:
示例9:與示例8相比,jdk的升級可以提升性能。
總結:
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.