本文目錄一覽:
Linux使用jstat命令查看jvm的GC情況
Linux 使用jstat命令查看jvm的GC情況
命令格式
jstat命令命令格式:
jstat [Options] vmid[interval] [count]
參數說明:
Options,選項,我們一般使用 -gcutil 查看gc情況
vmid
,VM的進程號,即當前運行的java進程號
interval
,間隔時間,單位為秒或者毫秒
count
,列印次數,如果預設則列印無數次
示例說明
示例
通常運行命令如下:
jstat -gc 12538 5000
即會每5秒一次顯示進程號為12538的java進成的GC情況,
顯示內容如下圖:
結果說明
S0C:年輕代中第一個survivor(倖存區)的容量 (位元組)
S1C
:年輕代中第二個survivor(倖存區)的容量 (位元組)
S0U
:年輕代中第一個survivor(倖存區)目前已使用空間 (位元組)
S1U
:年輕代中第二個survivor(倖存區)目前已使用空間 (位元組)
EC
:年輕代中Eden(伊甸園)的容量 (位元組)
EU
:年輕代中Eden(伊甸園)目前已使用空間 (位元組)
OC
:Old代的容量 (位元組)
OU
:Old代目前已使用空間 (位元組)
PC
:Perm(持久代)的容量 (位元組)
PU
:Perm(持久代)目前已使用空間 (位元組)
YGC
:從應用程序啟動到採樣時年輕代中gc次數
YGCT
:從應用程序啟動到採樣時年輕代中gc所用時間(s)
FGC
:從應用程序啟動到採樣時old代(全gc)gc次數
FGCT
:從應用程序啟動到採樣時old代(全gc)gc所用時間(s)
GCT
:從應用程序啟動到採樣時gc用的總時間(s)
NGCMN
:年輕代(young)中初始化(最小)的大小 (位元組)
NGCMX
:年輕代(young)的最大容量 (位元組)
NGC
:年輕代(young)中當前的容量 (位元組)
OGCMN
:old代中初始化(最小)的大小 (位元組)
OGCMX
:old代的最大容量 (位元組)
OGC
:old代當前新生成的容量 (位元組)
PGCMN
:perm代中初始化(最小)的大小 (位元組)
PGCMX
:perm代的最大容量 (位元組)
PGC
:perm代當前新生成的容量 (位元組)
S0
:年輕代中第一個survivor(倖存區)已使用的占當前容量百分比
S1
:年輕代中第二個survivor(倖存區)已使用的占當前容量百分比
E
:年輕代中Eden(伊甸園)已使用的占當前容量百分比
O
:old代已使用的占當前容量百分比
P
:perm代已使用的占當前容量百分比
S0CMX
:年輕代中第一個survivor(倖存區)的最大容量 (位元組)
S1CMX
:年輕代中第二個survivor(倖存區)的最大容量 (位元組)
ECMX
:年輕代中Eden(伊甸園)的最大容量 (位元組)
DSS
:當前需要survivor(倖存區)的容量 (位元組)(Eden區已滿)
TT
: 持有次數限制
MTT
: 最大持有次數限制
linux怎麼監控 jvm內存 jstat
jstat
可以觀察到classloader,compiler,gc相關信息
-class:統計class loader行為信息
-compile:統計編譯行為信息
-gc:統計jdk gc時heap信息
-gccapacity:統計不同的generations(不知道怎麼翻譯好,包括新生區,老年區,permanent區)相應的heap容量情況
-gccause:統計gc的情況,(同-gcutil)和引起gc的事件
-gcnew:統計gc時,新生代的情況
-gcnewcapacity:統計gc時,新生代heap容量
-gcold:統計gc時,老年區的情況
-gcoldcapacity:統計gc時,老年區heap容量
-gcpermcapacity:統計gc時,permanent區heap容量
-gcutil:統計gc時,heap情況
(詳見)
Linux系統監控要用到哪些命令
記錄一下自己常用的linux系統命令,方便以後查閱,發覺記憶越來越不行了
找到最耗CPU的java線程ps命令
命令:ps -mp pid -o THREAD,tid,time 或者 ps -Lfp pid
結果展示:
這個命令的作用,主要是可以獲取到對應一個進程下的線程的一些信息。 比如你想分析一下一個java進程的一些運行瓶頸點,可以通過該命令找到所有當前Thread的佔用CPU的時間,也就是這裡的最後一列。
比如這裡找到了一個TID : 30834 ,所佔用的TIME時間最高。
通過 printf “%x\n” 30834 首先轉化成16進位, 繼續通過jstack命令dump出當前的jvm進程的堆棧信息。 通過Grep命令即可以查到對應16進位的線程id信息,很快就可以找到對應最耗CPU的代碼快在哪。
簡單的解釋下,jstack下這一串線程信息內容:
“DboServiceProcessor-4-thread-295” daemon prio=10 tid=0x00002aab047a9800 nid=0x7d9b waiting on condition [0x0000000046f66000]
nid : 對應的linux操作系統下的tid,就是前面轉化的16進位數字
tid: 這個應該是jvm的jmm內存規範中的唯一地址定位,如果你詳細分析jvm的一些內存數據時用得上,我自己還沒到那種程度,所以先放下
top命令
命令:top -Hp pid
結果顯示:
和前面的效果一下,你可以實時的跟蹤並獲取指定進程中最耗cpu的線程。 再用前面的方法提取到對應的線程堆棧信息。
判斷I/O瓶頸
mpstat命令
命令:mpstat -P ALL 1 1000
結果顯示:
注意一下這裡面的%iowait列,CPU等待I/O操作所花費的時間。這個值持續很高通常可能是I/O瓶頸所導致的。
通過這個參數可以比較直觀的看出當前的I/O操作是否存在瓶頸
iostat命令
命令: iostat -m -x 1 1000
同樣你可以觀察對應的CPU中的%iowait數據,除此之外iostat還提供了一些更詳細的I/O狀態數據,比如比較重要的有:
avgqu-sz : The average queue length of the requests that were issued to the device. (磁碟隊列的請求長度,正常的話2,3比較好。可以和cpu的load一樣的理解)
await : The average time (in milliseconds) for I/O requests issued to the device to be served. (代表一個I/O操作從wait到完成的總時間)
svctm和%util都是代表處理該I/O請求花費的時間和CPU的時間比例。 判斷是否瓶頸時,這兩個參數不是主要的
r/s w/s 和 rMB/s wMB/s 都是代表當前系統處理的I/O的一些狀態,前者是我們常說的tps,後者就是吞吐量。這也是評價一個系統的性能指標
pid命令
命令: pidstat -p pid -u -d -t -w -h 1 1000
結果顯示:
相當實用的一個命令,可以基於當個進程分析對應的性能數據,包括CPU,I/O,IR , CS等,可以方便開發者更加精細化的觀察系統的運行狀態。不過pidstat貌似是在2.6內核的一些較新的版本才有,需要安裝sysstat包。
ubuntu下,可以通過sudo apt-get install sysstat進行安裝。
sar命令
命令:sar -x pid 1 1000
sar也可以指定對應的pid,關注固定的幾個參數,沒有pidstat那麼強大。 看不到對應的I/O, IR等信息。
sar的功能可以覆蓋mpstat , iostat的相關功能。
dstat命令
命令:dstat -y –tcp 1 1000
通過dstat –tcp可以比較方便的看到當前的tcp的各種狀態,不需要每次netstat -nat去看
其他命令
netstat -natp : 查看對應的網路鏈接,關注下Recv-Q , Send-Q , State。
lsof -p pid : 查找對應pid的文件句柄
lsof -i : 80 : 查找對應埠被哪個進程佔用
lsof /tmp/1.txt :查找對應文件被哪個進程佔用
tcpdump / wireshark :抓包分析工具
jstat / jmap / jstack / jps 等一系列的java監控命令
最後
如果你想做一些性能調優的工作,一定要善於利用一些工具進行關注相應的狀態。通過linux命令你可以比較方便的觀測到CPU , I/O , network等一些比較外圍的狀態, 很多時候就已經可以解決大部分的問題。jvm內部的一些運行狀態監控,得需要藉助一些特有的工具進行細粒度的觀測。
linux上如何安裝jstatd服務
此命令是一個RMI Server應用程序,提供了對JVM的創建和結束監視,也為遠程監視工具提供了一個可以attach的介面
options
-nr 當一個存在的RMI Registry沒有找到時,不嘗試創建一個內部的RMI Registry
-p port 埠號,默認為1099
-n rminame 默認為JStatRemoteHost;如果多個jstatd服務開始在同一台主機上,rminame唯一確定一個jstatd服務
-J jvm選項
jstatd
會報如下錯誤:
Could not create remote object access denied (java.util.PropertyPermission java.rmi.server.ignoreSubClasses write) java.security.AccessControlException: access denied (java.util.PropertyPermission java.rmi.server.ignoreSubClasses write) at java.security.AccessControlContext.checkPermission(AccessControlContext.java:323) at java.security.AccessController.checkPermission(AccessController.java:546) at java.lang.SecurityManager.checkPermission(SecurityManager.java:532) at java.lang.System.setProperty(System.java:727) at sun.tools.jstatd.Jstatd.main(Jstatd.java:122)
這是因為沒有給jstatd指定安全策略
創建安全策略文件,並命名為jstatd.all.policy
grant codebase “file:${java.home}/../lib/tools.jar” {
permission java.security.AllPermission;
};
再次啟動
C:\Program Files\Java\jdk1.6.0_16\binjstatd -J-Djava.security.policy=jstatd.all.policy
利用jps查看正在運行的java命令
jps
C:\Documents and Settings\lulujps
4892 Bootstrap
1296 Jstatd
4484 Jps
3332 org.eclipse.equinox.launcher_1.0.201.R35x_v20090715.jar
此時就可以使用jvisualvm.exe以遠程的方式監控JVM相關信息了。
更多例子
(1)使用內部RMI Registry
jstatd -J-Djava.security.policy=all.policy (默認埠為1099)
(2)使用外部RMI Registry
a)使用默認值
rmiregistry
jstatd -J-Djava.security.policy=all.policy
b)使用2020埠
rmiregistry 2020
jstatd -J-Djava.security.policy=all.policy -p 2020
c)使用2020埠,使用rminame
rmiregistry 2020
jstatd -J-Djava.security.policy=all.policy -p 2020 -n AlternateJstatdServerName
(3)RMI Registry已經啟動,不創建內部RMI Registry
jstatd -J-Djava.security.policy=all.policy -nr
(4)RMI日誌能力
jstatd -J-Djava.security.policy=all.policy -J-Djava.rmi.server.logCalls=true
原創文章,作者:ETFJQ,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/315721.html