当前位置: 首页 > news >正文

java内存占用异常问题常见排查流程(含堆外内存异常)

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

先初步介绍一下内存组成:

java进程占用内存 约等于 Java永久代 + Java堆(新生代和老年代) + 线程栈+ Java NIO,其它部分占用内存较小,

详细可以参考这篇文章  https://my.oschina.net/haitaohu/blog/1830582

第一步:获取异常进程pid

通过ps 或者 jps获取 pid

f13fdac9418faf363c9d5826a7856107cb6.jpg

第二步:基本内存分配查询 jmap -heap pid

58559179f04cbffe5d225d24dd5d4686421.jpg

注意:着重看一下永久区和 老年区 是否够用,因为前面的都是中转区域,这两个是最终落地区域和gc相关

第三步:分析gc是否正常执行

jstat -gccause pid 2000  //每两秒执行一下

88e5d10740c3feaf941ab874708ab80b267.jpg

S0 — Heap上的 Survivor space 0 区已使用空间的百分比    
S1 — Heap上的 Survivor space 1 区已使用空间的百分比     
E  — Heap上的 Eden space 区已使用空间的百分比     
O   — Heap上的 Old space 区已使用空间的百分比     
P   — Perm space 区已使用空间的百分比 
YGC — 从应用程序启动到采样时发生 Young GC 的次数 
YGCT– 从应用程序启动到采样时 Young GC 所用的时间(单位秒)     
FGC — 从应用程序启动到采样时发生 Full GC 的次数 
FGCT– 从应用程序启动到采样时 Full GC 所用的时间(单位秒)     
GCT — 从应用程序启动到采样时用于垃圾回收的总时间(单位秒) 
LGCC - 进行GC的原因(低版本jdk可能没有这一列)

从这里观察gc是否异常,也可以根据这个进行jvm内存分配调优,来提高性能降低gc对性能的损耗

如果上面流程还是观察不出内存异常的问题,可能就属于堆外内存问题了,一般出现在io相关操作、 redis、数据库的连接等

最明显的特征:java进程占用内存超过你设置的jvm内存最大值

第四步: pmap -x pid 如果需要排序  | sort -n -k3

c101647ab0f5a1c3a95bdfcdd74b33133ad.jpg

主要观察第一列Address和第三列Rss,看哪些内存占用较大,可以在第五步确认

第五部:开启Native Memory Tracker (NMT)进行排查

在启动参数上加入-XX:NativeMemoryTracking=detail ,重启java(tomcat)等

启动后,通过命令 jcmd 30796 VM.native_memory detail scale=MB >temp.txt 查看内存分配情况

05de2c5fc13f0526add5b8fca703823f061.jpg

然后根据上图看哪部分占用内存较高、结合第四步中占用内存高的部分进行搜索查看明细,就在这个文档的明细部分

f3aff3cf5386dd23d053ca0bc53647c0454.jpg

第六步:使用 perf record -g -p 55 开启监控栈函数调用。运行一段时间后Ctrl+C结束,会生成一个文件perf.data

执行perf report -i perf.data查看报告

80829bc2462cd7dfd3a5ae00141422de38d.jpg

如果这里还不能定位分析初问题,可以借助下一步

第七步:对外内存排查工具google-perftools ,安装可以参考 https://my.oschina.net/haitaohu/blog/3024095

注意:多个文件同时分析

gperftools-2.5/bin/pprof --text /data/jdk1.7.0_65/bin/java /data/java/deploy/google-perftools/local/gzip/gzip.*.heap > tmp.txt1
aa6f91665bd5325defb576d9be46671a5d6.jpg

Analyzing Text Output

Text mode has lines of output that look like this:

       14   2.1%  17.2%       58   8.7% std::_Rb_tree::find  
Here is how to interpret the columns:

1.Number of profiling samples in this function
2.Percentage of profiling samples in this function
3.Percentage of profiling samples in the functions printed so far
4.Number of profiling samples in this function and its callees
5.Percentage of profiling samples in this function and its callees
6.Function name
第一列代表这个函数调用本身直接使用了多少内存,第二列表示第一列的百分比,第三列是从第一行到当前行的所有第二列之和,第四列表示这个函数调用自己直接使用加上所有子调用使用的内存总和,第五列是第四列的百分比

如果文本分析不够明显,也可以导出pdf文件

