JDK 1.7+(jcmd命令從JDK 1.7以后支持)
JVM進程的pid(Linux環境可以通過ps -ef獲取)
必須進入指定jdk的bin目錄下包含jps、jstat等等,然后再輸命令,否則命令無效
https://www.cnblogs.com/ostenant/p/9696226.html
1. jcmd命令介紹 --- 顯示進程內存信息
1.1 查看進程
? ? ?命令:jcmd -l
? ? ?作用:查看環境上所有JVM進程的信息(云化環境JVM進程較多,建議直接使用ps -ef | grep "微服務名稱"查詢比較方便)
1.2 列出當前JVM進程支持的命令(最最最實用的命令)
? ? 命令:jcmd?pid?help
? ? 作用:列出當前運行的 java 進程可以執行的操作
1.3 打印堆內存
? ? 命令:jcmd?pid?GC.heap_dump?dump.bin(云化環境打印在微服務的根目錄下)
? ? 作用:打印堆內存到文件
1.4 打印堆棧信息
? ? 方法一:歐拉操作系統,使用ossuser執行 kill -3?pid。堆棧信息打印在各服務tomcat的catalina.out文件中。
? ? 致謝:多謝超哥00267207提供方法及輸出文件路徑。
? ? 方法二:命令:jcmd?pid?Thread.print (內容較多,建議輸出到文件, jcmd?pid?Thread.print > thread.log)
? ? 作用:打印堆棧信息
更多細節:http://www.lxweimin.com/p/388e35d8a09b
2.jstat命令介紹 --- 顯示垃圾回收信息
jstat是用于識別虛擬機各種運行狀態信息的命令行工具。它可以顯示本地或者遠程虛擬機進程中的類裝載、內存、垃圾收集、jit編譯等運行數據,它是線上定位jvm性能的首選工具。
jstat工具提供如下的jvm監控功能:
1)類的加載及卸載的情況;
2)查看新生代、老生代及元空間(MetaSpace)的容量及使用情況;
3)查看新生代、老生代及元空間(MetaSpace)的垃圾回收情況,包括垃圾回收的次數,垃圾回收所占用的時間;
4)查看新生代中Eden區及Survior區中容量及分配情況等。
2.1 查看gc信息
命令:jstat -gc pid
?作用:顯示gc的信息,查看gc的次數,及時間
? ? ? ? ? ? ? S0C:第一個幸存區的大小
? ? ? ? ? ? ??S1C:第二個幸存區的大小
? ? ? ? ? ? ??S0U:第一個幸存區的使用大小
? ? ? ? ? ? ??S1U:第二個幸存區的使用大小
? ? ? ? ? ? ??EC:伊甸園區的大小
? ? ? ? ? ? ??EU:伊甸園區的使用大小
? ? ? ? ? ? ??OC:老年代大小
? ? ? ? ? ? ??OU:老年代使用大小
? ? ? ? ? ? ??MC:方法區大小
? ? ? ? ? ? ??MU:方法區使用大小
? ? ? ? ? ? ??CCSC:壓縮類空間大小
? ? ? ? ? ? ??CCSU:壓縮類空間使用大小
? ? ? ? ? ? ??YGC:從應用程序啟動到采樣時young gc的次數
? ? ? ? ? ? ??YGCT:從應用程序啟動到采樣時young gc的所用的時間(s)
? ? ? ? ? ? ??FGC:從應用程序啟動到采樣時full?gc的次數
? ? ? ? ? ? ??FGCT:從應用程序啟動到采樣時full?gc的所用的時間(s)
? ? ? ? ? ? ? GCT:?從應用程序啟動到采樣時整個gc所用的時間
./jstat -gc 426 1000 10
每隔1秒更新出最新的一行jstat統計信息,一共執行10次jstat統計。
通過這個命令,可以非常靈活的對線上機器通過固定頻率輸出統計信息,觀察每隔一段時間的JVM中的Eden區對象占用變化。比如執行完這個命令之后,第一秒先顯示出Eden區使用了200MB內存,第二秒顯示出來Eden區使用了205MB內存,第三秒顯示Eden區使用了209MB內存,以此推出這個系統大概每秒新增5MB左右的對象。
2.2 gc信息統計
? ? 命令:jstat -gcutil?pid
? ? 作用:獲取gc的統計數據
? ? ? ? ? ? ? S0:幸存1區當前使用比例
? ? ? ? ? ? ??S1:幸存2區當前使用比例
? ? ? ? ? ? ??E:伊甸園區使用比例
? ? ? ? ? ? ??O:老年代使用比例
? ? ? ? ? ? ??M:元數據區使用比例
? ? ? ? ? ? ??CCS:壓縮使用比例
? ? ? ? ? ? ??YGC:年輕代垃圾回收次數
? ? ? ? ? ? ??FGC:老年代垃圾回收次數
? ? ? ? ? ? ??FGCT:老年代垃圾回收消耗時間
? ? ? ? ? ? ??GCT:垃圾回收消耗總時間
實操:jstat -gcutil?pid?3s (每3s打印一次gcutil)
表示監控進程11900的GC情況,每3秒輸出一條記錄,從這里可以看到O列一直100%,FGC列一直增長。這種場景表示FullGC后,堆內存一直沒法釋放。一旦出現這種情況,基本上十有八九就是內存泄漏。?
要點:O列(老生代內存使用率)一直接近100%,FGC列(FullGC次數)一直增長
致謝:多謝超哥?00267207提供實際案例。
更多細節:
https://apppukyptrl1086.pc.xiaoe-tech.com/detail/i_5d11e6b3c5c6a_K6Xk3Bs1/1
https://blog.csdn.net/zhaozheng7758/article/details/8623549
3:jps使用? ---主要查看進程JVM配置信息
jps是用于查看有權訪問的hotspot虛擬機的進程。當未指定hostid時,默認查看本機jvm進程,否則查看指定的hostid機器上的jvm進程,此時hostid所指機器必須開啟jstatd服務。
jps可以列出jvm進程lvmid,主類類名,main函數參數,jvm參數,jar名稱等信息。
?命令:./jsp -l ---輸出進程號,jar包
?命令:./jps -v ---輸出進程啟動時jvm參數配置
?命令:./jps -m ---輸出進程啟動依賴的配置參數
更多細節:https://blog.csdn.net/wo541075754/article/details/55095443
4:jinfo? --查看和調整jvm各項參數
jinfo(JVM Configuration info)這個命令作用是實時查看和調整?虛擬機運行參數。之前的?jps -v?命令只能查看到顯示?指定的參數,如果想要查看?未顯示?的參數的值就要使用?jinfo?命令。
jinfo [option] pid
選項
option具體選項及作用如下:
-flags 查看jvm的參數
-sysprops 查看java系統參數
-flag [+|-] 修改正在運行的Java應用程序JVM參數,其中+是開啟對應參數,-是關閉對應參數
命令:./jinfo 655
命令:./jinfo -flags 655? ? 查看jvm參數
命令:./jinfo -flag? <name>? pid
命令:./jinfo -flag < name > = < value >? ? ? 修改指定name的jvm參數值
[root@izbp1chtb8a3vd2mzvuawlz ~]# jinfo -flag CMSAbortablePrecleanWaitMillis 4306? ?
-XX:CMSAbortablePrecleanWaitMillis=100
[root@izbp1chtb8a3vd2mzvuawlz ~]# jinfo -flag CMSAbortablePrecleanWaitMillis=50 4306
[root@izbp1chtb8a3vd2mzvuawlz ~]# jinfo -flag CMSAbortablePrecleanWaitMillis 4306?
-XX:CMSAbortablePrecleanWaitMillis=50
?查看可修改的JVM參數:
命令:java -XX:+PrintFlagsInitial | grep manageable
命令:./jinfo -flag [+|-]? ? ?關閉PrintGCDetails參數
更多細節:https://blog.csdn.net/qq2430/article/details/82154442
5.jmap --- 內存映射工具
jmap(JVM Memory Map) 命令用來查看堆內存使用狀況,一般結合jhat使用,用于生成heap dump文件。jmap不僅能生成dump文件,還可以查詢finalize執行隊列、Java堆和元空間metaspace的詳細信息,如當前使用率、當前使用的是哪種收集器等等。
如果不使用這個命令,還可以使用-XX:+HeapDumpOnOutOfMemoryError參數來讓虛擬機出現OOM的時候,自動生成dump文件。
命令:./jmap -dump:format=b,file=./gate.dump 9625
dump用于導出內存轉儲快照。常用的方式是通過jmap把進程內存使用情況dump到文件中,再用jhat分析查看。jmap進行dump的命令格式如jmap -dump:format=b,file=dumpFileName,導出的?dump?文件可以通過?MAT、VisualVM?和?jhat?等工具查看分析:
命令:./jmap -finalizerinfo 9625
命令:./jmap -heap 9625
顯示?堆?中的摘要信息。包括?堆內存?的使用情況,正在使用的?GC?算法、堆配置參數?和?各代中堆內存?使用情況。可以用此來判斷內存目前的?使用情況?以及?垃圾回收?情況。
命令:./jmap -histo 9625
打印堆的?對象統計,包括?對象實例數、內存大小?等等。因為在?histo:live?前會進行?full gc,如果帶上?live?則只統計?活對象。不加?live?的堆大小要大于加?live?堆的大小。
更多細節:https://blog.csdn.net/zhaozheng7758/article/details/8623530
6.jstack --- 進程中的堆棧跟蹤
jstack用于生成java虛擬機當前時刻的線程快照。線程快照是當前java虛擬機內每一條線程正在執行的方法堆棧的集合。生成線程快照的主要目的是定位線程出現長時間停頓的原因,如線程間死鎖、死循環、請求外部資源導致的長時間等待等等。
線程出現停頓的時候,通過jstack來查看各個線程的調用堆棧,就可以知道沒有響應的線程到底在后臺做什么事情,或者等待什么資源。如果java程序崩潰生成core文件,jstack工具可以通過core文件獲取java stack和native stack的信息,從而定位程序崩潰的原因。
命令:./jstack -F 9625? ? --強制輸出線程堆棧
命令:./jstack -l? 655 --顯示堆棧和鎖
命令:./jstack -m 9625? --可以顯示本地c++堆棧
更多細節:https://blog.csdn.net/zhaozheng7758/article/details/8623535