点击上方蓝色“方志朋”,选择“设为星标”

回复“666”获取独家整理的学习资料!

来源:blog.csdn.net/prestigeding/article/details/89075661

  • 分析思路:

    • 如何快速恢复业务

    • 分析解决问题

    • 收集内存溢出Dump文件

    • 分析Dump文件


如果我们所在公司的业务量比较大,在生产环境经常会出现JVM内存溢出的现象,那我们该如何快速响应,快速定位,快速恢复问题呢?

本文将通过一个线上环境JVM内存溢出的案例向大家介绍一下处理思路与分析方法。

案例:架构组接到某项目组反馈,Zabbix监控上显示JMX不可用,请求协助处理。

分析思路:

  • JMX不可用,往往是由于垃圾回收时间停顿时间过长、内存溢出等问题引起的。

  • 线上故障分析的原则是首先要采取措施快速恢复故障对业务的影响,然后才是采集信息、分析定位问题,并最终给出解决办法。

具体分析过程如下。

如何快速恢复业务

通常线上的故障会对业务造成重大影响,影响用户体验,故如果线上服务器出现故障,应规避对业务造成影响,但不能简单的重启服务器,因为需要尽可能保留现场,为后续的问题分析打下基础。

那我们如何快速规避对业务的影响,并能保留现场呢?

通常的做法是隔离故障服务器。

通常线上服务器是集群部署,一个好的分布式负载方案会自动剔除故障的机器,从而实现高可用架构,但如果未被剔除,则需要运维人员将故障服务器进行剔除,保留现场进行分析。

发生内存泄露,通常情况下是由于代码的原因造成的,一般无法立即对代码进行修复,很容易会发送连锁反应造成应用服务器一台一台接连宕机,故障面积会慢慢扩大,针对此种情况,应快速定位发生内存泄露的原因,将该服务进行降级,避免对其他服务造成影响。最简单的降级方法是根据F5(Nginx)转发策略,对该功能定向到一个单独的集群,与其他流量进行隔离,确保其他业务不受牵连,给故障排查、解决提供宝贵的缓冲时间。

分析解决问题

首先可以通过查看日志,确定是哪种内存溢出,堆内存溢出可发生的地方:Java heap space(堆空间)、perm space(持久代)。

收集内存溢出Dump文件

收集Dump文件有两种方式:

  • 设置JVM启动参数 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/opt/jvmdump

在每次发生内存溢出时,JVM会自动将堆转储,dump文件存放在-XX:HeapDumpPath指定的路径下。

  • 使用jmap命令收集 通过jmap -dump:live,format=b,file=/opt/jvm/dump.hprof pid。

分析Dump文件

在获取Dump文件后,可以使用工具MAT(MemoryAnalyzer)进行分析,该工具大家可以通过百度自行下载。

使用MAT打开Dump文件后,首页截图如下:

工具按钮介绍:

:直方图视图,将堆中所有的内存消耗情况统计出来,其如图所示:

:内存使用树状结构,以线程为维度,树状形式展开,如图所示:

线程栈,其截图如下:

根据该图,可以明确,堆的总大小为1.9G,被4个线程全部占据,导致其他线程无法再申请资源,抛出堆内存溢出错误。

接下来,我通常的做法是直接去看这个视图(以线程为基本维度,查找线程中占用内存的对象),为后续定位排查提供必要的依据。

从上面的截图中可以得出如下关键信息点:

  • org.apache.ibatis.executor.result.DefaultResultHandler内部持有一个List,其原始为java.util.HashMap,从这个类基本可以看出是与数据库的查询相关,对数据库返回结果的解码并组织成HashMap。

  • 这个List中的元素总共有146033个,初步可以判断出是在一次查询中从数据库中一次查询出了太多数据,造成了内存溢出。

由于SQL查询代码中,是用HashMap来接收数据库中的返回字段,无法一时间看出是那个查询,那我们能不能精确找到是哪一个查询,哪一行代码,甚至与哪一条SQL语句呢?

答案是可以的,我们可以从视图一探究竟。

温馨提示:

视图使用技巧:展开技巧:沿着使用率最高的项一层一层进行展开,直至发现具体占用内存的对象。

接下来我们从 视图去寻找是哪个方法,哪条SQL语句触发的。具体方法:首先完全展开一个线程,从展开图的底部向上寻找:其线程的入口(控制层代码)

继续往上查找,要找到SQL语句,应该找到Mybatis处理结果集相关的类,如图所示:

然后展开boundSql即能找到SQL语句:

然后鼠标可以放在SQL属性中,右键,可以将SQL语句复制出来。

由于这里涉及到公司的代码机密,故在这里不贴出具体的SQL语句。

这里根据后面的分析,原来是在做导出功能的时候,没有使用分页对数据进行分页查询,分页写入Excel文件,而是一次将全部数据查询,导致导出功能如果并发数超过4个时,就会将所有内存耗尽。

解决方案:

  • 首先在运维层面将该请求导入到指定的一台服务器上,是导出任务与其他任务进行隔离,避免对其他重要服务造成影响。

  • 项目组对其代码进行修复,可以使用分页查数据,然后分配写入Excel。

热门内容:
  • 开放API接口签名验证,让你的接口从此不再裸奔