yum -y install ghostscript
yum -y install graphviz 
gperftools-2.5/bin/pprof --pdf /data/jdk1.7.0_65/bin/java /data/java/deploy/google-perftools/local/gzip/gzip.*.heap > tmp.pdf

cebbe0ae322feee04324f9206c643481669.jpg

这样就很明显的看到异常点了,无上级节点,通过Unsafe分配使用堆外内存

最终定位的问题为:direct buffer 通过 unsafe分配直接内存导致,这时候堆内存一直没有达到fullgc的条件,同时direct buffer没有设置上限导致的, 通过-XX:MaxDirectMemorySize=1024m 设置一下最大值

第八步:jstack -m -l pid  (这一步可以提前,如果能发现某些异常线程信息)当然也有很多界面工具查看更清晰一些,我这里用的Jprofiler

从这几步一般能看出问题来了,这是一次排查后的总结,有些步骤可能是多余的,但基本这些就能定位分析初问题所在了,后续会持续补充,有错误欢迎指出或者提供更好的办法,感谢

转载于:https://my.oschina.net/haitaohu/blog/3024843

相关文章:

  • Java springcloud B2B2C o2o多用户商城 springcloud架构(八)springboot整合mongodb
  • 扩展资源服务器解决oauth2 性能瓶颈
  • 云端服务器与传统的独立主机服务器有什么区别
  • 中台之上(十三):探讨支持组装式开发的业务架构设计方法
  • 阿里CTO:阿里所有技术和产品输出都将必须通过阿里云进行
  • python -迭代器与生成器 以及 iterable(可迭代对象)、yield语句
  • LeetCode.914 卡牌分组
  • 本周学习小结(25/03 - 31/03)
  • Beetl 提供俩种方式来显示实现局部更新
  • core_framework —— 基于libev的轻量级lua网络开发框架
  • MyCAT水平分库
  • 织梦CMS模板中dede标签使用php和if判断语句的方法
  • 2019第十四届中国竞争情报国际年会将于4月在上海召开
  • 移动互联网下半场,iOS开发者如何“高薪”成长?
  • 判断是手机端还是PC端的代码
  • -------------------- 第二讲-------- 第一节------在此给出链表的基本操作
  • [case10]使用RSQL实现端到端的动态查询
  • Apache Pulsar 2.1 重磅发布
  • axios请求、和返回数据拦截,统一请求报错提示_012
  • CentOS6 编译安装 redis-3.2.3
  • CoolViewPager:即刻刷新,自定义边缘效果颜色,双向自动循环,内置垂直切换效果,想要的都在这里...
  • HTTP--网络协议分层,http历史(二)
  • JavaScript服务器推送技术之 WebSocket
  • Java程序员幽默爆笑锦集
  • jQuery(一)
  • nodejs调试方法
  • node学习系列之简单文件上传
  • OSS Web直传 (文件图片)
  • python docx文档转html页面
  • ReactNativeweexDeviceOne对比
  • seaborn 安装成功 + ImportError: DLL load failed: 找不到指定的模块 问题解决
  • Spring声明式事务管理之一:五大属性分析
  • 半理解系列--Promise的进化史
  • 今年的LC3大会没了?
  • 面试题:给你个id,去拿到name,多叉树遍历
  • 前端之React实战:创建跨平台的项目架构
  • 入职第二天:使用koa搭建node server是种怎样的体验
  • 深入浅出Node.js
  • 详解移动APP与web APP的区别
  • # 数论-逆元
  • #Js篇:单线程模式同步任务异步任务任务队列事件循环setTimeout() setInterval()
  • (1)STL算法之遍历容器
  • (42)STM32——LCD显示屏实验笔记
  • (C语言)二分查找 超详细
  • (动态规划)5. 最长回文子串 java解决
  • (附源码)springboot太原学院贫困生申请管理系统 毕业设计 101517
  • (含react-draggable库以及相关BUG如何解决)固定在左上方某盒子内(如按钮)添加可拖动功能,使用react hook语法实现
  • (论文阅读22/100)Learning a Deep Compact Image Representation for Visual Tracking
  • (十三)Maven插件解析运行机制
  • (转)Sublime Text3配置Lua运行环境
  • *_zh_CN.properties 国际化资源文件 struts 防乱码等
  • .libPaths()设置包加载目录
  • .MSSQLSERVER 导入导出 命令集--堪称经典,值得借鉴!
  • .NET Framework与.NET Framework SDK有什么不同?
  • [acwing周赛复盘] 第 69 场周赛20220917