最近发现服务器内存使用持续增长且增长速率大,怀疑是内存泄露导致的。
最终定位到是因为程序中存在线程池频繁创建但未销毁问题导致线程泄露,进而影响内存使用增长。
Tips:本文不记录排错过程,只记录可疑点及排错命令。

1. 套路

① 查看内存使用,对相隔一段时间的应用内存使用情况进行对比(top命令等),确认内存存在缓慢上升的情况
② jstat -gccapacity 【pid】查看JVM各部分内存使用增长是否符合top命令展示的应用内存使用增长。

  • 如果符合,则使用MAT工具分析JVM堆栈情况,对比隔一段时间的堆栈对象增长情况,对于增加的对象进行内存泄露排查。

  • 如不符合,这说明内存使用很大概率不是JVM堆栈导致的,可能程序中使用了堆外内存,堆外内存持续增长的这种情况不容易排查,最好开启JVM的NMA功能,使用jcmd命令对堆外内存进行分析。

2. 常见堆外泄露

  • JNI
  • gzip
  • 线程栈
  • 不良代码
  • ThreadLocal
  • NIO directbuffer泄漏

3. Linux内存相关概念

  • used区:应用实际占用内存,在+/-buffer计算方式下,used区=实际已用内存。而在Mem计算方式下,used=实际已有+Buffer+Cache (原因是Buffer和Cache在应用需要时会释放出应用所需大小供应用使用,但是不会全部释放)

  • free区:剩余空闲内存大小,未被应用used或被系统用于缓存(Cache/Buffer)的内存部分。

  • Cached区:这里的cache指Linux内存中的:Page cache。Page cache主要用来作为文件系统上的文件数据的缓存来用,尤其是针对当进程对文件有read/write操作的时候。如果你仔细想想的话,作为可以映射文件到内存的系统调用:mmap是不是很自然的也应该用到page cache?在当前的系统实现里,page cache也被作为其它文件类型的缓存设备来用,所以事实上page cache也负责了大部分的块设备文件的缓存工作。

  • Buffer区:Buffer cache则主要是设计用来在系统对块设备进行读写的时候,对块进行数据缓存的系统来使用。这意味着某些对块的操作会使用buffer cache进行缓存,比如我们在格式化文件系统的时候。
    一般情况下两个缓存系统是一起配合使用的,比如当我们对一个文件进行写操作的时候,page cache的内容会被改变,而buffer cache则可以用来将page标记为不同的缓冲区,并记录是哪一个缓冲区被修改了。这样,内核在后续执行脏数据的回写(writeback)时,就不用将整个page写回,而只需要写回修改的部分即可。

  • total:内存总量

4. Linux查看内存相关命令

① free / free -m / free -g
相关参数说明

② cat /proc/meminfo

③ jstat -gccapacity 【pid】 —— 查看堆内存使用情况,包括元空间,老年代,年轻代

- NGCMN:新生代最小容量
- NGCMX:新生代最大容量
- NGC:当前新生代容量
- S0C:第一个幸存区大小
- S1C:第二个幸存区的大小
- EC:伊甸园区的大小
- OGCMN:老年代最小容量
- OGCMX:老年代最大容量
- OGC:当前老年代大小
- OC:当前老年代大小
- MCMN:最小元数据容量
- MCMX:最大元数据容量
- MC:当前元数据空间大小
- CCSMN:最小压缩类空间大小
- CCSMX:最大压缩类空间大小
- CCSC:当前压缩类空间大小
- YGC:年轻代gc次数
- FGC:老年代GC次数

④ top / top 【pid】/ top -Hp【pid】

⑤ ps -aux | grep 【pid】

⑥ jmap命令
jmap -heap 【pid】 —— 查看JVM呈现堆栈使用
jmap -histo 【pid】—— 查看堆中对象数量和大小
jmap -dump:format=b,file=heapdump pid:将内存使用的详细情况输出到文件

⑦ jcmd 【pid】 GC.heap_dump 【输出路径】 —— 查看GC堆栈,同jmap -dump | jcmd [pid] VM.native_memory

⑧ watch -n 1 ps v 【pid】—— 动态查看进程内存使用,每秒刷新

⑨ strace -f -e"brk,mmap,munmap" -p 【pid】 追踪进程内存使用

⑩ pmap -x [pid] 与 diff pmap文件1 pmap文件2 -y -w

资料:
https://elasticsearch.cn/article/178
https://my.oschina.net/alchemystar/blog/1603817
https://www.cnblogs.com/xiaohanlin/p/12888396.html
https://blog.csdn.net/hellozhxy/article/details/95203462

