Linux下分析Java程序内存(pmap、jmap、jstat)

 

1、pmap查看进程内存

运行命令

使用pmap可以查看某一个进程(非java的也可以)的内存使用使用情况,

命令格式:

pmap 进程id
  • 1

示例说明

pmap 12358
  • 1

第一列,内存块起始地址 
第二列,占用内存大小 
第三列,内存权限 
第四列,内存名称,anon表示动态分配的内存,stack表示栈内存 
最后一行,占用内存总大小,请注意,此处为虚拟内存大小,占用的物理内存大小可以通过top查看

这里写图片描述

2、jmap查看Java进程对象使用情况

运行命令

使用jmap可以查看某个Java进程中每个对象有多少个实例,占用多少内存, 
命令格式:

jmap -histo 进程id
  • 1

示例说明

jmap -histo  12538
  • 1

第一列,序号,无实际意义 
第二列,对象实例数量 
第三列,对象实例占用总内存数,单位:字节 
第四列,对象实例名称 
最后一行,总实例数量与总内存占用数

这里写图片描述

这里写图片描述

jmap -heap 1024 > jmap-heap-1024.bin
  • 1

这里写图片描述

3、jstat命令查看jvm的GC情况

jstat命令格式:

jstat [Options] vmid [interval] [count]
  • 1

参数说明:

Options,选项,我们一般使用 -gcutil 查看gc情况 
vmid,VM的进程号,即当前运行的java进程号 
interval,间隔时间,单位为秒或者毫秒 
count,打印次数,如果缺省则打印无数次

示例说明

jstat -gc 1024 5000
  • 1

即会每5秒一次显示进程号为1024的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 : 最大持有次数限制

Java 堆分为新生代和老年代,新生代一般划分为三块区域,Eden + From Survivor + To Survivor,Eden 和 Survivor 的内存比为8:1,每次只使用一个Eden 和一个 Survivor 区域,另一个 Survivor 用于复制收集算法回收内存。

对象一般尽量分配到新生代中,而对于大对象(长字符串和大数组)直接分配在老年代中,同时“年龄”长的的对象会从新生代自动晋升到老年代中。

Java 方法区称为永久代,只有 HotSpot 虚拟机才存在永久代。

当 Eden 区域分配不足时,自动发生一次 Minor GC。

当发生 Minor GC 时,虚拟机会自动检测(比较)新生代晋升到老年代的对象内存大小和老年代剩余内存大小,如果晋升>剩余,则发生一次Full GC;如果晋升<剩余,则去检测老年代的内存担保 HandlePromotionFailure 是否允许担保失败,如果不允许担保失败,则发生一次Full GC,如果允许失败,则进行一次Minor GC。

打印堆栈信息

jmap -dump:format=b,file=/filepath/heap.bin pid


jstack  pid 

猜你喜欢

转载自blog.csdn.net/qq_34730511/article/details/80647046
今日推荐