當前位置:
首頁 > 知識 > JVM 診斷調優 CheatSheet

JVM 診斷調優 CheatSheet

來源:颯然Hang,

www.rowkey.me/blog/2017/03/23/java-profile-cheatsheet/

常用Shell命令

查看網路狀況

netstat -n | awk /^tcp/ {++S[$NF]} END

使用top去獲取進程cpu使用率;使用/proc文件查看進程所佔內存。

#!/bin/bash

for i in `ps -ef | egrep -v "awk|$0" | awk / $1 / `

do

mymem=`cat /proc/$i/status 2> /dev/null | grep VmRSS | awk `

cpu=`top -n 1 -b |awk / $i / `

done

常用JDK命令

查看類的一些信息,如位元組碼的版本號、常量池等

javap -verbose classname

查看jvm進程

jps

jcmd -l

查看進程的gc情況

jstat -gcutil [pid] (顯示總體情況)

jstat -gc [pid] 1000 10(每隔1秒刷新一次 一共10次)

查看jvm內存使用狀況

jmap -heap [pid]

查看jvm內存存活的對象:

jcmd [pid] GC.class_histogram

jmap -histo:live [pid]

把heap里所有對象都dump下來,無論對象是死是活

jmap -dump:format=b,file=xxx.hprof [pid]

先做一次full GC,再dump,只包含仍然存活的對象信息:

jcmd [PID] GC.heap_dump [FILENAME]

jmap -dump:format=b,live,file=xxx.hprof [pid]

線程dump

jstack [pid] #-m參數可以列印出native棧的信息

jcmd Thread.print

kill -3 [pid]

查看目前jvm啟動的參數

jinfo -flags [pid] #有效參數

jcmd [pid] VM.flags #所有參數

查看對應參數的值

jinfo -flag [flagName] [pid]

啟用/禁止某個參數

jinfo -flag [+/-][flagName] [pid]

設置某個參數

jinfo -flag [flagName=value] [pid]

查看所有可以設置的參數以及其默認值

java -XX:+PrintFlagsInitial

第三方工具

========awesome-scripts========

安裝:

curl -s "https://raw.githubusercontent.com/superhj1987/awesome-scripts/master/self-installer.sh" | bash -s

使用:

顯示最繁忙的java線程: -c -p

opscipts show-busy-java-threads [-c] [-p]

使用greys跟蹤方法耗時

opscripts greys [@IP:PORT]

ga?: trace [class] [method]

顯示當前cpu和內存使用狀況,包括全局和各個進程的。

opscripts show-cpu-and-memory

進入jvm調試交互命令行,包含對java棧、堆、線程、gc等狀態的查看

opscripts jvm [pid]

JVM配置示例

-server #64位機器下默認

-Xms6000M #最小堆大小

-Xmx6000M #最大堆大小

-Xmn500M #新生代大小

-Xss256K #棧大小

-XX:PermSize=500M (JDK7)

-XX:MaxPermSize=500M (JDK7)

-XX:MetaspaceSize=128m (JDK8)

-XX:MaxMetaspaceSize=512m(JDK8)

-XX:SurvivorRatio=65536

-XX:MaxTenuringThreshold=0 #晉陞到老年代需要的存活次數,設置為0時,survivor區失去作用,一次minor gc,eden中存活的對象就會進入老年代,默認是15,使用CMS時默認是4

-Xnoclassgc #不做類的gc

#-XX:+PrintCompilation #輸出jit編譯情況,慎用

-XX:+TieredCompilation #啟用多層編譯,jd8默認開啟

-XX:CICompilerCount=4 #編譯器數目增加

-XX:-UseBiasedLocking #取消偏向鎖

-XX:AutoBoxCacheMax=20000 #自動裝箱的緩存數量,如int默認緩存為-128~127

-Djava.security.egd=file:/dev/./urandom #替代默認的/dev/random阻塞生成因子

-XX:+AlwaysPreTouch #啟動時訪問並置零內存頁面,大堆時效果比較好

-XX:-UseCounterDecay #禁止JIT調用計數器衰減。默認情況下,每次GC時會對調用計數器進行砍半的操作,導致有些方法一直是個溫熱,可能永遠都達不到C2編譯的1萬次的閥值。

-XX:ParallelRefProcEnabled=true # 默認為false,並行的處理Reference對象,如WeakReference

-XX:+DisableExplicitGC #此參數會影響使用堆外內存,會造成oom,如果使用NIO,請慎重開啟

#-XX:+UseParNewGC #此參數其實在設置了cms後默認會啟用,可以不用設置