Java —— 内存泄露排查相关推荐

  1. java 内存泄露 书籍_[Java教程]一次艰难的内存泄露排查,BeanUtils 的锅

    [Java教程]一次艰难的内存泄露排查,BeanUtils 的锅 0 2020-10-29 18:24:42 现象 通过jstat -gcutil pid 5000 ,发现fgc次数很多而且频繁,此时 ...

  2. 如何排查Java内存泄露(内附各种排查工具介绍)

    今天刚刚才加一个故障review会议, 故障非常典型, google下也可以找到相似案例介绍. 在排查问题的过程中,使用了大量的工具, 发现有问题的地方还不只一个,总结一下. (本篇文章不会重点描述案 ...

  3. 一次恐怖的 Java 内存泄漏排查实战

    转载自  一次恐怖的 Java 内存泄漏排查实战 最近在看<深入理解Java虚拟机:JVM高级特性与最佳实践>(第二版)这本书,理论+实践结合,深入浅出,强烈推荐给大家. 这两天对JVM内 ...

  4. Netty堆外内存泄露排查与总结

    导读 Netty 是一个异步事件驱动的网络通信层框架,用于快速开发高可用高性能的服务端网络框架与客户端程序,它极大地简化了 TCP 和 UDP 套接字服务器等网络编程. Netty 底层基于 JDK ...

  5. java内存泄露分析方案

    java内存泄露分析方案 - 准备工作 1.工具:Memory Analyzer Tool (mat); 1)安装Memory Analyzer Tool (mat) 2.原料:dump.hprof ...

  6. Java内存泄露的理解与解决

    Java内存管理机制 在C++语言中,如果需要动态分配一块内存,程序员需要负责这块内存的整个生命周期.从申请分配.到使用.再到最后的释放.这样的过程非常灵活,但是却十分繁琐,程序员很容易由于疏忽而忘记 ...

  7. java线程泄露_面试官:小伙子先来说一下可能引起Java内存泄露的场景吧

    原标题:面试官:小伙子先来说一下可能引起Java内存泄露的场景吧 本文分析一下可能引起java内存泄露的场景: 通过 finalize 方法 终结器finalizers的使用是潜在内存泄漏问题的另一个 ...

  8. Java内存泄露和内存溢出、JVM命令行工具、.JDK可视化工具、Java Class文件

    1.Java内存泄露和内存溢出对比 1.1 Java 内存泄露 内存泄露是指一个不再被程序使用的对象或变量还在内存中占用空间. 1.1.1判断内存空间是否符合垃圾回收的标准 在Java语言中,判断一个 ...

  9. java内存泄露有什么后果,Java内存泄露问题是什么?

    很多人在谈论内存泄露问题,当然对于c/c++来说,这个应该是老掉牙的问题,但是很多Java人员也越来越多得讨论这个问题,我这里写个小结,希望对大家有一定的参考价值. 内存泄漏的慨念 1.c/c++是程 ...

最新文章

  1. java 二维数组奇数金字塔_二维数组:奇数阶魔方 | 新思维:C语言程序设计
  2. 逻辑人渴望控制那些让他们感兴趣的东西
  3. 【C语言】数组名作函数参数,完成数据的升序排列
  4. python 内置模块random_Python3.5内置模块之random模块用法实例分析
  5. c语言题库及详解答案 免费下载,C语言最新完整版本题库(带详解答案).pdf
  6. 人脸识别示例代码解析(二)——人脸识别解析
  7. OpenGL第三方库:glad初始了解与下载
  8. sqlserver 企业版下载地址
  9. python 自动玩 连连看 外挂
  10. 修改windows软件图标
  11. 使用scrapy刷博客访问量(傻瓜式)
  12. [论文阅读] Meta-Weight-Net: Learning an Explicit Mapping For Sample Weighting
  13. RAR解压、压缩命令
  14. 应用服务器和数据库服务器有什么区别?
  15. 对于seo优化与sem竞价有什么不同的地方?哪个更适合?
  16. 2022年百华鞋业祝您新年快乐,虎年大吉
  17. 最全MacWin软件分享
  18. 如何在vue项目中引入video.js插件
  19. 模拟DVD 实现录入 查看 借出 归还 删除 新增 等功能分层
  20. android 无线调试_Android 11的无线调试

热门文章

  1. 直播 | 企业级应用Service Management Automation X(SMAX)的微服务之路
  2. Spring : JdbcTemplate操作数据库(详细)
  3. RedHat7使用yum源安装依赖包
  4. 编程就是python吗_编程python是什么
  5. 基于javaweb的仿天猫商城系统开发与设计.rar(论文+任务书+项目源码)
  6. 每个初学JAVA者都应该搞懂的问题
  7. The Places of Our Lives: Visiting Patterns and Automatic Labeling from Longitudinal Smartphone Data
  8. Python中计算圆的周长,面积
  9. 记一次艰难的SQL注入(过安全狗)
  10. 天龙八部手游服务器维护公告,【已完成】安卓版本更新维护公告