Java通过jvm自己管理内存,同时Java提供了一些命令行工具,用于查看内存使用情况。
这里主要介绍一下jstat、jmap命令以及相关工具。
一、
jstat
查看
gc
实时执行情况
jstat
命令命令格式:
jstat [Options] vmid [interval] [count]
命令参数说明:
Options
,一般使用
-gcutil
或
-gc
查看
gc
情况
pid
,当前运行的
java
进程号
interval ,间隔时间,单位为秒或者毫秒
count ,打印次数,如果缺省则打印无数次
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
情况,结果如下图:
结果说明
标志
|
说明
|
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
|
最大持有次数限制
|
jstatd
启动
jvm
监控服务
它是一个基于
rmi
的应用,向远程机器提供本机
jvm
应用程序的信息。默认端口
1099
。
$ jstatd -J-Djava.security.policy=my.policy
my.policy
文件需要自己建立,是安全策略文件,因为
jdk
对
jvm
做了
jaas
的安全检测,所以我们必须设置一些策略,使
jstatd
被允许作网络操作,内容如下:
grant codebase " file:$JAVA_HOME/lib/tools.jar " {
permission java.security.AllPermission;
};
|
二、
jmap
查看各个代的内存使用
jmap
可以从
core
文件或进程中获得内存的具体匹配情况,包括
Heap size, Perm size
等等。
jmap
命令格式:
jmap [ option ] <pid> | <executable core> | <[server-id@]remote-hostname-or-IP>
1
)参数说明
pid
:
java
进程
id
executable
:产生
core dump
的
java
可执行程序
core
:
core dump
文件
remote-hostname-or-IP
:远程
debug
服务的主机名或
ip
server-id
:远程
debug
服务的
id
2
)
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中所有生存的对象的情况)。
包括对象数量和所占空间大小。
jmap
输出的
class name
结果中:
[C is a char[]
[S is a short[]
[I is a int[]
[B is a byte[]
[[I is a int[][]
heap
输出实例
$ jmap -heap 12264
JVM version is 25.65-b01 using parallel threads in the new generation. using thread-local object allocation. Concurrent Mark-Sweep GC Heap Configuration: MinHeapFreeRatio = 40 MaxHeapFreeRatio = 70 MaxHeapSize = 8388608000 (8000.0MB) NewSize = 2006515712 (1913.5625MB) MaxNewSize = 2006515712 (1913.5625MB) OldSize = 90636288 (86.4375MB) NewRatio = 2 SurvivorRatio = 8 MetaspaceSize = 21807104 (20.796875MB) CompressedClassSpaceSize = 1073741824 (1024.0MB) MaxMetaspaceSize = 17592186044415 MB G1HeapRegionSize = 0 (0.0MB) Heap Usage: New Generation (Eden + 1 Survivor Space): capacity = 1805910016 (1722.25MB) used = 788045040 (751.5383148193359MB) free = 1017864976 (970.7116851806641MB) 43.637004779755316% used Eden Space: capacity = 1605304320 (1530.9375MB) used = 630378472 (601.1757583618164MB) free = 974925848 (929.7617416381836MB) 39.26847166274367% used From Space: capacity = 200605696 (191.3125MB) used = 157666568 (150.36255645751953MB) free = 42939128 (40.94994354248047MB) 78.59525982751757% used To Space: capacity = 200605696 (191.3125MB) used = 0 (0.0MB) free = 200605696 (191.3125MB) 0.0% used concurrent mark-sweep generation: capacity = 6382092288 (6086.4375MB) used = 4612472232 (4398.79630279541MB) free = 1769620056 (1687.6411972045898MB) 72.27210174745753% used 18841 interned Strings occupying 1633048 bytes. |
jmap
相关工具
jmap dump
生成的
heap dump
文件,可以使用
IBM HeapAnalyzer
分析工具分析
下载:
运行:
java –Xmx800m –jar ha456.jar
三、
jstack
和
jinfo
分析
java core
文件
jstack
工具可以用来获得
core
文件的
java stack
和
native stack
的信息,从而可以知道
java
程序是如何崩溃和在程序何处发生问题。
另外,
jstack
工具还可以附属到正在运行的
java
程序中,看到
java
程序的
java stack
和
native stack
的信息,如果现在运行的
java
程序呈现
hung
的状态,
jstack
是非常有用的。
命令格式:
$ jstack pid
jinfo
可以从
core
文件里面知道崩溃的
Java
应用程序的配置信息。
命令额格式:
$ jinfo pid