JDK內置工具使用html
1、jps命令(Java Virtual Machine Process Status Tool)java
2、jstack命令(Java Stack Trace)c++
3、jstat命令(Java Virtual Machine Statistics Monitoring Tool)web
5、jinfo命令(Java Configuration Info)windows
6、jconsole命令(Java Monitoring and Management Console)數組
7、jvisualvm命令(Java Virtual Machine Monitoring, Troubleshooting, and Profiling Tool)安全
8、jhat命令(Java Heap Analyse Tool)服務器
9、Jstatd命令(Java Statistics Monitoring Daemon)網絡
10、MAT(Memory Analyzer Tool)工具入門介紹
一、介紹
用來查看基於HotSpot的JVM裏面中,全部具備訪問權限的Java進程的具體狀態, 包括進程ID,進程啓動的路徑及啓動參數等等,與unix上的ps相似,只不過jps是用來顯示java進程,能夠把jps理解爲ps的一個子集。
使用jps時,若是沒有指定hostid,它只會顯示本地環境中全部的Java進程;若是指定了hostid,它就會顯示指定hostid上面的java進程,不過這須要遠程服務上開啓了jstatd服務,能夠參看前面的jstatd章節來啓動jstad服務。
二、命令格式
jps [ options ] [ hostid ]
三、經常使用參數說明
-q 忽略輸出的類名、Jar名以及傳遞給main方法的參數,只輸出pid。
-m 輸出傳遞給main方法的參數,若是是內嵌的JVM則輸出爲null。
-l 輸出應用程序主類的完整包名,或者是應用程序JAR文件的完整路徑。
-v 輸出傳給JVM的參數。
-V 輸出經過標記的文件傳遞給JVM的參數(.hotspotrc文件,或者是經過參數-XX:Flags=<filename>指定的文件)。
-J 用於傳遞jvm選項到由javac調用的java加載器中,例如,「-J-Xms48m」將把啓動內存設置爲48M,使用-J選項能夠很是方便的向基於Java的開發的底層虛擬機應用程序傳遞參數。
四、服務器標識
hostid指定了目標的服務器,它的語法以下:
[protocol:][[//]hostname][:port][/servername]
protocol - 若是protocol及hostname都沒有指定,那表示的是與當前環境相關的本地協議,若是指定了hostname卻沒有指定protocol,那麼protocol的默認就是rmi。
hostname - 服務器的IP或者名稱,沒有指定則表示本機。
port - 遠程rmi的端口,若是沒有指定則默認爲1099。
Servername - 註冊到RMI註冊中心中的jstatd的名稱。
五、使用示例
5.一、列出本地的Java進程
不帶任何參數
fenglibin@libin:~$ jps 11644 Main 1947 12843 Jps |
帶-v參數
fenglibin@libin:~$ jps -v 11644 Main -agentlib:jdwp=transport=dt_socket,suspend=y,address=localhost:43467 -Dfile.encoding=GBK 1947 -Dosgi.requiredJavaVersion=1.5 -XX:MaxPermSize=256m -Xms40m -Xmx512m 12858 Jps -Denv.class.path=/home/fenglibin/java6/lib/dt.jar:/home/fenglibin/java6/lib/tools.jar::/usr/bin/libtool:/usr/bin/autoconf:/usr/local/BerkeleyDB.4.8/lib -Dapplication.home=/home/fenglibin/java6 -Xms8m |
帶-l參數
fenglibin@libin:~$ jps -l 11644 com.alibaba.china.webww.core.Main 12870 sun.tools.jps.Jps 1947
|
5.二、列出遠程的Java進程
在jstatd章節,咱們有經過:
rmiregistry 2020&jstatd -J-Djava.security.policy=all.policy -p 2020 -n AlternateJstatdServerName |
啓動了名爲AlternateJstatdServerName的jstatd服務,那麼咱們此時就能夠經過該服務列出其有權限訪問的Java進程。
fenglibin@libin:~$ jps 10.1.1.234:2020/AlternateJstatdServerName 29556 Bootstrap 28671 WSPreLauncher 2602 RegistryImpl 18272 Test 2603 Jstatd |
jstack用於打印出給定的java進程ID或core file或遠程調試服務的Java堆棧信息,若是是在64位機器上,須要指定選項"-J-d64",Windows的jstack使用方式只支持如下的這種方式:
jstack [-l] pid
若是java程序崩潰生成core文件,jstack工具能夠用來得到core文件的java stack和native stack的信息,從而能夠輕鬆地知道java程序是如何崩潰和在程序何處發生問題。另外,jstack工具還能夠附屬到正在運行的java程序中,看到當時運行的java程序的java stack和native stack的信息, 若是如今運行的java程序呈現hung的狀態,jstack是很是有用的。
二、命令格式
jstack [ option ] pid
jstack [ option ] executable core
jstack [ option ] [server-id@]remote-hostname-or-IP
1)、options:
executable Java executable from which the core dump was produced.
(多是產生core dump的java可執行程序)
core 將被打印信息的core dump文件
remote-hostname-or-IP 遠程debug服務的主機名或ip
server-id 惟一id,假如一臺主機上多個遠程debug服務
2)、基本參數:
-F當’jstack [-l] pid’沒有相應的時候強制打印棧信息
-l長列表. 打印關於鎖的附加信息,例如屬於java.util.concurrent的ownable synchronizers列表.
-m打印java和native c/c++框架的全部棧信息.
-h | -help打印幫助信息
pid 須要被打印配置信息的java進程id,能夠用jps查詢.
Jstat用於監控基於HotSpot的JVM,對其堆的使用狀況進行實時的命令行的統計,使用jstat咱們能夠對指定的JVM作以下監控:
- 類的加載及卸載狀況
- 查看新生代、老生代及持久代的容量及使用狀況
- 查看新生代、老生代及持久代的垃圾收集狀況,包括垃圾回收的次數及垃圾回收所佔用的時間
- 查看新生代中Eden區及Survior區中容量及分配狀況等
jstat工具特別強大,它有衆多的可選項,經過提供多種不一樣的監控維度,使咱們能夠從不一樣的維度來了解到當前JVM堆的使用狀況。詳細查看堆內各個部分的使用量,使用的時候必須加上待統計的Java進程號,可選的不一樣維度參數以及可選的統計頻率參數。
它主要是用來顯示GC及PermGen相關的信息,若是對GC不怎麼了解,先看這篇文章:http://blog.csdn.net/fenglibing/archive/2011/04/13/6321453.aspx,不然其中即便你會使用jstat這個命令,你也看不懂它的輸出。
jstat [ generalOption | outputOptions vmid [interval[s|ms] [count]] ]
generalOption - 單個的經常使用的命令行選項,如-help, -options, 或 -version。
outputOptions -一個或多個輸出選項,由單個的statOption選項組成,能夠和-t, -h, and -J等選項配合使用。
statOption:
根據jstat統計的維度不一樣,可使用以下表中的選項進行不一樣維度的統計,不一樣的操做系統支持的選項可能會不同,能夠經過-options選項,查看不一樣操做系統所支持選項,如:
Option | Displays... |
---|---|
class | 用於查看類加載狀況的統計 |
compiler | 用於查看HotSpot中即時編譯器編譯狀況的統計 |
gc | 用於查看JVM中堆的垃圾收集狀況的統計 |
gccapacity | 用於查看新生代、老生代及持久代的存儲容量狀況 |
gccause | 用於查看垃圾收集的統計狀況(這個和-gcutil選項同樣),若是有發生垃圾收集,它還會顯示最後一次及當前正在發生垃圾收集的緣由。 |
gcnew | 用於查看新生代垃圾收集的狀況 |
gcnewcapacity | 用於查看新生代的存儲容量狀況 |
gcold | 用於查看老生代及持久代發生GC的狀況 |
gcoldcapacity | 用於查看老生代的容量 |
gcpermcapacity | 用於查看持久代的容量 |
gcutil | 用於查看新生代、老生代及持代垃圾收集的狀況 |
printcompilation | HotSpot編譯方法的統計 |
用於指定每隔幾行就輸出列頭,若是不指定,默認是隻在第一行出現列頭。
-JjavaOption
用於將給定的javaOption傳給java應用程序加載器,例如,「-J-Xms48m」將把啓動內存設置爲48M。若是想查看能夠傳遞哪些選項到應用程序加載器中,能夠相看以下的文檔:
Linux and Solaris:http://docs.oracle.com/javase/1.5.0/docs/tooldocs/solaris/java.html
Windows: http://docs.oracle.com/javase/1.5.0/docs/tooldocs/windows/java.html
-t n
用於在輸出內容的第一列顯示時間戳,這個時間戳表明的時JVM開始啓動到如今的時間(注:在IBM JDK5中是沒有這個選項的)。
vmid - VM的進程號,即當前運行的java進程號。
還有兩個關於顯示頻率的選項:
interval–間隔時間,單位能夠是秒或者毫秒,經過指定s或ms肯定,默認單位爲毫秒。
count-打印次數,若是缺省則打印無數次。
三、不一樣的統計維度(statOption)及輸出說明
列名 | 說明 |
---|---|
Loaded | 加載了的類的數量 |
Bytes | 加載了的類的大小,單爲Kb |
Unloaded | 卸載了的類的數量 |
Bytes | 卸載了的類的大小,單爲Kb |
Time | 花在類的加載及卸載的時間 |
列名 | 說明 |
---|---|
Compiled | 編譯任務執行的次數 |
Failed | 編譯任務執行失敗的次數 |
Invalid | 編譯任務非法執行的次數 |
Time | 執行編譯花費的時間 |
FailedType | 最後一次編譯失敗的編譯類型 |
FailedMethod | 最後一次編譯失敗的類名及方法名 |
列名 | 說明 |
---|---|
S0C | 新生代中Survivor space中S0當前容量的大小(KB) |
S1C | 新生代中Survivor space中S1當前容量的大小(KB) |
S0U | 新生代中Survivor space中S0容量使用的大小(KB) |
S1U | 新生代中Survivor space中S1容量使用的大小(KB) |
EC | Eden space當前容量的大小(KB) |
EU | Eden space容量使用的大小(KB) |
OC | Old space當前容量的大小(KB) |
OU | Old space使用容量的大小(KB) |
PC | Permanent space當前容量的大小(KB) |
PU | Permanent space使用容量的大小(KB) |
YGC | 從應用程序啓動到採樣時發生 Young GC 的次數 |
YGCT | 從應用程序啓動到採樣時 Young GC 所用的時間(秒) |
FGC | 從應用程序啓動到採樣時發生 Full GC 的次數 |
FGCT | 從應用程序啓動到採樣時 Full GC 所用的時間(秒) |
GCT | T從應用程序啓動到採樣時用於垃圾回收的總時間(單位秒),它的值等於YGC+FGC |
列名 | 說明 |
---|---|
NGCMN | 新生代的最小容量大小(KB) |
NGCMX | 新生代的最大容量大小(KB) |
NGC | 當前新生代的容量大小(KB) |
S0C | 當前新生代中survivor space 0的容量大小(KB) |
S1C | 當前新生代中survivor space 1的容量大小(KB) |
EC | Eden space當前容量的大小(KB) |
OGCMN | 老生代的最小容量大小(KB) |
OGCMX | 老生代的最大容量大小(KB) |
OGC | 當前老生代的容量大小(KB) |
OC | 當前老生代的空間容量大小(KB) |
PGCMN | 持久代的最小容量大小(KB) |
PGCMX | 持久代的最大容量大小(KB) |
PGC | 當前持久代的容量大小(KB) |
PC | 當前持久代的空間容量大小(KB) |
YGC | 從應用程序啓動到採樣時發生 Young GC 的次數 |
FGC | 從應用程序啓動到採樣時發生 Full GC 的次數 |
這個選項用於查看垃圾收集的統計狀況(這個和-gcutil選項同樣),若是有發生垃圾收集,它還會顯示最後一次及當前正在發生垃圾收集的緣由,它比-gcutil會多出最後一次垃圾收集緣由以及當前正在發生的垃圾收集的緣由。
列名 | 說明 |
---|---|
LGCC | 最後一次垃圾收集的緣由,可能爲「unknown GCCause」、「System.gc()」等 |
GCC | 當前垃圾收集的緣由 |
列名 | 說明 |
---|---|
S0C | 當前新生代中survivor space 0的容量大小(KB) |
S1C | 當前新生代中survivor space 1的容量大小(KB) |
S0U | S0已經使用的大小(KB) |
S1U | S1已經使用的大小(KB) |
TT | Tenuring threshold,要了解這個參數,咱們須要瞭解一點Java內存對象的結構,在Sun JVM中,(除了數組以外的)對象都有兩個機器字(words)的頭部。第一個字中包含這個對象的標示哈希碼以及其餘一些相似鎖狀態和等標識信息,第二個字中包含一個指向對象的類的引用,其中第二個字節就會被垃圾收集算法使用到。 在新生代中作垃圾收集的時候,每次複製一個對象後,將增長這個對象的收集計數,當一個對象在新生代中被複制了必定次數後,該算法即斷定該對象是長週期的對象,把他移動到老生代,這個閾值叫着tenuring threshold。這個閾值用於表示某個/些在執行批定次數youngGC後還活着的對象,即便此時新生的的Survior沒有滿,也一樣被認爲是長週期對象,將會被移到老生代中。 |
MTT | Maximum tenuring threshold,用於表示TT的最大值。 |
DSS | Desired survivor size (KB).能夠參與這裏:http://blog.csdn.net/yangjun2/article/details/6542357 |
EC | Eden space當前容量的大小(KB) |
EU | Eden space已經使用的大小(KB) |
YGC | 從應用程序啓動到採樣時發生 Young GC 的次數 |
YGCT | 從應用程序啓動到採樣時 Young GC 所用的時間(單位秒) |
列名 | 說明 |
---|---|
NGCMN | 新生代的最小容量大小(KB) |
NGCMX | 新生代的最大容量大小(KB) |
NGC | 當前新生代的容量大小(KB) |
S0CMX | 新生代中SO的最大容量大小(KB) |
S0C | 當前新生代中SO的容量大小(KB) |
S1CMX | 新生代中S1的最大容量大小(KB) |
S1C | 當前新生代中S1的容量大小(KB) |
ECMX | 新生代中Eden的最大容量大小(KB) |
EC | 當前新生代中Eden的容量大小(KB) |
YGC | 從應用程序啓動到採樣時發生 Young GC 的次數 |
FGC | 從應用程序啓動到採樣時發生 Full GC 的次數 |
列名 | 說明 |
---|---|
PC | 當前持久代容量的大小(KB) |
PU | 持久代使用容量的大小(KB) |
OC | 當前老年代容量的大小(KB) |
OU | 老年代使用容量的大小(KB) |
YGC | 從應用程序啓動到採樣時發生 Young GC 的次數 |
FGC | 從應用程序啓動到採樣時發生 Full GC 的次數 |
FGCT | 從應用程序啓動到採樣時 Full GC 所用的時間(單位秒) |
GCT | 從應用程序啓動到採樣時用於垃圾回收的總時間(單位秒),它的值等於YGC+FGC |
列名 | 說明 |
---|---|
OGCMN | 老生代的最小容量大小(KB) |
OGCMX | 老生代的最大容量大小(KB) |
OGC | 當前老生代的容量大小(KB) |
OC | 當前新生代的空間容量大小(KB) |
YGC | 從應用程序啓動到採樣時發生 Young GC 的次數 |
FGC | 從應用程序啓動到採樣時發生 Full GC 的次數 |
FGCT | 從應用程序啓動到採樣時 Full GC 所用的時間(單位秒) |
GCT | 從應用程序啓動到採樣時用於垃圾回收的總時間(單位秒),它的值等於YGC+FGC |
列名 | 說明 |
---|---|
PGCMN | 持久代的最小容量大小(KB) |
PGCMX | 持久代的最大容量大小(KB) |
PGC | 當前持久代的容量大小(KB) |
PC | 當前持久代的空間容量大小(KB) |
YGC | 從應用程序啓動到採樣時發生 Young GC 的次數 |
FGC | |
FGCT | 從應用程序啓動到採樣時 Full GC 所用的時間(單位秒) |
GCT | 從應用程序啓動到採樣時用於垃圾回收的總時間(單位秒),它的值等於YGC+FGC |
列名 | 說明 |
---|---|
S0 | Heap上的 Survivor space 0 區已使用空間的百分比 |
S1 | Heap上的 Survivor space 1 區已使用空間的百分比 |
E | Heap上的 Eden space 區已使用空間的百分比 |
O | Heap上的 Old space 區已使用空間的百分比 |
P | Perm space 區已使用空間的百分比 |
YGC | 從應用程序啓動到採樣時發生 Young GC 的次數 |
YGCT | 從應用程序啓動到採樣時 Young GC 所用的時間(單位秒) |
FGC | 從應用程序啓動到採樣時發生 Full GC 的次數 |
FGCT | 從應用程序啓動到採樣時 Full GC 所用的時間(單位秒) |
GCT | 從應用程序啓動到採樣時用於垃圾回收的總時間(單位秒),它的值等於YGC+FGC |
列名 | 說明 |
---|---|
Compiled | 編譯任務執行的次數 |
Size | 方法的字節碼所佔的字節數 |
Type | 編譯類型 |
Method | 指定肯定被編譯方法的類名及方法名,類名中使名「/」而不是「.」作爲命名分隔符,方法名是被指定的類中的方法,這兩個字段的格式是由HotSpot中的「-XX:+PrintComplation」選項肯定的。 |
示例1)、
示例2):
圖中同時打印了young gc和full gc的總次數、總耗時。而,每次young gc消耗的時間,能夠用相間隔的兩行YGCT相減獲得。每次full gc消耗的時間,能夠用相隔的兩行FGCT相減獲得。例如紅框中表示的第一行、第二行之間發生了1次young gc,消耗的時間爲0.252-0.252=0.0秒。
常駐內存區(P)的使用率,始終停留在64.21%左右,說明常駐內存沒有突變,比較正常。若是young gc和full gc可以正常發生,並且都能有效回收內存,常駐內存區變化不明顯,則說明java內存釋放狀況正常,垃圾回收及時,java內存泄露的概率就會大大下降。但也不能說明必定沒有內存泄露。
示例3)、
以上,介紹了Jstat按百分比查看gc狀況的功能。其實,它還有功能,例如加載類信息統計功能、內存池信息統計功能等,那些是以絕對值的形式打印出來的,比較少用,在此就不作介紹。
示例4)、jstat -class pid:顯示加載class的數量,及所佔空間等信息。
示例5)、jstat -compiler pid:顯示VM實時編譯的數量等信息。
這個須要先在遠程服務器上面開啓jstatd服務,能夠選看這裏如何開啓jstatd服務,http://blog.csdn.net/fenglibing/article/details/17323515
下面是一個執行示例:
C:\Documents and Settings\Administrator>jstat -gcutil 18272@the_ip:2021/jstatdName 1000
打印出某個java進程(使用pid)內存內的,全部‘對象’的狀況(如:產生那些對象,及其數量)。
能夠輸出全部內存中對象的工具,甚至能夠將VM 中的heap,以二進制輸出成文本。使用方法 jmap -histo pid。若是連用SHELL jmap -histo pid>a.log能夠將其保存到文本中去,在一段時間後,使用文本對比工具,能夠對比出GC回收了哪些對象。jmap -dump:format=b,file=outfile 3024能夠將3024進程的內存heap輸出出來到outfile文件裏,再配合MAT(內存分析工具(Memory Analysis Tool),使用參見:http://blog.csdn.net/fenglibing/archive/2011/04/02/6298326.aspx)或與jhat (Java Heap Analysis Tool)一塊兒使用,可以以圖像的形式直觀的展現當前內存是否有問題。
64位機上使用須要使用以下方式:
jmap -J-d64 -heap pid
SYNOPSIS
jmap [ option ] pid
jmap [ option ] executable core
jmap [ option ] [server-id@]remote-hostname-or-IP
1)、options:
executable Java executable from which the core dump was produced.
(多是產生core dump的java可執行程序)
core 將被打印信息的core dump文件
remote-hostname-or-IP 遠程debug服務的主機名或ip
server-id 惟一id,假如一臺主機上多個遠程debug服務
2)、基本參數:
-dump:[live,]format=b,file=<filename> 使用hprof二進制形式,輸出jvm的heap內容到文件=. live子選項是可選的,假如指定live選項,那麼只輸出活的對象到文件.
-finalizerinfo 打印正等候回收的對象的信息.
-heap 打印heap的概要信息,GC使用的算法,heap的配置及wise heap的使用狀況.
-histo[:live] 打印每一個class的實例數目,內存佔用,類全名信息. VM的內部類名字開頭會加上前綴」*」. 若是live子參數加上後,只統計活的對象數量.
-permstat 打印classload和jvm heap長久層的信息. 包含每一個classloader的名字,活潑性,地址,父classloader和加載的class數量. 另外,內部String的數量和佔用內存數也會打印出來.
-F 強迫.在pid沒有相應的時候使用-dump或者-histo參數. 在這個模式下,live子參數無效.
-h | -help 打印輔助信息
-J 傳遞參數給jmap啓動的jvm.
pid 須要被打印配相信息的java進程id,創業與打工的區別 - 博文預覽,能夠用jps查問.
1)、[fenglb@ccbu-156-5 ~]$ jmap -histo 4939
[輸出較多這裏不貼了]
2)、[fenglb@ccbu-156-5 ~]$ jmap -dump:format=b,file=test.bin 4939
Dumping heap to /home/fenglb/test.bin ...
Heap dump file created
jinfo能夠輸出並修改運行時的java 進程的opts。用處比較簡單,用於輸出JAVA系統參數及命令行參數。用法是jinfo -opt pid 如:查看2788的MaxPerm大小能夠用 jinfo -flag MaxPermSize 2788。
jconsole:一個java GUI監視工具,能夠以圖表化的形式顯示各類數據。並可經過遠程鏈接監視遠程的服務器VM。用java寫的GUI程序,用來監控VM,並可監控遠程的VM,很是易用,並且功能很是強。命令行裏打 jconsole,選則進程就能夠了。
須要注意的就是在運行jconsole以前,必需要先設置環境變量DISPLAY,不然會報錯誤,Linux下設置環境變量以下:
export DISPLAY=:0.0
[root@localhost bin]# jconsole
上兩個圖看一下:
能夠這裏選擇查看本地進程的情況,仍是遠程進程的情況。
經過這張圖能夠看到內存、線程、類及CPU使用的一些狀況。
jvisualvm同jconsole都是一個基於圖形化界面的、能夠查看本地及遠程的JAVA GUI監控工具,Jvisualvm同jconsole的使用方式同樣,直接在命令行打入Jvisualvm便可啓動,不過Jvisualvm相比,界面更美觀一些,數據更實時,上圖爲證:
jhat命令 -- Java Head Analyse Tool
用途:是用來分析java堆的命令,能夠將堆中的對象以html的形式顯示出來,包括對象的數量,大小等等,並支持對象查詢語言
第一步:導出堆
第二步:分析堆文件
第三步:查看html
有時你dump出來的堆很大,在啓動時會報堆空間不足的錯誤,可使用以下參數:
jhat -J-Xmx512m <heap dump file>
對於jhat啓動後顯示的html頁面中功能:
(1)顯示出堆中所包含的全部的類
(2)從根集能引用到的對象
(3)顯示平臺包括的全部類的實例數量
(4)堆實例的分佈表
(5)執行對象查詢語句
一、介紹
jstatd是一個基於RMI(Remove Method Invocation)的服務程序,它用於監控基於HotSpot的JVM中資源的建立及銷燬,而且提供了一個遠程接口容許遠程的監控工具鏈接到本地的JVM執行命令。
jstatd是基於RMI的,因此在運行jstatd的服務器上必須存在RMI註冊中心,若是沒有經過選項"-p port"指定要鏈接的端口,jstatd會嘗試鏈接RMI註冊中心的默認端口。後面會談到如何鏈接到一個默認的RMI內部註冊中心,如何禁止默認的RMI內部註冊中心的建立,以及如何啓動一個外部註冊中心。
二、參數選項
jstatd命令支持以下的選項:
-nr 若是RMI註冊中心沒有找到,不會建立一個內部的RMI註冊中心。
-p port RMI註冊中心的端口號,默認爲1099。
-n rminame 默認爲JStatRemoteHost;若是同一臺主機上同時運行了多個jstatd服務,rminame能夠用於惟一肯定一個jstatd服務;這裏須要注意一下,若是開啓了這個選項,那麼監控客戶端遠程鏈接時,必須同時指定hostid及vmid,才能夠惟一肯定要鏈接的服務,這個能夠參看jps章節中列出遠程服務器上Java進程的示例。
-J 用於傳遞jvm選項到由javac調用的java加載器中,例如,「-J-Xms48m」將把啓動內存設置爲48M,使用-J選項能夠很是方便的向基於Java的開發的底層虛擬機應用程序傳遞參數。
三、安全性
jstatd服務只能監視具備適當的本地訪問權限的JVM,所以jstatd進程與被監控的JVM必須運行在相同的用戶權限中。可是有一些特殊的用戶權限,如基於UNIX(TM)爲系統的root用戶,它有權限訪問系統中全部JVM的資源,若是jstatd進程運行在這種權限中,那麼它能夠監視系統中的全部JVM,可是這也帶來了額外的安全問題。
jstatd服務不會對客戶端進行任何的驗證,所以運行了jstatd服務的JVMs,網絡上的任何用戶的都具備訪問權限,這種暴露不是咱們所但願的,所以在啓動jstatd以前本地安全策略必需要加以考慮,特別是在生產環境中或者是在不安全的網絡環境中。
若是沒有其餘安全管理器被安裝,jstatd服務將會安裝一個RMISecurityPolicy的實例,所以須要在一個安全策略文件中指定,該策略文件必須符合的默認策略實施的策略文件語法。
下面的這個示例策略將容許jstatd服務具備JVM所有的訪問權限:
注:此處策略中的java.home,和JAVA_HOME不是一個概念,童鞋們不要搞錯了,此處的java.home指的是JRE的路徑,這個是Java的系統屬性,不須要手工指定,一般是這個jdk下面的jre路徑,便可以認爲${java.home}和${JAVA_HOME}/jre是等價,若是想查看這個變量的值,能夠任意找一個運行着的Java應用,找到它的PID,而後經過以下jinfo命令查看就能夠查看到java.home的值:
也能夠在Java代碼中經過以下方式獲取到:
將上面的策略內容拷貝一個文件中,文件名能夠隨意取,爲了形象咱們將文件名命名爲jstatd.all.policy,文件存放的路徑也能夠隨意,只有你當前登錄的用戶具備訪問權限就能夠,而後執行如下命令就能夠啓動jstatd服務:
若是是在具備安全限制的環境中,jstatd的策略安全必定要設置得當,而且只容許受信任的服務器或者網絡訪問,以避免遭受網絡攻擊,若是存在安全隱患,最好不要啓動jstatd服務,就在本地使用jstat及jps等工具對JVM進行監控了。
四、示例
4.一、使用內部RMI註冊中心
下面這個示例演示了經過內部RMI註冊中心啓動jstatd,這個示例假設沒有其它的服務綁定到默認的RMI註冊中心端口(默認端口是1099)。
注:若是基於默認端口1099的RMI註冊中心原來沒有被啓動過,那麼上面運行的命令首先會啓動端口爲1099的RMI註冊中心,而後再啓動jstatd服務,此時即便jstatd中止了,RMI註冊中心也不會中止;若是是再次執行上面的命令,就不會再次啓動RMI註冊中心,jstatd會直接註冊到註冊中心。
4.二、使用外部的RMI註冊中心
這個示例演示了使用一個外部的RMI註冊中心來啓動jstatd,若是默認的內部註冊中心已經被啓動了,下面的這個示例就會拋出「端口1099已經被佔用」的異常,由於它嘗試在1099端口啓動外部RMI註冊中心:
這個示例演示了使用一個外部的RMI註冊中心來啓動jstatd,此註冊中心的端口爲2020:
這個示例演示了使用一個外部的RMI註冊中心來啓動jstatd,此註冊中心的端口爲2020,而且綁定到RMI註冊中心的名爲AlternateJstatdServerName:
注:這個端口爲2020的RMI註冊中心,咱們會在jps章節中使用到。
4.三、禁止內部RMI註冊中心的建立
這個示例演示了jstatd在啓動的時候,若是沒有找到默認的RMI註冊中心,也不會建立默認的註冊中心。這個示例中若是沒有RMI註冊中心在運行,此示例就會報錯,若是存在就會正常運行:
4.四、開啓RMI日記記錄
這個示例演示的是jstatd運行在開啓了日誌記錄功能的RMI註冊中,這個對於問題查找或監控服務狀態很是有用:
一、MAT是什麼?
MAT(Memory Analyzer Tool),一個基於Eclipse的內存分析工具,是一個快速、功能豐富的JAVA heap分析工具,它能夠幫助咱們查找內存泄漏和減小內存消耗。使用內存分析工具從衆多的對象中進行分析,快速的計算出在內存中對象的佔用大小,看看是誰阻止了垃圾收集器的回收工做,並能夠經過報表直觀的查看到可能形成這種結果的對象。
2.爲何使用MAT?
當服務器應用佔用了過多內存的時候,會遇到OutOfMemoryError。如何快速定位問題呢?Eclipse MAT的出現使這個問題變得很是簡單。它可以離線分析dump的文件數據。
Eclipse MAT是SAP公司貢獻的一個工具,能夠在Eclipse網站下載到它,徹底免費的。它可比Sun提供的內存鏡像分析工具jhat要強太多了。
3.
首頁:http://www.eclipse.org/mat/
插件更新地址:
http://download.eclipse.org/mat/1.0/update-site/
先調用jdk的工具獲得heap使用狀況
我安裝的是jdk1.6
C:/>java -version
java version "1.6.0_11"
Java(TM) SE Runtime Environment (build 1.6.0_11-b03)
Java HotSpot(TM) Client VM (build 11.0-b16, mixed mode, sharing)
調用jdk工具jps查看當前的java進程
C:/>jps
3504 Jps
3676 Bootstrap
3496 org.eclipse.equinox.launcher_1.0.201.R35x_v20090715.jar
調用jmap工具獲得信息
C:/>jmap -dump:format=b,file=heap.bin 3676
Dumping heap to C:/heap.bin ...
Heap dump file created
這時,咱們的C盤根目錄,就生成了heap.bin文件,用eclipse的file---->open打開這個文件,首先是一個啓動圖:
這裏能夠選擇查看
一、內存泄露報表,自動檢查可能存在內存泄露的對象,經過報表展現存活的對象以及爲何他們沒有被垃圾收集;
二、對象報表,對可穎對象的分析,如字符串是否認義重了,空的collection、finalizer以及弱引用等。
我這裏選擇的是查看內存報表,如下是截的簡略圖: