java通过jvm自己管理内存,同时Java提供了一些命令行工具,用于查看内存使用情况。
这里主要介绍一下jstat、jmap命令以及相关工具。

一、jstat查看 gc实时执行情况

jstat命令命令格式:

jstat [Options] pid [interval] [count]

命令参数说明:

Options,一般使用 -gcutil 或  -gc 查看gc 情况

pid,当前运行的 java进程号 
interval,间隔时间,单位为秒或者毫秒 
count,打印次数,如果缺省则打印无数次

Options 参数如下:

-gc:统计 jdk gc时 heap信息,以使用空间字节数表示

-gcutil:统计 gc时, heap情况,以使用空间的百分比表示

-class:统计 class loader行为信息

-compile:统计编译行为信息

-gccapacity:统计不同 generations(新生代,老年代,持久代)的 heap容量情况

-gccause:统计引起 gc的事件

-gcnew:统计 gc时,新生代的情况

-gcnewcapacity:统计 gc时,新生代 heap容量

-gcold:统计 gc时,老年代的情况

-gcoldcapacity:统计 gc时,老年代 heap容量

-gcpermcapacity:统计 gc时, permanent区 heap容量

示例 

  $ jstat -gc 12538 5000

每5 秒一次显示进程号为 12538的 java进成的 GC情况,结果如下图:

jvm gc情况查看-LMLPHP

结果说明

jstatd 启动jvm 监控服务

它是一个基于 rmi的应用,向远程机器提供本机 jvm应用程序的信息。默认端口 1099。

  $ jstatd -J-Djava.security.policy=my.policy

二、jmap查看各个代的内存使用

jmap 可以从 core文件或进程中获得内存的具体匹配情况,包括 Heap size, Perm size等等。

jmap命令格式:

     jmap [ option ] <pid> | <executable core> | <[server-id@]remote-hostname-or-IP>

参数说明  

pid:java进程 id

executable:产生 core dump的 java可执行程序

core:core dump文件

remote-hostname-or-IP:远程 debug服务的主机名或 ip

server-id:远程 debug服务的 id 

option参数

-heap 

打印heap的概要信息,GC 使用的算法,heap的配置及使用情况 .

-histo[:live] 

打印jvm heap 的直方图。输出类名、每个类的实例数目、对象占用大小。 VM的内部类名字开头会加上前缀 ”*”. 

如果加上live 则只统计活的对象数量。

-dump:[live,]format=b,file=<filename> 

使用hprof二进制形式,导出heap 内容到文件filename。

假如指定live 选项,那么只输出活的对象到文件 . 

-finalizerinfo 

打印正等候回收的对象的信息 .

-permstat 

打印classload 和jvm heap 持久代的信息。

包含每个classloader 的名字、是否存活、地址、父 classloade、加载的 class数量、内部 String的数量和占用内存数。

-F

当pid没有响应的时候,与-dump或者 -histo共同使用,强制生成 dump文件或 histo信息 . 在这个模式下 ,live子参数无效 . 

-J

传递参数给启动jmap 的jvm.

64位机上使用需要使用如下方式: jmap -J-d64 -heap pid

使用  jmap -heap pid ,可以查看各个代的内存使用情况。 

$ jmap -heap 2083

可以观察到New Generation(Eden Space,From Space,To Space),tenured generation,Perm Generation的内存使用情况

 jmap -dump:format=b,file=heapdump.hprof <pid>

导出heap dump到文件heapdump.hprof

jmap -histo 2083 | jmap -histo:live 2083

可以观察heap中所有对象的情况(heap中所有生存的对象的情况)。包括对象数量和所占空间大小。

06-04 18:29