-XX:+UseConcMarkSweepGC #使用cms垃圾回收器

#-XX:+UseCMSCompactAtFullCollection #是否在fullgc是做一次壓縮以整理碎片,默認啟用

-XX:CMSFullGCsBeforeCompaction=0 #full gc觸發壓縮的次數

#-XX:+CMSClassUnloadingEnabled #如果類載入不頻繁,也沒有大量使用String.intern方法,不建議打開此參數,況且jdk7後string pool已經移動到了堆中。開啟此項的話,即使設置了Xnoclassgc也會進行class的gc, 但是某種情況下會造成bug:https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=5&cad=rja&uact=8&ved=0ahUKEwjR16Wf6MHQAhWLrVQKHfLdCe4QFgg8MAQ&url=https%3A%2F%2Fblogs.oracle.com%2Fpoonam%2Fentry%2Fjvm_hang_with_cms_collector&usg=AFQjCNFNtkw6jHM-uyz-Wjri3LtAVXWJ8g&sig2=BFxSfHc-AIek18fEhY07mg。

#-XX:+CMSParallelRemarkEnabled #並行標記, 默認開啟, 可以不用設置

#-XX:+CMSScavengeBeforeRemark #強制remark之前開始一次minor gc,減少remark的暫停時間,但是在remark之後也將立即開始又一次minor gc

-XX:CMSInitiatingOccupancyFraction=90 #觸發full gc的內存使用百分比

-XX:+PrintClassHistogram #列印類統計信息

-XX:+PrintHeapAtGC #列印gc前後的heap信息

-XX:+PrintGCDetails #以下都是為了記錄gc日誌

-XX:+PrintGCDateStamps

-XX:+PrintGCApplicationStoppedTime #列印清晰的GC停頓時間外,還可以列印其他的停頓時間,比如取消偏向鎖,class 被agent redefine,code deoptimization等等

-XX:+PrintTenuringDistribution #列印晉陞到老年代的年齡自動調整的情況(並行垃圾回收器啟用UseAdaptiveSizePolicy參數的情況下以及其他垃圾回收期也會動態調整,從最開始的MaxTenuringThreshold變成佔用當前堆50%的age)

#-XX:+UseAdaptiveSizePolicy # 此參數在並行回收器時是默認開啟的會根據應用運行狀況做自我調整,如MaxTenuringThreshold、survivor區大小等,其他情況下最好不要開啟

#-XX:StringTableSize #字元串常量池表大小(hashtable的buckets的數目),java 6u30之前無法修改固定為1009,後面的版本默認為60013,可以通過此參數設置

-XX:GCTimeLimit=98 #gc佔用時間超過多少拋出OutOfMemoryError

-XX:GCHeapFreeLimit=2 #gc回收後小於百分之多少拋出OutOfMemoryError

-Xloggc:/home/logs/gc.log

你是如何在高樓逃生的?

你被困在一幢200米高的大樓的樓頂。你手裡有一根150米長的繩子和一把瑞士軍刀。你所站的地方有一個鐵鉤子。往樓下看時,你發現大樓正中間,也就是100米高的位置上,有一個可以落腳的金屬支架,上面還有另外一個鉤子。你怎樣才能利用這些東西安全到達地面?

請回對話框發送「逃生」獲取答案。

點擊展開全文

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 程序源 的精彩文章:

寫了一百萬行代碼是什麼體驗?
Web的26項基本概念和技術
MVC,MVP,MVVM比較以及區別
程序員有個勤快的媳婦,是怎樣一種體驗?

TAG:程序源 |

您可能感興趣

Instagram的Python性能調優方法介紹
Spark調優的關鍵—RDD Cache緩存使用詳解
DDN收購Intel Lustre系統業務,詳解Lustre系統架構、配置和調優
利用Kubernetes和Helm進行高效的超參數調優
3M 反光鞋面!低調優雅的 Air Jordan 1 「Rox Brown」 即將上架
前端學Serverless系列-性能調優
Tomcat 調優測試
低調優雅!近觀全新配色Nike Premier II足球鞋
詳解Linux性能調優之tuned特性
keras參數調優
Spark 數據傾斜調優
Tomcat 運維常用調優方式
如何對分散式 NewSQL 資料庫 TiDB 進行性能調優
Kafka參數調優實戰
Hadoop虛擬化的性能對比和調優經驗
MySQL 性能調優的10個方法
Python 環境下的自動化機器學習超參數調優
巴黎時裝周,Altuzarra2018秋季:低調優雅浪漫女人
通向架構師的道路(第二十四天)之 Oracle 性能調優
Sql性能調優