技术总监的反思录:我是如何失去团队掌控的?老司机给我们解读 Spring Boot 最流行的 16 条实践忠告昨天还在 for 循环里写加号拼接字符串的那个同事,今天已经不在了
推荐个 Java 开源商城项目,这个是真的好!最近面试BAT,整理一份面试资料《Java面试BAT通关手册》,覆盖了Java核心技术、JVM、Java并发、SSM、微服务、数据库、数据结构等等。获取方式:点“在看”,关注公众号并回复 666 领取,更多内容陆续奉上。
明天见(。・ω・。)

生产环境 JVM 内存溢出案例分析相关推荐

  1. 生产环境JVM内存溢出案例分析

    如果我们所在公司的业务量比较大,在生产环境经常会出现JVM内存溢出的现象,那我们该如何快速响应,快速定位,快速恢复问题呢? 本文将通过一个线上环境JVM内存溢出的案例向大家介绍一下处理思路与分析方法. ...

  2. 生产环境JVM内存溢出案例分析!

    点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:Nginx 为什么快到根本停不下来? 个人原创100W+访问量博客:点击前往,查看更多 来源:blog.csdn ...

  3. 生产环境频繁内存溢出,原来就是因为这个“String类”

    本文分享自华为云社区<[高并发]你敢信?String类竟然是导致生产环境频繁内存溢出的罪魁祸首!!>,作者:冰河  . 最近,一名小伙伴跟我说:他写的程序在测试环境一点问题没有,但是发到生 ...

  4. 生产环境JVM内存大小配置

    对于Java8而言,堆内存的初识容量为机器实际内存大小的1/64, 最大内存不超过机器实际内存的1/4. 我们的生产环境一般最大4G内存是上限了,这个视具体业务而定,流量大的互联网公司单机内存占用超过 ...

  5. JAVA内存分析:基于dump内存溢出快照分析

    JAVA内存分析 JAVA内存分析一:基于dump内存溢出快照分析 JAVA内存分析二:idea集成jprofiler查看JVM内存使用情况 JAVA内存分析三:使用JDK自带工具进行内存和CPU分析 ...

  6. 生产内存溢出定位分析

    生产内存溢出定位分析 具体生产环境大多为linux系统,此处以linux系统为示例. 1.什么是oom? 英文全称"Out Of Memory",译为 "内存不足&quo ...

  7. Tomcat中JVM内存溢出及合理配置(转:http://blog.csdn.net/ye1992/article/details/9344807)

    Tomcat本身不能直接在计算机上运行,需要依赖于硬件基础之上的操作系统和一个Java虚拟机.Tomcat的内存溢出本质就是JVM内存溢出,所以在本文开始时,应该先对Java JVM有关内存方面的知识 ...

  8. jvm 内存溢出问题排查方法

    如果你做TCP通讯或者map集合操作,并发处理等功能时,很容易出现 Java 内存溢出的问题.本篇文章,带领大家深入jvm,分析并找出jvm内存溢出的代码. jvm中除了程序计数器,其他的区域都有可能 ...

  9. tomcat中 JVM 内存溢出及合理配置

    Tomcat本身不能直接在计算机上运行,需要依赖于硬件基础之上的操作系统和一个Java虚拟机.Tomcat的内存溢出本质就是JVM内存溢出,所以在本文开始时,应该先对Java JVM有关内存方面的知识 ...

最新文章

  1. c语言x的2取模_c语言如何取模运算
  2. php重定向 htaccess文件的编写
  3. 中国污水处理行投资建议与运营价值分析报告2022-2027年
  4. 基于mykernel完成多进程的简单内核
  5. win8关闭uefi+linux,UEFI启动是什么?Win8关闭UEFI引导方式的方法
  6. eplan步进电机_干货丨三张接线图搞定步进电机接线问题!
  7. 【转载】 ppt如何导出300dpi的高分辨率图片
  8. OVF 和 OVA 文件格式和模板的区别
  9. 用计算机制作一张家庭年收支表,简洁明了的家庭收支记账表格
  10. 高新科技培育钻石,或掀时尚界新热潮
  11. 2020年全国工业固体废物、危险废物产生量、利用处置量及防治措施分析[图]
  12. Python实现爬取下载百度图片
  13. TC118AH单通道内置MOS单通道直流无刷马达驱动IC
  14. ecshop mysql 标题表_ECSHOP商城全站自定义TITLE标题设置
  15. 运放的原理、应用、参数和命名规则
  16. [Python爬虫] 一、爬虫原理之HTTP和HTTPS的请求与响应
  17. GraphQL是什么,入门了解看这一篇就够了!
  18. nbs***bsp;是牛客的bug吗
  19. python基本语法(1)
  20. Solr查询参数wt

热门文章

  1. echarts 点亮中国插件研究
  2. 简单配置nginx反向代理,实现跨域请求
  3. 开发微信小程序入门前
  4. JS-只能输入中文和英文
  5. Bzoj2110--Wc2011Xor
  6. Struts2的工作原理
  7. 一个中国人看了爽的笑话
  8. 如何关闭事件跟踪程序
  9. LeetCode实战:搜索二维矩阵
  10. 记录一次自己清理数据的过程