java後端,提供了一個svg渲染的服務,在qps較大時,會出現頻繁的gc,而此時的服務器性能自己並無達到瓶頸(cpu,load,io都不過高)所以考慮調整一下jvm的相關參數,看是否能夠提高服務性能html
jvm相關參數記錄java
-XX:+CMSClassUnloadingEnabled -XX:CMSInitiatingOccupancyFraction=80 -XX:CMSMaxAbortablePrecleanTime=5000 -XX:+CMSParallelRemarkEnabled -XX:+CMSScavengeBef oreRemark -XX:+ExplicitGCInvokesConcurrent -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/xxx/java.hprof -XX:InitialCodeCacheSize=134217728 -XX:InitialHeapSize=4294967296 -XX:MaxDirectMemorySize=1073741824 -XX:MaxHeapSize=4294967296 -XX:MaxMetaspaceSize=268435456 -XX:MaxNewSize=2147483648 -XX:MetaspaceSize=268435456 -XX:NewSize=2147483648 -XX:OldPLABSize=16 -XX:+PrintGC -XX:+PrintGCDateStamps -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:ReservedCodeCacheSize=268435456 -XX:SurvivorRatio=10 -XX:+UseCMSCompactAtFullCollection -XX:+UseCMSInitiatingOccupancyOnly -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseConcMarkSweepGC -XX:+UseParNewGC
使用tsar做爲服務器性能監控工具,因此前提是先安裝tsarnginx
wget -O tsar.zip https://github.com/alibaba/tsar/archive/master.zip --no-check-certificate unzip tsar.zip cd tsar make make install
監控命令git
tsar --cpu --swap -i1 -l
說明github
tsar相關能夠參考: Linux系統性能監控工具介紹之-tsar算法
截取幾條gc日誌apache
2018-01-02T10:49:20.390+0800: 9.015: [GC (Allocation Failure) 2018-01-02T10:49:20.390+0800: 9.015: [ParNew: 1922431K->134118K(1922432K), 0.1486593 secs] 1934749K->201350K(4019584K), 0.1487460 secs] [Times: user=0.33 sys=0.05, real=0.14 secs] 2018-01-02T10:49:25.374+0800: 13.999: [GC (Allocation Failure) 2018-01-02T10:49:25.374+0800: 13.999: [ParNew: 1881830K->93708K(1922432K), 0.0910714 secs] 1949062K->197949K(4019584K), 0.0911833 secs] [Times: user=0.26 sys=0.01, real=0.09 secs] 2018-01-02T10:55:53.013+0800: 401.639: [GC (GCLocker Initiated GC) 2018-01-02T10:55:53.013+0800: 401.639: [ParNew: 1841429K->142552K(1922432K), 0.0629031 secs] 1945670K->246793K(4019584K), 0.0630512 secs] [Times: user=0.14 sys=0.01, real=0.06 secs] 2018-01-02T10:55:55.076+0800: 403.701: [GC (GCLocker Initiated GC) 2018-01-02T10:55:55.076+0800: 403.701: [ParNew: 1890281K->59983K(1922432K), 0.0661778 secs] 1994522K->201875K(4019584K), 0.0663176 secs] [Times: user=0.15 sys=0.01, real=0.07 secs] 2018-01-02T11:47:25.271+0800: 3493.897: [GC (Allocation Failure) 2018-01-02T11:47:25.271+0800: 3493.897: [ParNew: 1807695K->20975K(1922432K), 0.0193077 secs] 1949587K->162867K(4019584K), 0.0195351 secs] [Times: user=0.04 sys=0.00, real=0.02 secs] 2018-01-02T11:56:50.621+0800: 4059.247: [GC (GCLocker Initiated GC) 2018-01-02T11:56:50.622+0800: 4059.247: [ParNew: 1774543K->108899K(1922432K), 0.0401606 secs] 1916434K->250791K(4019584K), 0.0403586 secs] [Times: user=0.10 sys=0.00, real=0.04 secs]
截取上面日誌中的第一條,分別說明每一項是什麼意思後端
2018-01-02T10:49:20.390+0800: 9.015: [GC (Allocation Failure) 2018-01-02T10:49:20.390+0800: 9.015: [ParNew: 1922431K->134118K(1922432K), 0.1486593 secs] 1934749K->201350K(4019584K), 0.1487460 secs] [Times: user=0.33 sys=0.05, real=0.14 secs]
數組
後端服務選用的就是CMS,那麼就有必要看一下這個CMS究竟是個什麼東西安全
Concurrent Mark Sweep 收集器,是一種以獲取最短回收停頓時間爲目標的收集器,核心就是標籤-清除算法
說明,初始標記和從新標記的時候,會暫停服務;後面兩個則是併發修改
一句話描述:
標記全部須要回收的對象,在標記完成後,統一回收全部被標記的對象
常見的兩個問題: 效率不高;回收後大量的碎片
大多數場景下,對象在新生代Eden區分配,當Eden去沒有足夠的空間進行分配時,虛擬機發起一次 Minor GC
須要大量連續內存空間的Java對象,一般是數組,同構 -XX:PretenuresizeThreshold
參數,來設置大對象的閥值,超過這個閥值的直接分配在年老代,避免在Eden區及兩個Survivor區指尖發生大量的內存複製
既然虛擬機採用分代收集的思想來管理內存,在回收時,就必須能識別哪些對象應放在新生代,那些對象應放在老年代中
每一個對象都有個Age的計數器,對象在Eden出生並通過第一次MinorGC後仍存在,且能夠被Survivor容納的話,會被移動到Survivor空間中,並設置Age爲1
對象在Survivor區沒多通過一次MinorGC,則age+1
當age超過閥值(默認15),就會晉升到老年代
閥值能夠經過 -XX:MaxTenuringThreshold
來設置
若是在Survivor空間中相同年齡全部對象的大小的總和,大於Survivor空間的一半,則年齡大於或等於該年齡的對象就能夠進入老年代,無序等Age達到閥值
在發生MinorGC以前,虛擬機會先檢查老年代最大可用的連續空間是否大於新生代全部對象總空間,若是成立,則Minor GC能夠確保老是安全的;
不然,查看 HandlePromotionFailure參數,是否容許擔保失敗
若容許,則繼續檢查老年代最大可用的連續空間是否大於歷次晉升到老年代對象的平均大小,若大於,則嘗試MinorGC
不然進行FullGC
既然問題是頻繁的gc引發的,那麼觀察新生代,老年代對象佔用空間的狀況就不可避免了,因此jstat命令不得不出現了
截一個線程圖
$ jstat -gcutil 11573 1000 5 S0 S1 E O M CCS YGC YGCT FGC FGCT GCT 0.00 34.39 24.68 68.01 98.12 96.30 3051 170.096 242 18.429 188.525 0.00 34.39 26.29 68.01 98.12 96.30 3051 170.096 242 18.429 188.525 0.00 34.39 27.45 68.01 98.12 96.30 3051 170.096 242 18.429 188.525 0.00 34.39 28.32 68.01 98.12 96.30 3051 170.096 242 18.429 188.525 0.00 34.39 29.93 68.01 98.12 96.30 3051 170.096 242 18.429 188.525
jps -l jinfo xxx
抓圖
$ jps -l 30916 sun.tools.jps.Jps 2909 org.apache.catalina.startup.Bootstrap
## 主要查看cpu和nginx訪問的監控 tsar --cpu --nginx -i1 -l
抓圖:
Time -----------------------cpu---------------------- ----------------------------------nginx--------------------------------- Time user sys wait hirq sirq util accept handle reqs active read write wait qps rt 03/01/18-11:29:37 16.54 1.50 0.00 0.00 0.00 18.05 2.00 2.00 6.00 15.00 0.00 1.00 14.00 6.00 89.50 03/01/18-11:29:38 26.07 1.75 0.00 0.00 0.00 27.82 3.00 3.00 10.00 15.00 0.00 1.00 14.00 10.00 47.10 03/01/18-11:29:39 19.60 1.01 0.00 0.00 0.00 20.60 4.00 4.00 11.00 15.00 0.00 1.00 14.00 11.00 37.82 03/01/18-11:29:40 28.75 2.50 0.00 0.00 0.25 31.50 2.00 2.00 10.00 15.00 0.00 1.00 14.00 10.00 79.30 03/01/18-11:29:41 14.07 1.51 0.00 0.00 0.00 15.58 1.00 1.00 10.00 15.00 0.00 3.00 12.00 10.00 51.30 03/01/18-11:29:42 20.60 1.01 0.00 0.00 0.00 21.61 6.00 6.00 13.00 15.00 0.00 1.00 14.00 13.00 44.69
jstat -gcutil 4354 1000
抓圖:
$ jstat -gcutil 2909 1000 S0 S1 E O M CCS YGC YGCT FGC FGCT GCT 29.03 0.00 66.34 16.34 98.57 96.32 200 6.393 0 0.000 6.393 29.03 0.00 66.37 16.34 98.57 96.32 200 6.393 0 0.000 6.393 29.03 0.00 66.50 16.34 98.57 96.32 200 6.393 0 0.000 6.393 29.03 0.00 66.54 16.34 98.57 96.32 200 6.393 0 0.000 6.393
jmap -histo 4354
抓圖
num #instances #bytes class name ---------------------------------------------- 1: 78179 181546608 [I 2: 1259 175880312 [S 3: 35915 65527520 [B 4: 242125 40558408 [C 5: 571604 13718496 java.util.concurrent.atomic.AtomicLong 6: 233282 5598768 java.lang.String 7: 55177 5296992 java.util.jar.JarFile$JarFileEntry 8: 119906 3836992 java.util.HashMap$Node 9: 33327 2932776 java.lang.reflect.Method 10: 1147 2303216 [Ljava.util.concurrent.atomic.AtomicLong;
Jmetter
盡信書則不如,已上內容,純屬一家之言,因本人能力通常,看法不全,若有問題,歡迎批評指正