JConsole java
JConsole 是一個內置 Java 性能分析器,能夠從命令行或在 GUI shell 中運行。能夠輕鬆地使用 JConsole來監控 Java 應用程序性能和跟蹤 Java 中的代碼。sql
1- 啓動shell
使 JDK 在 PATH 上,從命令行啓動,運行 jconsole 數組
2- 鏈接jvm
2.1- 本地鏈接ide
2.2- 遠程鏈接工具
無認證鏈接設置
性能
-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=8888 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false
圖示以下
spa
還有一種啓動方式:jconsole.exe 192.168.3.228:8888hibernate
3- 性能分析
3.1- 概述: Displays overview information about the Java VM and monitored values.
對着圖點擊右鍵能夠保存數據到CSV文件,之後能夠使用其餘工具來分析這些數據。
3.2- 內存: 顯示內存使用信息
查看堆內存,非堆內存,內存池的情況整體內存的分配和使用狀況以及不一樣的GC進行垃圾回收的次數和時間。
3.3- 線程: 顯示線程使用信息
3.4- 類: 顯示類裝載信息
3.5- VM摘要: 顯示java VM信息
3.6- MBeans: 顯示 MBeans
jvisualvm
升級版的jConsole。
從命令行啓動,運行 jvisualvm 。
jmap
用來顯示Java進程的內存映射。
1-默認視圖
查看鏈接到進程裏的本地類庫。
[xinli@192 ~]$ jmap 26001 Attaching to process ID 26001, please wait... Debugger attached successfully. Server compiler detected. JVM version is 17.0-b16 0x00683000 139K /lib/ld-2.12.so 0x006a9000 1845K /lib/libc-2.12.so 0x0083d000 197K /lib/libm-2.12.so 0x00869000 19K /lib/libdl-2.12.so 0x00870000 130K /lib/libpthread-2.12.so 0x008a3000 40K /lib/librt-2.12.so 0x04103000 113K /lib/libnsl-2.12.so 0x08048000 46K /usr/java/jdk1.6.0_21/bin/java 0x4ef5f000 36K /usr/java/jdk1.6.0_21/jre/lib/i386/libnio.so 0x53402000 4K /usr/java/jdk1.6.0_21/jre/lib/i386/librmi.so 0xb6c09000 93K /usr/java/jdk1.6.0_21/jre/lib/i386/libnet.so 0xb6c1d000 33K /usr/java/jdk1.6.0_21/jre/lib/i386/libmanagement.so 0xb6c75000 57K /lib/libnss_files-2.12.so 0xb6c86000 74K /usr/java/jdk1.6.0_21/jre/lib/i386/libzip.so 0xb6c9f000 184K /usr/java/jdk1.6.0_21/jre/lib/i386/libjava.so 0xb6d15000 9452K /usr/java/jdk1.6.0_21/jre/lib/i386/server/libjvm.so 0xb78b5000 37K /usr/java/jdk1.6.0_21/jre/lib/i386/jli/libjli.so 0xb78c5000 37K /usr/java/jdk1.6.0_21/jre/lib/i386/native_threads/libhpi.so 0xb78ce000 55K /usr/java/jdk1.6.0_21/jre/lib/i386/libverify.so [xinli@192 ~]$
2-堆視圖
堆大小是年輕代、年老代加上PermGen區總和。年輕代內部有伊甸園和倖存者樂園。
[xinli@192 ~]$ jmap -heap 26001 Attaching to process ID 26001, please wait... Debugger attached successfully. Server compiler detected. JVM version is 17.0-b16 using thread-local object allocation. Parallel GC with 2 thread(s) Heap Configuration: MinHeapFreeRatio = 40 MaxHeapFreeRatio = 70 MaxHeapSize = 1073741824 (1024.0MB) NewSize = 1048576 (1.0MB) MaxNewSize = 4294901760 (4095.9375MB) OldSize = 4194304 (4.0MB) NewRatio = 2 SurvivorRatio = 8 PermSize = 16777216 (16.0MB) MaxPermSize = 536870912 (512.0MB) Heap Usage: PS Young Generation Eden Space: capacity = 266665984 (254.3125MB) used = 219310160 (209.1504669189453MB) free = 47355824 (45.16203308105469MB) 82.24152053829258% used From Space: capacity = 34734080 (33.125MB) used = 34713344 (33.105224609375MB) free = 20736 (0.019775390625MB) 99.94030070754717% used To Space: capacity = 46268416 (44.125MB) used = 0 (0.0MB) free = 46268416 (44.125MB) 0.0% used PS Old Generation capacity = 715849728 (682.6875MB) used = 591219088 (563.8304595947266MB) free = 124630640 (118.85704040527344MB) 82.58983203804472% used PS Perm Generation capacity = 123863040 (118.125MB) used = 122851872 (117.16067504882812MB) free = 1011168 (0.964324951171875MB) 99.18364025297619% used [xinli@192 ~]$
以上信息看不到堆內的信息,要知道內存都到哪了去了,就得使用柱狀視圖。
3-柱狀視圖
jmap使用類型內部名稱。如:字符數組會寫成 [C 。
[xinli@192 ~]$ jmap -histo 26001 | head -30 num #instances #bytes class name ---------------------------------------------- 1: 2433674 208875632 [C 2: 72266 161710576 [B 3: 2288352 54920448 java.lang.String 4: 295753 36620048 <constMethodKlass> 5: 795406 35750608 [Ljava.lang.Object; 6: 295753 23665800 <methodKlass> 7: 803901 19293624 java.util.HashMap$Entry 8: 584375 18700000 java.util.LinkedHashMap$Entry 9: 375345 18016560 org.hibernate.collection.PersistentSet 10: 249156 16440472 [I 11: 199796 15983680 java.lang.reflect.Method 12: 98625 15092552 [Ljava.util.HashMap$Entry; 13: 375797 15031880 org.hibernate.engine.CollectionEntry 14: 22720 14800808 <constantPoolKlass> 15: 805673 12890768 java.lang.Long 16: 375797 12025504 org.hibernate.engine.CollectionKey 17: 481249 11549976 java.sql.Timestamp 18: 155849 11221128 VideoCategory 19: 87492 11198976 VideoProgramMenu 20: 22720 10706552 <instanceKlassKlass> 21: 18790 9374096 <constantPoolCacheKlass> 22: 163064 9131584 org.codehaus.groovy.runtime.metaclass.MetaMethodIndex$Entry 23: 166641 9002408 <symbolKlass> 24: 148902 8338512 org.codehaus.groovy.runtime.metaclass.MetaMethodIndex$Entry 25: 320357 7999624 [Ljava.lang.String; 26: 331095 7946280 java.sql.Date 27: 472017 7552272 org.hibernate.util.IdentityMap$IdentityKey [xinli@192 ~]$
以上只是輸出的一部分。輸出中有不少佔用內存的 [C 實體。
存貨對象的查看:
[xinli@192 ~]$ jmap -histo:live 26001 | head -5 num #instances #bytes class name ---------------------------------------------- 1: 1891237 111818968 [C 2: 1903147 45675528 java.lang.String
比較一下字符數據是否是下降了很多,說明有好多等待回收的垃圾。