記一次jvm異常排查及優化

   爲方便本身查看,根據工做遇到的問題,轉載並整理如下jvm優化內容linux

  有次接到客服反饋,生產系統異常,沒法訪問。接到通知緊急上後臺跟蹤,查看了數據庫死鎖狀況--正常,接着查看tomcat 內存溢出--正常,再去跟蹤流量--正常。沒折了,把生產系統重起,剛開始幾分鐘,監控顯示一切正常,過幾分鐘狀況恢復正常。再去檢查apache代理機,發現代理機長時間沒有返回形成阻塞宕機。問題由此肯定。接着查看了xxx.com/proxoolAdmin?alias=ec&tab=snapshot 數據鏈接池狀況,發現鏈接池爆滿了。再次驗證了生產系統存在長時間處理的業務。數據庫

  從這個問題反映出,生產系統上壓力測試存在問題,基本的壓力測試流程沒有,同時經過此次排查異常也暴露了本身自己在jvm異常優化方面經驗缺失。apache

  接下來狠狠的給本身補齊這門jvm優化的相關知識。調優的目的是保持jvm穩定,而不是提升tqs等4個9的參數指標。windows

調整jvm內存等關鍵信息tomcat

  配置tomcat調用的虛擬機內存大小jvm

  (1)直接設置tomcattcp

    Linux工具

    修改TOMCAT_HOME/bin/catalina.sh 
    位置cygwin=false前。
    JAVA_OPTS="-server -Xms256m -Xmx512m -XX:PermSize=64M -XX:MaxPermSize=128m" (僅作參考,具體數值根據本身的電腦內存配置)性能

    windows測試

    修改TOMCAT_HOME/bin/catalina.bat 
    第一行加上
    JAVA_OPTS="-server -Xms256m -Xmx512m -XX:PermSize=64M -XX:MaxPermSize=128m" 、

    最大內存數最好不要超過系統內存是一半,一半設置爲三分之一的較好。各個參數參照比例設置基本問題不大。

  (2)配置環境變量

    環境變量中設     變量名:JAVA_OPTS     變量值:-Xms512m   -Xmx512m

排查jvm異常主要包括內存使用狀況,使用jstat 統計gc。死鎖狀況,因此須要定位到具體類,jstack  能夠查看死鎖。

統計gc信息

   jstat -class pid:顯示加載class的數量,及所佔空間等信息。

    jstat -compiler pid:顯示VM實時編譯的數量等信息。
    jstat -gc pid:能夠顯示gc的信息,查看gc的次數,及時間。其中最後五項,分別是young gc的次數,young gc的時間,full gc的次數,full gc的時間,gc的總時間。
    jstat -gccapacity:能夠顯示,VM內存中三代(young,old,perm)對象的使用和佔用大小,如:PGCMN顯示的是最小perm的內存使用量,PGCMX顯示的是perm的內存最大使用量,PGC是當前新生成的perm內存佔用量,PC是但前perm內存佔用量。其餘的能夠根據這個類推, OC是old內純的佔用量。
    jstat -gcnew pid:new對象的信息。
    jstat -gcnewcapacity pid:new對象的信息及其佔用量。
    jstat -gcold pid:old對象的信息。
    jstat -gcoldcapacity pid:old對象的信息及其佔用量。
    jstat -gcpermcapacity pid: perm對象的信息及其佔用量。
    jstat -util pid:統計gc信息統計。
    jstat -printcompilation pid:當前VM執行的信息。

各列意義

  S0C:年輕代中第一個存活區的大小
  S1C:年輕代中第二個存活區的大小
  S0U:年輕代中第一個存活區已使用的空間 (KB) 
  S1U:年輕代中第二個存活區已使用的空間 (KB) 
  EC:   Edem區大小
  EU:   年輕代中Edem區已使用的空間 (KB) 
  OC:  老年代大小
  OU:  老年代已使用的空間 (KB) 
  PC:   持久代大小
  PU: 持久代已使用的空間 (KB) 
  YGC: 從應用程序啓動到採樣時young gc的次數
  YGCT: 從應用程序啓動到採樣時young gc的所用的時間(s)
  FGC:  從應用程序啓動到採樣時full gc的次數
  FGCT: 從應用程序啓動到採樣時full gc的所用的時間
  GCT: 從應用程序啓動到採樣時整個gc所用的時間
  說明:YGCT 時間越短越好

頻繁GC問題或內存溢出問題

  1、使用jps查看線程ID

  2、使用jstat -gc 3331 250 20 查看gc狀況,通常比較關注PERM區的狀況,查看GC的增加狀況。

  3、使用jstat -gccause:額外輸出上次GC緣由

  4、使用jmap -dump:format=b,file=heapDump 3331生成堆轉儲文件

  5、使用jhat或者可視化工具(Eclipse Memory Analyzer 、IBM HeapAnalyzer)分析堆狀況。

  6、結合代碼解決內存溢出或泄露問題。

死鎖問題

  使用jstack -F pid

經常使用的壓力測試工具及命令

  loadrunner,jmeter,tcpcopy

       tcpcopy是拷貝線上流量,對於已有接口和服務作壓力測試是個神器,jmeter和loadrunner是壓力測試工具,loandrunner壓測結果更詳細可視化不過笨重收費並且須要不少客戶機,jmeter相對是平民版的loadrunner,勝在免費。

       jmap,jstack,jstat。jstat查看內存回收概況,實時查看各個分區的分配回收狀況,jmap查看內存棧,查看內存中對象佔用大小,jstack查看線程棧,死鎖,性能瓶頸,某個線程使用cpu太高致使服務總體慢等均可以經過在這些命令輔助Linux命令看出來。

top,vmstat,sar,dstat,traceroute,ping,nc,netstat,tcpdump,ss等等。

相關文章
相關標籤/搜索