转载:https://blog.csdn.net/zdx_csdn/article/details/71214219

jmap -heap pid查看进程堆内存使用情况,包括使用的GC算法、堆配置参数和各代中堆内存使用情况

1、为什么会发生内存泄漏?

如果对象一直被应用,jvm无法对其进行回收,创建新的对象时,无法从Heap中获取足够的内存分配给对象,这时候就会导致内存溢出。

出现内存泄露的地方,一般是不断的往容器中存放对象,而容器没有相应的大小限制或清除机制。

2、内存泄漏的现象:程序中抛出OutOfMemoryError错误。

3、发现内存泄漏的命令

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实时编译的数量等信息。

4、常规步骤

jstat  -gcutil pid 间隔时间(毫秒)重复次数

例:jstat  -gcutil 15469 3000 7

S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT     GCT   
 31.25   0.00  59.34  66.31  97.84  95.21     90    1.267     1    0.548    1.815
 31.25   0.00  59.86  66.31  97.84  95.21     90    1.267     1    0.548    1.815

FGC数量大时,有内存泄漏的问题;

FGCT执行时间长,会导致系统的响应时间较长,若JVM的内存设置较大,那么执行一次FGC的时间可能会更长。

FGC对服务器性能影响:发生FGC时,服务响应时间会增加,网络请求和吞吐量会下降。

所以java内存泄漏对系统性能的影响是不可忽视的。

5、定位内存泄漏

获取JVM的dump文件,分析JVM堆内存内容。

或者 查看堆内存中的对象数目、大小统计直方图,如果带上live则只统计活对象:

jmap -histo:live pid,

例:jmap -histo:live 31385 | more (若分页查看 |more)

num     #instances         #bytes  class name
----------------------------------------------
   1:        123359       17370656  [C
   2:         88363        9741632  [B
   3:          6771        3243432  [I
   4:        120245        2885880  java.lang.String
   5:         89176        2853632  java.util.HashMap$Node
   6:         78316        2506112  org.springframework.boot.loader.util.AsciiBytes
   7:         39154        2192624  org.springframework.boot.loader.jar.JarEntryData
   8:         50740        1623680  java.util.concurrent.ConcurrentHashMap$Node
锁定个数最多的对象,定位问题。

注:术语

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

运维-JVM监控之内存泄漏的更多相关文章

  1. 一次完整的JVM堆外内存泄漏故障排查记录

    前言 记录一次线上JVM堆外内存泄漏问题的排查过程与思路,其中夹带一些JVM内存分配机制以及常用的JVM问题排查指令和工具分享,希望对大家有所帮助. 在整个排查过程中,我也走了不少弯路,但是在文章中我 ...

  2. Google单元测试框架gtest之官方sample笔记4--事件监控之内存泄漏测试

    sample 10 使用event listener监控Water类的创建和销毁.在Water类中,有一个静态变量allocated,创建一次值加一,销毁一次值减一.为了实现这个功能,重载了new和d ...

  3. sql server 运维时CPU,内存,操作系统等信息查询(用sql语句)

    我们只要用到数据库,一般会遇到数据库运维方面的事情,需要我们寻找原因,有很多是关乎处理器(CPU).内存(Memory).磁盘(Disk)以及操作系统的,这时我们就需要查询他们的一些设置和内容,下面讲 ...

  4. 说说JVM原理?内存泄漏与溢出的区别?何时产生内存泄漏?

    1.JVM原理 JVM是Java Virtual Machine(Java虚拟机)的缩写,它是整个java实现跨平台的最核心的部分,所有的Java程序会首先被编译为.class的类文件,这种类文件可以 ...

  5. JVM的堆内存泄漏排查-性能测试

    JVM异常说明 https://testerhome.com/articles/24259 一文中已介绍了,JVM每个运行时区域--程序计数器 .Java虚拟机栈.本地方法栈.Java堆.方法区.直接 ...

  6. JVM 监控以及内存分析

    1 内存分析1.1 jmap -histo 命令pid=`jps | awk '{if ($2 == "Jps") print $1}'`jmap -histo $pid > ...

  7. 立足于运维与监控的前端框架 NoahV

    NoahV是一个致力于解决中后台前端效率问题的前端框架,立足于运维和监控的应用场景,使用当前前端最新的技术栈并结合团队在项目开发中的最佳实践从而推出的前端开发框架. NoahV提供的功能覆盖了从开发到 ...

  8. 线上Linux服务器运维安全策略经验分享

    线上Linux服务器运维安全策略经验分享 https://mp.weixin.qq.com/s?__biz=MjM5NTU2MTQwNA==&mid=402022683&idx=1&a ...

  9. linux运维工程师面试题收集

    面试必考 mysql5和mysql6 有什么区别 mysql-server-5.5:默认引擎改为Innodb,提高了性能和扩展性,提高实用性(中继日志自动恢复) mysql-server-5.6:In ...

随机推荐

  1. JavaSE基础之JDBC

    JavaSE基础之JDBC 1.JDBC 的步骤: ①加载数据库驱动: a.MySQL:com.mysql.jdbc.Driver: b.SQLServer:com.microsoft.jdbc.sq ...

  2. Educational Codeforces Round 46 (Div 2) (A~G)

    目录 Codeforces 1000 A.Codehorses T-shirts B.Light It Up C.Covered Points Count(差分) D.Yet Another Prob ...

  3. 聊聊用CSS3来玩立方体

    声明:本文为原创文章,如需转载,请注明来源WAxes,谢谢! 虽然现在很多浏览器都还不支持css3的3D转换,不过估计也已经有很多人都有玩css3的3D了......所以我这篇也就相当于水一下了,哈哈 ...

  4. C#高级编程9-第9章 字符串和正则表达式

    字符串和正则表达式 String类 String类对象是不可改变的,对于String对象的重新赋值在本质上是重新创建了一个String对象并将新值赋予该对象,其方法ToString对性能的提高并非很显 ...

  5. 匹配<a href="url">content</a>

    grep -Po '<a href="(.*.rmvb")>(.*)</a>' te.txt | sed -n 's/<a href=\(.*\)&g ...

  6. sass compass问题小结

    1.中文注释编译报错Invalid GBK character的问题,找到ruby sass安装目录,如D:\Ruby22-x64\lib\ruby\gems\2.2.0\gems\sass-3.4. ...

  7. CentOS 7提示:ERROR unsupported format character '(0xffffffe7) at/域安装失败,您可以运行下列命令重启您的域:

    别理会,直接装即可,这个错误不影响使用.

  8. HDU 4499 Cannon (搜索)

    Cannon Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others)Total Subm ...

  9. window api 监控

    http://pnig0s1992.blog.51cto.com/393390/704189

  10. 数据库中间件OneProxy and onemysql

    http://blog.itpub.net/28944233/cid-176181-list-1/ http://www.onexsoft.com/ 官网 http://pan.baidu.com/s ...