Linux进程内存统计(3)

VSZ是指已分配的线性空间大小,这个大小通常并不等于程序实际用到的内存大小,产生这个的可能性很多,比如内存映射,共享的动态库,或者向系统申请了更多的堆,都会扩展线性空间大小,要查看一个进程有哪些内存映射,可以使用 pmap 命令来查看:
pmap -x [pid]

[root@server ~]$ pmap -x 837
837:  java
Address          Kbytes    RSS  Dirty Mode  Mapping
0000000040000000      36      4      0 r-x--  java
0000000040108000      8      8      8 rwx--  java
00000000418c9000  13676  13676  13676 rwx--    [ anon ]
00000006fae00000  83968  83968  83968 rwx--    [ anon ]
0000000700000000  527168  451636  451636 rwx--    [ anon ]
00000007202d0000  127040      0      0 -----    [ anon ]
...
...
00007f55ee124000      4      4      0 r-xs-  az.png
00007fff017ff000      4      4      0 r-x--    [ anon ]
ffffffffff600000      4      0      0 r-x--    [ anon ]
----------------  ------  ------  ------
total kB        7796020 3037264 3023928

这里可以看到很多anon,这些表示这块内存是由mmap分配的。

RSZ是Resident Set Size,常驻内存大小,即进程实际占用的物理内存大小, 在现在这个例子当中,RSZ和实际堆内存占用差了2.3G,这2.3G的内存组成分别为:

查看 JVM 堆各个分区的内存情况

jstat -gcutil [pid]

[root@server ~]$ jstat -gcutil 837 1000 20
 S0    S1    E      O      P    YGC    YGCT    FGC    FGCT    GCT 
 0.00  80.43  24.62  87.44  98.29  7101  119.652    40  19.719  139.371
 0.00  80.43  33.14  87.44  98.29  7101  119.652    40  19.719  139.371

分析 JVM 堆内存中的对象

查看存活的对象统计

jmap -histo:live [pid]

dump 内存

jmap -dump:format=b,file=heapDump [pid]

然后用jhat命令可以参看

jhat -port 5000 heapDump
在浏览器中访问::5000/ 查看详细信息

Linux公社的RSS地址:https://www.linuxidc.com/rssFeed.aspx

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/12632.html