您好,登錄后才能下訂單哦!
Java中怎么監控一個應用的性能,相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。
標準參數(Eg.)
-help
-server/-client
-version/-showversion
-cp/-classpath
X參數(非標準化參數)
-Xint: 解釋執行
-Xcomp: 第一次使用就編譯成本地代碼
-Xmixed: 混合模式,jvm自己來決定是否編譯成本地代碼
XX參數(非標轉化參數,相對不穩定,主要用于JVM調優和Debug)
XX參數的分類:
-Xmx/-Xms
(實際上是XX參數) 設置JVM的最大內存和最小內存,-Xms等價于-XX:InitialHeapSize
,-Xmx等價于-XX:MaxHeapSize
-XX:+PrintFlagsInitial
查看JVM運行參數的初始值
-XX:+PrintFlagsFinal
查看JVM運行參數的最終值(=表示默認值,:=表示被用戶或者JVM修改后的值)
-XX:+UnlockExperimentalVMOptions
解鎖實驗參數
-XX:+UnlockDiagnosticVMOptions
解鎖診斷參數
-XX:+PrintCommandLineFlags
打印命令行參數
-XX:+HeapDumpOnOutOfMemoryError
當發生內存溢出了,自動Dump Heap Error
-XX:HeapDumpPath=./
內存溢出HeapDump的日志,./
指的是當前運行目錄
Boolean類型: -XX:[+|-]<name>
,例如: -XX:+UseConcMarkSweepGC
非Boolean類型: -XX:<name>=<value>
表示name屬性的值是value,例如:-XX:MaxGCPauseMillies=500
jps
jps默認能夠看到所有的java進程
-l
參數表示看到具體的Class
!!!需要補全所有的參數
jinfo
jinfo -flag MaxHeapSize [pid]
看到所選擇pid的MaxHeapSize的值
jinfo -flags [pid]
看到所選pid的所有參數值,包括被修改的和沒有被修改過的
!!!需要補全所有參數
jstat
Loaded
類加載的個數
Bytes
類加載了多少個kBs
Unloaded
類卸載的個數
Bytes
類卸載了多少個kBs
Time
類加載和卸載總共花費的時間
Compiled
完成了多少個編譯的任務(把一個方法編譯成本地方法)
Failed
編譯任務失敗的次數
Invalid
編譯任務是無效的次數
Time
總的編譯時間
FailedType
上一次編譯失敗的編譯類型
FailedMethod
上一次編譯失敗的類名稱或方法名稱
S0C\S1C\S0U\S1U
S0和S1的總量和使用量
EC\EU
Eden區總量與使用量
OC\OU
Old區總量與使用量
MC\MU
Metaspace區總量和使用量
CCSC\CCSU
壓縮類空間總量和使用量
YGC\YGCT
YoungGC的次數和時間
FGC\FGCT
FullGC的次數和時間
GCT
總的GC時間
可以查看如下信息:
所有選項:
-class
查看類裝載信息,用法 jstat -class [pid] [interval millseconds] [count]
代表間隔interval毫秒時間打印count次的pid的類裝載信息:
-compiler
查看JIT編譯的信息,jstat -compiler [pid] [interval millseconds] [count]
代表間隔interval毫秒時間打印count次的pid的JIT編譯信息信息:
-gc
查看垃圾收集的信息,用法 jstat -gc [pid] [interval millseconds] [count]
代表間隔interval毫秒時間打印count次的pid的gc信息:
-gcutil
-gccause
-gcnew
-gcold
-printcompilation
!!!需要補全所有參數
類裝載信息
垃圾收集信息
JIT編譯信息
JVM的內存結構
堆區:Young區(Servival區[S0+S1]+Eden區) + Old區,S0和S1是一樣大的,在同一時間,S0和S1只會啟用一個
非堆區(Metaspace):操作系統的本地內存,CCS區(啟用了短指針之后則存在)+CodeCache區(存放的是JIT的代碼信息,JNI的代碼信息也在這)
如何定位內存溢出的問題
構造一個內存溢出,例如設置下-Xmx32M -Xms32M
,構造一個堆內存溢出,只需要一直不停的new對象;設置-XX:MetaspaceSize=32M -XX:MaxMetaspaceSize=32M
下構造出一個非堆內存溢出,例如使用ASM不太的構造Class文件。
內存溢出的區別
C++內存溢出主要是指丟失內存指針,Java的內存溢出主要是指一直占用對象不釋放
jmap
-dump:<dump-options>
options有:live
-僅僅導出存活的對象,format=b
-導出二進制格式,file=<file>
代表導出的文件
可以手動導出Heap日志
看完上述內容,你們掌握Java中怎么監控一個應用的性能的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。