Jmap是JDK自帶的1個輕量級小工具。位于java的bin目錄下,它能夠打印出某個java進程(使用pid)內(nèi)存中所有‘對象’的情況(如:產(chǎn)生那些對象,及其數(shù)量)。它不但可以輸出所有內(nèi)存中對象的工具,乃至可以將VM 中的heap,以2進制輸出成文本。使用方法 jmap -histo pid。也能夠?qū)⑵浔4娴轿谋局腥ィ?段時間后,使用文本對照工具,可以對照出GC回收了哪些對象。還可以和jhat (Java Heap Analysis Tool)1起使用,能夠以圖象的情勢直觀的展現(xiàn)當(dāng)前內(nèi)存是不是有問題。
1、Jmap命令格式
jmap [ option ] pid
2、經(jīng)常使用參數(shù)
注意:jmap大部份功能都只能在Linux下運行,在windows下只有-dump和-histo選項有效
-dump:[live,]format=b,file=<filename>使用hprof2進制情勢,輸出jvm的heap內(nèi)容到文件=. live子選項是可選的,假設(shè)指定live選項,那末只輸出活的對象到文件.
-finalizerinfo打印正等候回收的對象的信息.
-heap 打印heap的概要信息,GC使用的算法,heap的配置及wise heap的使用情況.
-histo[:live] 打印每一個class的實例數(shù)目,內(nèi)存占用,類全名信息. VM的內(nèi)部類名字開頭會加上前綴”*”. 如果live子參數(shù)加上后,只統(tǒng)計活的對象數(shù)量.
-permstat 打印classload和jvm heap久長層的信息. 包括每一個classloader的名字,活潑性,地址,父classloader和加載的class數(shù)量. 另外,內(nèi)部String的數(shù)量和占用內(nèi)存數(shù)也會打印出來.
-F 逼迫.在pid沒有相應(yīng)的時候使用-dump或-histo參數(shù). 在這個模式下,live子參數(shù)無效.
-h | -help 打印輔助信息
3、源代碼
package com.jdkTools;
import java.util.ArrayList;
import java.util.Random;
/**
* 簡單的利用,有大量的循環(huán)和創(chuàng)建對象,供測試JDK自帶的jmap使用
* 參數(shù):-Xms30m -Xmx60m
*
* @author 范芳銘
*/
public class EasyJmap {
public byte[] placeHolder = newbyte[1 * 1024]; // 占位符
public static void main(String[]args) throws Exception {
while (true) {
Random random = newRandom();
int loops =random.nextInt(10000);
EasyJmap jstat = newEasyJmap();
System.out.println("......正在構(gòu)建對象:" + loops + "(個)");
jstat.getLoop(loops); //屢次循環(huán),產(chǎn)生大量對象
Thread.sleep(10);
}
}
public void getLoop(int size) {
ArrayList<EasyJmap>list = new ArrayList<EasyJmap>();
for (int i = 0; i < size;i++) {
EasyJmap jstat = newEasyJmap();
list.add(jstat);
}
}
}
4、運行參數(shù)
* 參數(shù):-Xms30m -Xmx60m ,本參數(shù)用于啟動JVM虛擬機
5、運行結(jié)果
C:Program FilesJavajdk1.6.0_25in>jmap -dump:format=b,file=d:/ffm83/jmaplog.txt1668
Dumping heap to D:ffm83jmaplog.txt ...
Heap dump file created
查看-histo[:live] 打印堆的對象統(tǒng)計,包括對象數(shù)、內(nèi)存大小等等
C:Program FilesJavajdk1.6.0_25in>jmap -histo 1668
num #instances #bytes class name
----------------------------------------------
1: 7561 7536976 [B
2: 4970 496896 <constMethodKlass>
3: 8147 441176 <symbolKlass>
4: 4970 400192 <methodKlass>
5: 1458 198624 [C
6: 320 188400 <constantPoolKlass>
7: 298 128672 <constantPoolCacheKlass>
8: 320 127832 <instanceKlassKlass>
9: 7174 114784 com.jdkTools.EasyJmap
10: 314 64696 [Ljava.lang.Object;
11: 380 41904 [I
12: 388 37248 java.lang.Class
13: 1485 35640 java.lang.String
…