java内存查看与分析

1:gc日志输出

在jvm启动参数中加入 -XX:+PrintGC -XX:+PrintGCDetails -XX:+PrintGCTimestamps -XX:+PrintGCApplicationStopedTime,jvm将会按照这些参数顺序输出gc概要信息,详细信息,gc时间信息,gc造成的应用暂停时间。如果在刚才的参数后面加入参数 -Xloggc:文件路径,gc信息将会输出到指定的文件中。其他参数还有

-verbose:gc和-XX:+PrintTenuringDistribution等。

2:jconsole

jconsole是jdk自带的一个内存分析工具,它提供了图形界面。可以查看到被监控的jvm的内存信息,线程信息,类加载信息,MBean信息。

jconsole位于jdk目录下的bin目录,在windows下是jconsole.exe,在unix和linux下是jconsole.sh,jconsole可以监控本地应用,也可以监控远程应用。 要监控本地应用,执行jconsole pid,pid就是运行的java进程id,如果不带上pid参数,则执行jconsole命令后,会看到一个对话框弹出,上面列出了本地的java进程,可以选择一个进行监控。如果要远程监控,则要在远程服务器的jvm参数里加入一些东西,因为jconsole的远程监控基于jmx的,关于jconsole详细用法,请见专门介绍jconsle的文章,我也会在博客里专门详细介绍jconsole。

3:jviusalvm

在JDK6 update 7之后,jdk推出了另外一个工具:jvisualvm,java可视化虚拟机,它不但提供了jconsole类似的功能,还提供了jvm内存和cpu实时诊断,还有手动dump出jvm内存情况,手动执行gc。

和jconsole一样,运行jviusalvm,在jdk的bin目录下执行jviusalvm,windows下是jviusalvm.exe,linux和unix下是jviusalvm.sh。

4:jmap

jmap是jdk自带的jvm内存分析的工具,位于jdk的bin目录。jdk1.6中jmap命令用法:

Usage:

jmap -histo <pid>

(to connect to running process and print histogram of java object heap

jmap -dump:<dump-options> <pid>

(to connect to running process and dump java heap)

dump-options:

format=b binary default

file=<file> dump heap to <file>

Example: jmap -dump:format=b,file=heap.bin <pid>

jmap -histo <pid>在屏幕上显示出指定pid的jvm内存状况。以我本机为例,执行该命令,屏幕显示:

num #instances #bytes class name

———————————————-

1: 24206 2791864 <constMethodKlass>

2: 22371 2145216 [C

3: 24206 1940648 <methodKlass>

4: 1951 1364496 <constantPoolKlass>

5: 26543 1282560 <symbolKlass>

6: 6377 1081744 [B

7: 1793 909688 <constantPoolCacheKlass>

8: 1471 614624 <instanceKlassKlass>

9: 14581 548336 [Ljava.lang.Object;

10: 3863 513640 [I

11: 20677 496248 java.lang.String

12: 3621 312776 [Ljava.util.HashMap$Entry;

13: 3335 266800 java.lang.reflect.Method

14: 8256 264192 java.io.ObjectStreamClass$WeakClassKey

15: 7066 226112 java.util.TreeMap$Entry

16: 2355 173304 [S

17: 1687 161952 java.lang.Class

18: 2769 150112 [[I

19: 3563 142520 java.util.HashMap

20: 5562 133488 java.util.HashMap$Entry

Total 239019 17140408

为了方便查看,我删掉了一些行。从上面的信息很容易看出,#instance指的是对象数量,香港服务器租用,#bytes指的是这些对象占用的内存大小,class name指的是对象类型。

再看jmap的dump选项,这个选项是将jvm的堆中内存信息输出到一个文件中,在我本机执行

jmap -dump:file=c:dump.txt 340

我没有值得分享的感伤爱情故事,

java内存查看与分析

相关文章:

你感兴趣的文章:

标签云: