java经过jvm本身管理内存,同时Java提供了一些命令行工具,用于查看内存使用状况。
这里主要介绍一下jstat、jmap命令以及相关工具。java
jstat [Options] pid [interval] [count]算法
Options,通常使用 -gcutil 或 -gc 查看gc 状况jvm
pid,当前运行的 java进程号
interval,间隔时间,单位为秒或者毫秒
count,打印次数,若是缺省则打印无数次工具
Options 参数以下:spa
-gc:统计 jdk gc时 heap信息,以使用空间字节数表示命令行
-gcutil:统计 gc时, heap状况,以使用空间的百分比表示debug
-class:统计 class loader行为信息code
-compile:统计编译行为信息orm
-gccapacity:统计不一样 generations(新生代,老年代,持久代)的 heap容量状况server
-gccause:统计引发 gc的事件
-gcnew:统计 gc时,新生代的状况
-gcnewcapacity:统计 gc时,新生代 heap容量
-gcold:统计 gc时,老年代的状况
-gcoldcapacity:统计 gc时,老年代 heap容量
-gcpermcapacity:统计 gc时, permanent区 heap容量
$ jstat -gc 12538 5000
每5 秒一次显示进程号为 12538的 java进成的 GC状况,结果以下图:
结果说明
标志 |
说明 |
S0C |
年轻代中第一个survivor区的容量 (字节) |
S1C |
年轻代中第二个survivor区的容量 (字节) |
S0U |
年轻代中第一个survivor区目前已使用空间 (字节) |
S1U |
年轻代中第二个survivor区目前已使用空间 (字节) |
EC |
年轻代中Eden的容量 (字节) |
EU |
年轻代中Eden目前已使用空间 (字节) |
OC |
Old代的容量 (字节) |
OU |
Old代目前已使用空间 (字节) |
PC |
Perm(持久代)的容量 (字节) |
PU |
Perm(持久代)目前已使用空间 (字节) |
YGC |
从应用程序启动到采样时年轻代中gc次数 |
YGCT |
从应用程序启动到采样时年轻代中gc所用时间(s) |
FGC |
从应用程序启动到采样时old代(全gc)gc次数 |
FGCT |
从应用程序启动到采样时old代(全gc)gc所用时间(s) |
GCT |
从应用程序启动到采样时gc用的总时间(s) |
NGCMN |
年轻代(young)中初始化(最小)的大小 (字节) |
NGCMX |
年轻代(young)的最大容量 (字节) |
NGC |
年轻代(young)中当前的容量 (字节) |
OGCMN |
old代中初始化(最小)的大小 (字节) |
OGCMX |
old代的最大容量 (字节) |
OGC |
old代当前新生成的容量 (字节) |
PGCMN |
perm代中初始化(最小)的大小 (字节) |
PGCMX |
perm代的最大容量 (字节) |
PGC |
perm代当前新生成的容量 (字节) |
S0 |
年轻代中第一个survivor区已使用的占当前容量百分比 |
S1 |
年轻代中第二个survivor区已使用的占当前容量百分比 |
E |
年轻代中Eden已使用的占当前容量百分比 |
O |
old代已使用的占当前容量百分比 |
P |
perm代已使用的占当前容量百分比 |
S0CMX |
年轻代中第一个survivor区的最大容量 (字节) |
S1CMX |
年轻代中第二个survivor区的最大容量 (字节) |
ECMX |
年轻代中Eden的最大容量 (字节) |
DSS |
当前须要survivor区的容量 (字节)(Eden区已满) |
TT |
持有次数限制 |
MTT |
最大持有次数限制 |
它是一个基于 rmi的应用,向远程机器提供本机 jvm应用程序的信息。默认端口 1099。
$ jstatd -J-Djava.security.policy=my.policy
jmap 能够从 core文件或进程中得到内存的具体匹配状况,包括 Heap size, Perm size等等。
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
-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中全部生存的对象的状况)。包括对象数量和所占空间大小。