jstack -- 若是java程序崩潰生成core文件,jstack工具能夠用來得到core文件的java stack和native stack的信息,從而能夠輕鬆地知道java程序是如何崩潰和在程序何處發生問題。另外,jstack工具還能夠附屬到正在運行的java程序中,看到 當時運行的java程序的java stack和native stack的信息, 若是如今運行的java程序呈現hung的狀態,jstack是很是有用的。目前只有在Solaris和Linux的JDK版本里面纔有。java
jconsole – jconsole是基於Java Management Extensions (JMX)的實時圖形化監測工具,這個工具利用了內建到JVM裏面的JMX指令來提供實時的性能和資源的監控,包括了Java 程序的內存使用,Heap size, 線程的狀態,類的分配狀態和空間使用等等。linux
jinfo – jinfo能夠從core文件裏面知道崩潰的Java應用程序的配置信息,目前只有在Solaris和Linux的JDK版本里面纔有。spring
jmap – jmap 能夠從core文件或進程中得到內存的具體匹配狀況,包括Heap size, Perm size等等,目前只有在Solaris和Linux的JDK版本里面纔有。apache
jdb – jdb 用來對core文件和正在運行的Java進程進行實時地調試,裏面包含了豐富的命令幫助您進行調試,它的功能和Sun studio裏面所帶的dbx很是類似,但 jdb是專門用來針對Java應用程序的。bootstrap
jstat – jstat利用了JVM內建的指令對Java應用程序的資源和性能進行實時的命令行的監控,包括了對Heap size和垃圾回收情況的監控等等。api
jps – jps是用來查看JVM裏面全部進程的具體狀態, 包括進程ID,進程啓動的路徑等等。tomcat
jstatd安全
啓動jvm監控服務。它是一個基於rmi的應用,向遠程機器提供本機jvm應用程序的信息。默認端口1099。服務器
實例:jstatd -J-Djava.security.policy=my.policy網絡
my.policy文件須要本身創建,內如以下:
這是安全策略文件,由於jdk對jvm作了jaas的安全檢測,因此咱們必須設置一些策略,使得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)
create in your usr/java/bin the jstatd.all.policy file, with the content must be
JPS
列出全部的jvm實例
實例:
jps
列出本機全部的jvm實例
jps 192.168.0.77
列出遠程服務器192.168.0.77機器全部的jvm實例,採用rmi協議,默認鏈接端口爲1099(前提是遠程服務器提供jstatd服務)
輸出內容以下:
jones@jones:~/data/ebook/java/j2se/jdk_gc$ jps 6286 Jps 6174 Jstat
jconsole
一個圖形化界面,能夠觀察到java進程的gc,class,內存等信息。雖然比較直觀,可是我的仍是比較傾向於使用jstat命令(在最後一部分會對jstat做詳細的介紹)。
jinfo (linux下特有)
觀察運行中的java程序的運行環境參數:參數包括Java System屬性和JVM命令行參數
實例:jinfo 2083
其中2083就是java進程id號,能夠用jps獲得這個id號。
輸出內容太多了,不在這裏一一列舉,你們能夠本身嘗試這個命令。
jstack (linux下特有)
能夠觀察到jvm中當前全部線程的運行狀況和線程當前狀態
jstack 2083
輸出內容以下:
jmap (linux下特有,也是很經常使用的一個命令)
觀察運行中的jvm物理內存的佔用狀況。
參數以下:
-heap :打印jvm heap的狀況
-histo: 打印jvm heap的直方圖。其輸出信息包括類名,對象數量,對象佔用大小。
-histo:live : 同上,可是隻答應存活對象的狀況
-permstat: 打印permanent generation heap狀況
命令使用:
jmap -heap 2083
能夠觀察到New Generation(Eden Space,From Space,To Space),tenured generation,Perm Generation的內存使用狀況
輸出內容:
jmap -histo 2083 | jmap -histo:live 2083
能夠觀察heap中全部對象的狀況(heap中全部生存的對象的狀況)。包括對象數量和所佔空間大小。
輸出內容:
寫個腳本,能夠很快把佔用heap最大的對象找出來,對付內存泄漏特別有效。
jstat
最後要重點介紹下這個命令。
這是jdk命令中比較重要,也是至關實用的一個命令,能夠觀察到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狀況
-printcompilation:不知道幹什麼的,一直沒用過。
通常比較經常使用的幾個參數是:
jstat -class 2083 1000 10 (每隔1秒監控一次,一共作10次)
輸出內容含義以下:
Loaded | Number of classes loaded. |
Bytes | Number of Kbytes loaded. |
Unloaded | Number of classes unloaded. |
Bytes | Number of Kbytes unloaded. |
Time | Time spent performing class load and unload operations. |
jstat -gc 2083 2000 20(每隔2秒監控一次,共作10)
輸出內容含義以下:
S0C | Current survivor space 0 capacity (KB). |
EC | Current eden space capacity (KB). |
EU | Eden space utilization (KB). |
OC | Current old space capacity (KB). |
OU | Old space utilization (KB). |
PC | Current permanent space capacity (KB). |
PU | Permanent space utilization (KB). |
YGC | Number of young generation GC Events. |
YGCT | Young generation garbage collection time. |
FGC | Number of full GC events. |
FGCT | Full garbage collection time. |
GCT | Total garbage collection time. |
輸出內容:
若是能熟練運用這些命令,尤爲是在linux下,那麼徹底能夠代替jprofile等監控工具了,誰讓它收費呢。呵呵。
用命令的好處就是速度快,而且輔助於其餘命令,好比grep gawk sed等,能夠組裝多種符合本身需求的工具。
用來查看 JVM 裏面全部進程的具體狀態 , 包括進程 ID ,進程啓動的路徑等等。 與 unix 上的 ps 相似,用來顯示本地的 java 進程,能夠查看本地運行着幾個 java 程序,並顯示他們的進程號。
[root@localhost ~]# jps
25517 Jps
25444 Bootstrap
若是 java 程序崩潰生成 core 文件, jstack 工具能夠用來得到 core 文件的 java stack 和 native stack 的信息,從而能夠輕鬆地知道 java 程序是如何崩潰和在程序何處發生問題。另外, jstack 工具還能夠附屬到正在運行的 java 程序中,看到當時運行的 java 程序的 java stack 和 native stack 的信息 , 若是如今運行的 java 程序呈現 hung 的狀態, jstack 是很是有用的。目前只有在 Solaris 和 Linux 的 JDK 版本里面纔有。
[root@localhost bin]# jstack 25444
Attaching to process ID 25917, please wait...
Debugger attached successfully.
Client compiler detected.
JVM version is 1.5.0_08-b03
Thread 25964: (state = BLOCKED)
Error occurred during stack walking:
sun.jvm.hotspot.debugger.DebuggerException: sun.jvm.hotspot.debugger.DebuggerException: get_thread_regs failed for a lwp
at sun.jvm.hotspot.debugger.linux.LinuxDebuggerLocal$LinuxDebuggerLocalWorkerThread.execute(LinuxDebuggerLocal.java:134)
at sun.jvm.hotspot.debugger.linux.LinuxDebuggerLocal.getThreadIntegerRegisterSet(LinuxDebuggerLocal.java:437)
at sun.jvm.hotspot.debugger.linux.LinuxThread.getContext(LinuxThread.java:48)
at
用以判斷JVM 是否存在內存問題呢?如何判斷JVM 垃圾回收是否正常?通常的top 指令基本上知足不了這樣的需求,由於它主要監控的是整體的系統資源,很難定位到java 應用程序。
Jstat 是JDK 自帶的一個輕量級小工具。全稱「Java Virtual Machine statistics monitoring tool」 ,它位於java 的bin 目錄下,主要利用JVM 內建的指令對Java 應用程序的資源和性能進行實時的命令行的監控,包括了對Heap size 和垃圾回收情況的監控。可見,Jstat 是輕量級的、專門針對JVM 的工具,很是適用。因爲JVM 內存設置較大,圖中百分比變化不太明顯
一個極強的監視 VM 內存工具。能夠用來監視 VM 內存內的各類堆和非堆的大小及其內存使用量。
jstat 工具特別強大,有衆多的可選項,詳細查看堆內各個部分的使用量,以及加載類的數量。使用時,需加上查看進程的進程 id ,和所選參數。
語法結構:
Usage: jstat -help|-options
jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]
參數解釋:
Options — 選項,咱們通常使用 -gcutil 查看gc 狀況
vmid — VM 的進程號,即當前運行的java 進程號
interval– 間隔時間,單位爲秒或者毫秒
count — 打印次數,若是缺省則打印無數次
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 — 從應用程序啓動到採樣時用於垃圾回收的總時間( 單位秒)
實例使用1 :
[root@localhost bin]# jstat -gcutil 25444
S0 S1 E O P YGC YGCT FGC FGCT GCT
11.63 0.00 56.46 66.92 98.49 162 0.248 6 0.331 0.579
實例使用 2 :
[root@localhost bin]# jstat -gcutil 25444 1000 5
S0 S1 E O P YGC YGCT FGC FGCT GCT
73.54 0.00 99.04 67.52 98.49 166 0.252 6 0.331 0.583
73.54 0.00 99.04 67.52 98.49 166 0.252 6 0.331 0.583
73.54 0.00 99.04 67.52 98.49 166 0.252 6 0.331 0.583
73.54 0.00 99.04 67.52 98.49 166 0.252 6 0.331 0.583
73.54 0.00 99.04 67.52 98.49 166 0.252 6 0.331 0.583
咱們能夠看到,5 次young gc 以後,垃圾內存被從Eden space 區(E) 放入了Old space 區(O) ,並引發了百分比的變化,致使Survivor space 使用的百分比從73.54%(S0) 降到0%(S1) 。有效釋放了內存空間。綠框中,咱們能夠看到,一次full gc 以後,Old space 區(O) 的內存被回收,從99.05% 降到67.52% 。
圖中同時打印了young gc 和full gc 的總次數、總耗時。而,每次young gc 消耗的時間,能夠用相間隔的兩行YGCT 相減獲得。每次full gc 消耗的時間,能夠用相隔的兩行FGCT 相減獲得。例如紅框中表示的第一行、第二行之間發生了1 次young gc ,消耗的時間爲0.252-0.252 =0.0 秒。
常駐內存區(P) 的使用率,始終停留在98.49% 左右,說明常駐內存沒有突變,比較正常。
若是young gc 和full gc 可以正常發生,並且都能有效回收內存,常駐內存區變化不明顯,則說明java 內存釋放狀況正常,垃圾回收及時,java 內存泄露的概率就會大大下降。但也不能說明必定沒有內存泄露。
GCT 是YGCT 和FGCT 的時間總和。
以上,介紹了Jstat 按百分比查看gc 狀況的功能。其實,它還有功能,例如加載類信息統計功能、內存池信息統計功能等,那些是以絕對值的形式打印出來的,比較少用,在此就不作介紹。
[root@localhost bin]# ps -ef | grep java
root 25917 1 2 23:23 pts /2 00:00:05 /usr/local/jdk1.5/bin/java -Djava.endorsed.dirs=/usr/local/jakarta-tomcat-5.0.30/common/endorsed -classpath /usr/local/jdk1.5/lib/tools.jar:/usr/local/jakarta-tomcat-5.0.30/bin/bootstrap.jar:/usr/local/jakarta-tomcat-5.0.30/bin/commons-logging-api.jar -Dcatalina.base=/usr/local/jakarta-tomcat-5.0.30 -Dcatalina.home=/usr/local/jakarta-tomcat-5.0.30 -Djava.io.tmpdir=/usr/local/jakarta-tomcat-5.0.30/temp org.apache.catalina.startup.Bootstrap start
jstat -class pid: 顯示加載 class 的數量,及所佔空間等信息。
實例使用3 :
[root@localhost bin]# jstat -class 25917
Loaded Bytes Unloaded Bytes Time
2629 2916.8 29 24.6 0.90
jstat -compiler pid: 顯示 VM 實時編譯的數量等信息。
實例使用 4 :
[root@localhost bin]# jstat -compiler 25917
Compiled Failed Invalid Time FailedType FailedMethod
768 0 0 0.70 0
jstat –gccapacity : 能夠顯示, VM 內存中三代( young,old,perm )對象的使用和佔用大小,如: PGCMN 顯示的是最小 perm 的內存使用量, PGCMX 顯示的是 perm 的內存最大使用量, PGC 是當前新生成的 perm 內存佔用量, PC 是但前 perm 內存佔用量。其餘的能夠根據這個類推, OC 是 old 內純的佔用量。
[root@localhost bin]# jstat -gccapacity 25917
NGCMN 640.0
NGCMX 4992.0
NGC 832.0
S0C 64.0
S1C 64.0
EC 704.0
OGCMN 1408.0
OGCMX 60544.0
OGC 9504.0
OC 9504.0 OC 是 old 內純的佔用量
PGCMN 8192.0 PGCMN 顯示的是最小 perm 的內存使用量
PGCMX 65536.0 PGCMX 顯示的是 perm 的內存最大使用量
PGC 12800.0 PGC 是當前新生成的 perm 內存佔用量
PC 12800.0 PC 是但前 perm 內存佔用量
YGC 164
FGC 6
jstat -gcnew pid: new 對象的信息
[root@localhost bin]# jstat -gcnew 25917
S0C S1C S0U S1U TT MTT DSS EC EU YGC YGCT
64.0 64.0 47.4 0.0 2 15 32.0 704.0 145.7 168 0.254
jstat -gcnewcapacity pid: new 對象的信息及其佔用量
[root@localhost bin]# jstat -gcnewcapacity 25917
NGCMN NGCMX NGC S0CMX S0C S1CMX S1C ECMX EC YGC FGC
640.0 4992.0 832.0 64.0 448.0 448.0 64.0 4096.0 704.0 168 6
jstat -gcold pid: old 對象的信息。
[root@localhost bin]# jstat -gcold 25917
PC PU OC OU YGC FGC FGCT GCT
12800.0 12617.6 9504.0 6561.3 169 6 0.335 0.591
jstat -gcoldcapacity pid:old 對象的信息及其佔用量。
[root@localhost bin]# jstat -gcoldcapacity 25917
OGCMN OGCMX OGC OC YGC FGC FGCT GCT
1408.0 60544.0 9504.0 9504.0 169 6 0.335 0.591
jstat -gcpermcapacity pid: perm 對象的信息及其佔用量。
[root@localhost bin]# jstat -gcpermcapacity 25917
PGCMN PGCMX PGC PC YGC FGC FGCT GCT
8192.0 65536.0 12800.0 12800.0 169 6 0.335 0.591
jstat -printcompilation pid: 當前 VM 執行的信息。
[root@localhost bin]# jstat -printcompilation -h3 25917 1000 5
每 1000 毫秒打印一次,一共打印 5 次,還能夠加上 -h3 每三行顯示一下標題。
Compiled Size Type Method
788 73 1 java/io/File <init>
788 73 1 java/io/File <init>
788 73 1 java/io/File <init>
Compiled Size Type Method
788 73 1 java/io/File <init>
788 73 1 java/io/File <init>
打印出某個 java 進程(使用 pid )內存內的,全部 ‘ 對象 ’ 的狀況(如:產生那些對象,及其數量)。
能夠輸出全部內存中對象的工具,甚至能夠將 VM 中的 heap ,以二進制輸出成文本。使用方法 jmap -histo pid 。若是連用 SHELL jmap -histo pid>a.log 能夠將其保存到文本中去,在一段時間後,使用文本對比工具,能夠對比出 GC 回收了哪些對象。 jmap -dump:format=b,file=String 3024 能夠將 3024 進程的內存 heap 輸出出來到 String 文件裏。
[root@localhost bin]# jmap -histo 25917
Attaching to process ID 26221, please wait...
Debugger attached successfully.
Client compiler detected.
JVM version is 1.5.0_08-b03
Iterating over heap. This may take a while...
Unknown oop at 0xaa6e42d0
Oop's klass is null
Object Histogram:
Size Count Class description
-------------------------------------------------------
3722768 30467 * ConstMethodKlass
1976480 25334 char[]
1907880 46994 * SymbolKlass
1762088 2947 byte[]
1709536 30467 * MethodKlass
1487816 2600 * ConstantPoolKlass
1009576 2600 * InstanceKlassKlass
904880 2199 * ConstantPoolCacheKlass
741432 30893 java.lang.String
653576 4785 int[]
351760 4397 java.lang.reflect.Method
277824 2894 java.lang.Class
248704 3401 short[]
200888 4411 java.lang.Object[]
193656 4045 java.lang.Object[]
179744 5617 java.util.TreeMap$Entry
175688 1800 java.util.HashMap$Entry[]
165288 6887 java.util.HashMap$Entry
104736 3273 java.lang.ref.SoftReference
104136 4339 java.lang.ref.WeakReference
96096 3521 java.lang.String[]
86160 3590 java.util.Hashtable$Entry
85584 3566 java.util.ArrayList
83472 1206 java.util.Hashtable$Entry[]
82944 1728 java.beans.MethodDescriptor
80560 265 * ObjArrayKlassKlass
69120 1728 java.util.HashMap
52464 3055 java.lang.Class[]
43040 1076 java.util.Hashtable
42496 664 org.apache.commons.modeler.AttributeInfo
37880 947 java.util.TreeMap
33896 557 javax.management.modelmbean.ModelMBeanAttributeInfo[]
33152 518 java.beans.PropertyDescriptor
616 11 org.springframework.aop.framework.ProxyFactory
608 19 java.util.PropertyPermission
608 38 org.springframework.beans.MutablePropertyValues
608 38 org.springframework.beans.factory.support.MethodOverrides
608 2 * ArrayKlassKlass
608 38 org.springframework.beans.factory.config.ConstructorArgumentValues
608 4 org.apache.xerces.impl.XMLDTDScannerImpl
576 24 java.util.Stack
576 36 java.util.regex.Pattern$Category
576 24 org.apache.naming.NamingEntry
560 7 java.net.URL[]
552 23 sun.management.MappedMXBeanType$BasicMXBeanType
552 1 java.util.Locale[]
552 22 java.io.ObjectStreamField[]
544 17 java.util.Collections$SynchronizedMap
176 11 java.util.regex.Pattern$Ctype
8 1 sun.reflect.GeneratedMethodAccessor49
8 1 sun.reflect.GeneratedMethodAccessor6
8 1 sun.reflect.GeneratedConstructorAccessor10
Heap traversal took 12.003 seconds.
能夠輸出並修改運行時的 java 進程的 opts 。用處比較簡單,就是能輸出並修改運行時的 java 進程的運行參數。用法是 jinfo -opt pid 如:查看 2788 的 MaxPerm 大小能夠用 jinfo -flag MaxPermSize 2788 。
jconsole: 一個 java GUI 監視工具,能夠以圖表化的形式顯示各類數據。並可經過遠程鏈接監視遠程的服務器 VM 。
用 java 寫的 GUI 程序,用來監控 VM ,並可監控遠程的 VM ,很是易用,並且功能很是強。命令行裏打 jconsole ,選則進程就能夠了
不過我沒有運行起來,總是報下面的錯。會的朋友,幫忙看看。
[root@localhost bin]# jconsole
Exception in thread "AWT-EventQueue-0" java.awt.HeadlessException:
No X11 DISPLAY variable was set, but this program performed an operation which requires it. at java.awt.GraphicsEnvironment.checkHeadless(GraphicsEnvironment.java:159)
at java.awt.Window.<init>(Window.java:317)
at java.awt.Frame.<init>(Frame.java:419)
at javax.swing.JFrame.<init>(JFrame.java:194)
at sun.tools.jconsole.JConsole.<init>(JConsole.java:65)
at sun.tools.jconsole.JConsole$4.run(JConsole.java:666)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:461)
at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:242)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:163)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:157)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:149)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:110)
用來對 core 文件和正在運行的 Java 進程進行實時地調試,裏面包含了豐富的命令幫助您進行調試,它的功能和 Sun studio 裏面所帶的 dbx 很是類似,但 jdb 是專門用來針對 Java 應用程序的。
打印出某個 java 進程(使用 pid )內存內的,全部 ‘ 對象 ’ 的狀況(如:產生那些對象,及其數量)。
能夠輸出全部內存中對象的工具,甚至能夠將 VM 中的 heap ,以二進制輸出成文本。使用方法 jmap -histo pid 。若是連用 SHELL jmap -histo pid>a.log 能夠將其保存到文本中去,在一段時間後,使用文本對比工具,能夠對比出 GC 回收了哪些對象。 jmap -dump:format=b,file=String 3024 能夠將 3024 進程的內存 heap 輸出出來到 String 文件裏。
[root@localhost bin]# jmap -histo 25917
Attaching to process ID 26221, please wait...
Debugger attached successfully.
Client compiler detected.
JVM version is 1.5.0_08-b03
Iterating over heap. This may take a while...
Unknown oop at 0xaa6e42d0
Oop's klass is null
Object Histogram:
Size Count Class description
-------------------------------------------------------
3722768 30467 * ConstMethodKlass
1976480 25334 char[]
1907880 46994 * SymbolKlass
1762088 2947 byte[]
1709536 30467 * MethodKlass
1487816 2600 * ConstantPoolKlass
1009576 2600 * InstanceKlassKlass
904880 2199 * ConstantPoolCacheKlass
741432 30893 java.lang.String
653576 4785 int[]
351760 4397 java.lang.reflect.Method
277824 2894 java.lang.Class
248704 3401 short[]
200888 4411 java.lang.Object[]
193656 4045 java.lang.Object[]
179744 5617 java.util.TreeMap$Entry
175688 1800 java.util.HashMap$Entry[]
165288 6887 java.util.HashMap$Entry
104736 3273 java.lang.ref.SoftReference
104136 4339 java.lang.ref.WeakReference
96096 3521 java.lang.String[]
86160 3590 java.util.Hashtable$Entry
85584 3566 java.util.ArrayList
83472 1206 java.util.Hashtable$Entry[]
82944 1728 java.beans.MethodDescriptor
80560 265 * ObjArrayKlassKlass
69120 1728 java.util.HashMap
52464 3055 java.lang.Class[]
43040 1076 java.util.Hashtable
42496 664 org.apache.commons.modeler.AttributeInfo
37880 947 java.util.TreeMap
33896 557 javax.management.modelmbean.ModelMBeanAttributeInfo[]
33152 518 java.beans.PropertyDescriptor
616 11 org.springframework.aop.framework.ProxyFactory
608 19 java.util.PropertyPermission
608 38 org.springframework.beans.MutablePropertyValues
608 38 org.springframework.beans.factory.support.MethodOverrides
608 2 * ArrayKlassKlass
608 38 org.springframework.beans.factory.config.ConstructorArgumentValues
608 4 org.apache.xerces.impl.XMLDTDScannerImpl
576 24 java.util.Stack
576 36 java.util.regex.Pattern$Category
576 24 org.apache.naming.NamingEntry
560 7 java.net.URL[]
552 23 sun.management.MappedMXBeanType$BasicMXBeanType
552 1 java.util.Locale[]
552 22 java.io.ObjectStreamField[]
544 17 java.util.Collections$SynchronizedMap
176 11 java.util.regex.Pattern$Ctype
8 1 sun.reflect.GeneratedMethodAccessor49
8 1 sun.reflect.GeneratedMethodAccessor6
8 1 sun.reflect.GeneratedConstructorAccessor10
Heap traversal took 12.003 seconds.
能夠輸出並修改運行時的 java 進程的 opts 。用處比較簡單,就是能輸出並修改運行時的 java 進程的運行參數。用法是 jinfo -opt pid 如:查看 2788 的 MaxPerm 大小能夠用 jinfo -flag MaxPermSize 2788 。
jconsole: 一個 java GUI 監視工具,能夠以圖表化的形式顯示各類數據。並可經過遠程鏈接監視遠程的服務器 VM 。
用 java 寫的 GUI 程序,用來監控 VM ,並可監控遠程的 VM ,很是易用,並且功能很是強。命令行裏打 jconsole ,選則進程就能夠了
不過我沒有運行起來,總是報下面的錯。會的朋友,幫忙看看。
[root@localhost bin]# jconsole
Exception in thread "AWT-EventQueue-0" java.awt.HeadlessException:
No X11 DISPLAY variable was set, but this program performed an operation which requires it. at java.awt.GraphicsEnvironment.checkHeadless(GraphicsEnvironment.java:159)
at java.awt.Window.<init>(Window.java:317)
at java.awt.Frame.<init>(Frame.java:419)
at javax.swing.JFrame.<init>(JFrame.java:194)
at sun.tools.jconsole.JConsole.<init>(JConsole.java:65)
at sun.tools.jconsole.JConsole$4.run(JConsole.java:666)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:461)
at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:242)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:163)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:157)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:149)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:110)
用來對 core 文件和正在運行的 Java 進程進行實時地調試,裏面包含了豐富的命令幫助您進行調試,它的功能和 Sun studio 裏面所帶的 dbx 很是類似,但 jdb 是專門用來針對 Java 應用程序的。
原文連接:http://blog.csdn.net/jacky0922/article/details/6201878
【編輯推薦】