Java内存使用情况查看工具


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


一、 jstat 查看  gc 实时执行情况
jstat 命令命令格式:
jstat [Options] vmid [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 情况,结果如下图:


结果说明
标志
说明
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 ] | | <[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= 
使用 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
   导出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 分析工具分析
  下载:
https://www.ibm.com/developerworks/community/groups/service/html/communityview?communityUuid=4544bafe-c7a2-455f-9d43-eb866ea60091

  运行: 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

  


你可能感兴趣的:(JAVA)