jConsole,jvisualvm和jmap使用

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

比較一下字符數據是否是下降了很多,說明有好多等待回收的垃圾。

相關文章
相關標籤/搜索