爲方便本身查看,根據工做遇到的問題,轉載並整理如下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 能夠查看死鎖。
jstat -class pid:顯示加載class的數量,及所佔空間等信息。
各列意義:
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等等。