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

-heap:打印jvm heap的情况

-histo:打印jvm heap的直方图。其输出信息包括类名,对象数量,对象占用大小。

-histo: live :同上,但是只答应存活对象的情况

-permstat:打印permanent generation heap情况

1. jmap -heap pid

查看java 堆(heap)使用情况

using thread-local object allocation.

Parallel GC with 4 thread(s) //GC 方式 Heap Configuration: //堆内存初始化配置

MinHeapFreeRatio=40 //对应jvm启动参数-XX:MinHeapFreeRatio设置JVM堆最小空闲比率(default 40)

MaxHeapFreeRatio=70 //对应jvm启动参数 -XX:MaxHeapFreeRatio设置JVM堆最大空闲比率(default 70)

MaxHeapSize=512.0MB //对应jvm启动参数-XX:MaxHeapSize=设置JVM堆的最大大小

NewSize = 1.0MB //对应jvm启动参数-XX:NewSize=设置JVM堆的‘新生代’的默认大小

MaxNewSize =4095MB //对应jvm启动参数-XX:MaxNewSize=设置JVM堆的‘新生代’的最大大小

OldSize = 4.0MB //对应jvm启动参数-XX:OldSize=<value>:设置JVM堆的‘老生代’的大小

NewRatio = 8 //对应jvm启动参数-XX:NewRatio=:‘新生代’和‘老生代’的大小比率

SurvivorRatio = 8 //对应jvm启动参数-XX:SurvivorRatio=设置年轻代中Eden区与Survivor区的大小比值

PermSize= 16.0MB //对应jvm启动参数-XX:PermSize=<value>:设置JVM堆的‘永生代’的初始大小

MaxPermSize=64.0MB //对应jvm启动参数-XX:MaxPermSize=<value>:设置JVM堆的‘永生代’的最大大小


Heap Usage: //堆内存分步

PS Young Generation

Eden Space: //Eden区内存分布

capacity = 20381696 (19.4375MB) //Eden区总容量

used = 20370032 (19.426376342773438MB) //Eden区已使用

free = 11664 (0.0111236572265625MB) //Eden区剩余容量

99.94277218147106% used //Eden区使用比率

From Space: //其中一个Survivor区的内存分布

capacity = 8519680 (8.125MB)

used = 32768 (0.03125MB)

free = 8486912 (8.09375MB)

0.38461538461538464% used

To Space: //另一个Survivor区的内存分布

capacity = 9306112 (8.875MB)

used = 0 (0.0MB)

free = 9306112 (8.875MB)

0.0% used

PS Old Generation //当前的Old区内存分布

capacity = 366280704 (349.3125MB)

used = 322179848 (307.25464630126953MB)

free = 44100856 (42.05785369873047MB)

87.95982001825573% used

PS Perm Generation //当前的 “永生代” 内存分布

capacity = 32243712 (30.75MB)

used = 28918584 (27.57891082763672MB)

free = 3325128 (3.1710891723632812MB)

89.68751488662348% used


2. jmap -histo pid


查看堆内存(histogram)中的对象数量,大小


num #instances #bytes class name


序号 实例个数 字节数 类名

----------------------------------------------

1: 3174877 107858256 [C

2: 3171499 76115976 java.lang.String

3: 1397884 38122240 [B

4: 214690 37785440 com.tongli.book.form.Book

5: 107345 18892720 com.tongli.book.form.Book

6: 65645 13953440 [Ljava.lang.Object;

7: 59627 7648416 <constMethodKlass>

8: 291852 7004448 java.util.HashMap$Entry

9: 107349 6871176 [[B


..........


total 9150732 353969416

class name对应的就是Class文件里的class的标识

B代表byte

C代表char

D代表double

F代表float

I代表int

J代表long

Z代表boolean

前边 有[ 代表数组,[I 就相当于int[]

对象 用[L+类名表示

=======================================================================

jstack(linux下特有)

可以观察到jvm中当前所有线程的运行情况和线程当前状态

常用:jstack PID (查看deadlock的情况)

=======================================================================

jstat(jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]])

通常我们会在在下面命令后面加上 [<interval> [<count>]] 参数 例如jstat -gcutil 12849 1000 10 表示1000ms期间输出10次gc统计信息

java知识学习笔记---jmap,jstack,jstat_java知识

1. jstat -gc pid

可以显示gc的信息,查看gc的次数,及时间。

其中最后五项,分别是young gc的次数,young gc的时间,full gc的次数,full gc的时间,gc的总时间。

2.jstat -gccapacity pid

可以显示,VM内存中三代(young,old,perm)对象的使用和占用大小,

如:PGCMN显示的是最小perm的内存使用量,PGCMX显示的是perm的内存最大使用量,

PGC是当前新生成的perm内存占用量,PC是但前perm内存占用量。

其他的可以根据这个类推, OC是old内纯的占用量

3.jstat -gcutil pid(较常使用)

统计gc信息统计。

4.jstat -gcnew pid

年轻代对象的信息。

5.jstat -gcnewcapacity pid

年轻代对象的信息及其占用量。

6.jstat -gcold pid

old代对象的信息。

7.stat -gcoldcapacity pid

old代对象的信息及其占用量。

8.jstat -gcpermcapacity pid

perm对象的信息及其占用量。

9.jstat -class pid

显示加载class的数量,及所占空间等信息。
10.jstat -compiler pid

显示VM实时编译的数量等信息。

11.stat -printcompilation pid

当前VM执行的信息。

一些术语的中文解释:

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 : 最大持有次数限制