定位jvm内存溢出

如何快速定位堆内存溢出问题:JVM内存管理的“仓库爆仓”排查指南 四步定乾坤一取dump:jmap抓取堆快照二查监控:jstat看各区分布三用MAT:分析对象支配树四改代码:修复泄漏调参数预防建议定期进行压力测试关键组件增加内存限制使用快速失败重要服务配置堆外内存监控TIP:本文命令基于JDK 8+环境,如果使用G1垃圾回收器,建议添加参数获取更多信息。 阅读详情

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

中间件兴趣圈 中间件兴趣圈

微信号dingwpmz_zjj

功能介绍关注后端技术架构、java多线程、并发、Netty、Mycat、Dubbo、ElasticJob、RocketMQ、Elasticsearch等中间件技术。

前天

如果我们所在公司的业务量比较大,在生产环境经常会出现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属性中,右键,可以将SQL语句复制出来。

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

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

解决方案:

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

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

作者简介:丁威,RocketMQ早期布道者、《RocketMQ技术内幕》作者、中间件兴趣圈公众号维护者。

 

深空探测处理软件USGS-ISIS的下载安装 深空探测处理软件USGS-ISIS下载安装教程 阅读详情

相关推荐

引入 CloudWeGo 后飞书管理后台平台化改造的演进史

飞书管理后台是飞书套件专为企业管理员提供的信息管理平台,它通过引入 Kitex 泛化调用对飞书管理后台进行平台化改造,成为了企业统一数字化管理平台。本文将从三个方面为大家讲解 Kitex 泛化调用在飞书管理后台平台化改造过程中的落地实践。...

weixin_44186218的博客 1762

【实战总结】JVM内存溢出问题排查

这里先说一下结论,堆内存总共3.1G,Suspect1问题指向一个慢SQL,间接导致1.7G内存无法回收,Suspect2 由com.mysql.jdbc.ByteArrayRow导致1.2G内存无法回收,原始sql指向与Suspect1同样的慢SQL,这样就基本可以确定是这一条慢SQL导致的内存溢出。打开MAT,File--->open dump file--->选择本次输出的dump文件,可以看到如下总览页面,点击Leak Suspects查看内存泄露分析。一周前系统有一次投产,之后再没有更新过系统。

雪落夜的专栏 9745

保姆级教程:用sw_urdf_exporter插件将Solidworks机械臂模型转为ROS可用的URDF

本文提供了一份详细的保姆级教程,指导用户使用sw_urdf_exporter插件将Solidworks机械臂模型转换为ROS可用的URDF文件。从环境准备、插件配置到模型预处理和关键参数设置,再到ROS环境集成测试和性能优化,全面覆盖了机械臂URDF转换的全流程。特别适合机器人工程师和ROS开发者快速实现Solidworks模型到ROS环境的无缝迁移。

weixin_29300931的博客 396

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

作者简介:《RocketMQ技术内幕》作者 如果我们所在公司的业务量比较大,在生产环境经常会出现JVM内存溢出的现象,那我们该如何快速响应,快速定位,快速恢复问题呢? 本文将通过一个线上环境JVM内存溢出的案例向大家介绍一下处理思路与分析方法。 案例:架构组接到某项目组反馈,Zabbix监控上显示JMX不可用,请求协助处理。 分析思路: JMX不可用...

weixin_33691817的博客 1216

用STM32CubeMX和HAL库,5分钟搞定TB6612驱动直流电机(附完整代码)

本文详细介绍了如何使用STM32CubeMX和HAL库快速配置TB6612驱动直流电机,包括硬件连接、CubeMX工程配置、电机驱动逻辑实现及进阶优化技巧。通过图形化工具和代码示例,即使是新手也能在5分钟内完成电机调速系统的搭建,大幅提升开发效率。

weixin_26854829的博客 266

我爬取了某非法网贷后台系统数据,终于知道什么叫做利滚利滚利滚利了

我爬取了非法贷款的后台网站!

weixin_44042821的博客 2877

JVM:全面理解线上服务器内存溢出(OOM)问题处理方案(一)

OOM问题的实际原因各种各样,就像我们开发时遇到的空指针错误,导致的原因可能有很多,但是排查的思路却差不多,大家之所以对OOM问题避而远之,是因为不能直接看到报错的代码位置,这一点需要我们借助jhatjmapMAT等工具来实现。但只要大家多操作,多积累经验,你会发现这个的排查也没有那么难,那么下期我们将结合实际的线上案例,来一起带大家推导OOM问题解决。

55555的博客 8697

OV5640调试大坑,关于binning、RES分辨率与EV曝光

OV5640在使用binning模式时,必须考虑使用场景,分辨率下降叠加动态范围压缩,会使目标对象细节在高光环境下大量丢失,2x2的binning模式,分辨率会远低于感光面积的1/4。

chongyun_的专栏 1822

【JVM】如何定位、解决内存泄漏和溢出

如何定位JVM内存泄漏和内存溢出问题?实战干货!一文详聊!快速上手!

BugMan的博客 6771

【nvidia-B200 生产环境】NVIDIA 570.124.06+Cuda12.8 Ubuntu22.04 nccl-test 一键部署脚本(免修改复制即用)

目录1. 初始化与日志记录2. 安装基础工具与配置更新3. NVIDIA 驱动安装 570.124.064. 安装 Mellanox OFED 24.10-2.1.8.05. 安装 CUDA 12.86. 安装 NCCL 和测试7. 配置 rc.local 和其他优化8. B200 单独步骤9. 最终测试与重启10. 完整生产脚本,复制即可直接使用总结 功能: 设置日志目录和日志文件路径。 使用 命令将标准输出和错误输出同时写入日志文件和终端。 记录脚本开始时间,并计算开始的秒数

jundao1997的专栏 2796

RabbitMQ高级特性 - 生产者消息确认机制

为了保证信息 从生产者 发送到 队列,因此引入了生产者的消息确认机制.通过事务机制实现.通过发送确认机制(confirm 和 return)实现.因为事务机制比较消耗性能,在实际工作中用的也不多,因此这里主要介绍confirm 和 return机制来实现发送放的确认.a)confirm 确认模式如上图,confirm 确认模式主要保障于 生产者 到 交换机 的消息可靠性.如果 Exchange成功收到消息,那么 ConfirmCallback 这个回调 ack 参数就为true。

CYK_byte的博客 1883

定位JVM内存溢出问题思路总结

定位JVM内存溢出问题思路总结 JVM的内存溢出问题,是个常见而有时候有非常难以定位的问题。定位内存溢出问题常见方法有很多,但是其实很多情况下可供你选择的有效手段非常有限。很多方法在一些实际场景下没有实用价值。这里总结下我的一些定位思路。 要定位JVM内存溢...

204

flowable工作流看这一篇就够了(基础篇)

接下来我们构建一个非常简单的请假流程,Flowable引擎需要流程定义为BPMN 2.0格式,这是一个业界广泛接受的XML标准。在Flowable术语中,我们将其称为一个流程定义(process definition)。一个流程定义可以启动多个流程实例(process instance)。流程定义可以看做是重复执行流程的蓝图。在这个例子中,流程定义定义了请假的各个步骤,而一个流程实例对应某个雇员提出的一个请假申请。

qq_38196449的博客 2万+

JVM一直FullGC内存溢出定位

JVM内存溢出是java编码比较常见的一种性能问题,这种问题在开发和测试环境不容易发现,但是上线初期项目运行一段时间,很容易出现。比较常见于excel导出,非分页大数据量查询等,在工作期间也多次遇到和处理此类问题,分享下定位方法。 内存溢出现象:界面访问突然卡顿,刷新后无法加载出页面。用F12查看,一直处于后端请求直到超时报错;后端查询日志,基本无日志输出,仅仅从日志层面无法看出什么原因导致。 内存溢出原因:大量创建对象,对象处于存活状态,对象在老年代中fullGc无法回收,一直fullgc导致st..

guaotianxia的博客 4108

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

java 定位 内存溢出_jvm内存溢出问题的定位方法

jvm内存溢出问题的定位方法今天给大家带来JVM体验之内存溢出问题的定位方法。废话不多说直接开始:一、Java堆溢出测试代码如下:import java.util.*;public class A {public static void main(String[] args) {List strList = new ArrayList<>();while(true) {strList....

weixin_39830175的博客 214

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

jvm内存溢出问题的定位方法

今天给大家带来JVM体验之内存溢出问题的定位方法。 废话不多说直接开始: 一、Java堆溢出 测试代码如下: package com.gosaint.ms; import java.util.HashMap; import java.util.Map; import java.util.Vector; public class MemoryError { static Vec...

大佛拈花的博客 550

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

JVM内存溢出定位和调优

JVM调优JVM调优JVM规划环境优化定位解决现网问题参数篇常见垃圾回收选型(JDK1.8)GC日志GC常用参数Parallel常用参数CMS常用参数G1常用参数 JVM调优 JVM规划 java采用自动内存管理,我们可以更加关注业务的逻辑,JVM对语言来说是透明的,只要符合JVM规范就可以跑在JVM上。就像《深入理解Java虚拟机》里说的,如果热爱技术,想一直走下去那么JVM是必经之路,我亦是苦...

qq_43323585的博客 666

java jvm 内存溢出(OOM) 定位与优化

Java jvm内存溢出是指应用程序在运行的过程中,由于有不断的数据写入到内存,到导致内存不足,进程被系统内核杀死。所在在服务程序运行的时候,要观察一段时间的程序内存使用和分配情况。 故事原因 在一次游戏合服的操作之后,几个服的玩家被合并到同一个服,这个时候,玩家的数据量会猛增。突然就收到客服反应有些玩家登陆不进去了,一些在游戏中的玩家明显感觉到游戏卡顿。基于这些原因,首先就是查看系统的CPU和内...

王广帅--游戏开发-服务器开发 1565

jvm参数 log4j 日志路径_Log4J调用kafka时JVM堆 内存溢出问题定位

【使用场景】很多应用程序使用Log4j记录日志,如何使用Kafka实时地收集与存储这些Log4j产生的日志呢?一种方案是使用其他组件(比如Flume,或者自己开发程序)实时监控这些日志文件,然后发送至Kafka。而另外一种比较便捷的方案是使用已封装 Kafka 的Log4jAppender:只需在Log4j配置文件中进行简单配置,即可完成将Log4j产生的日志实时发送至Kafka中。但在log4j...

weixin_39597636的博客 975

JVM 内存溢出排查不用愁!这 3 个命令 + MAT 工具,5 分钟定位根源

jmap命令用于生成 Java 进程的内存快照(heap dump),快照中包含了 JVM 内存中的对象信息、对象之间的引用关系等,是后续深入分析内存溢出根源的关键数据。例如,执行jstat -gc 12345 1000 5,会每隔 1 秒对进程 ID 为 12345 的 Java 应用进行一次内存监控,共执行 5 次,输出结果类似:​。需要注意的是,生成内存快照的过程可能会暂停应用的运行,尤其是在应用内存较大时,耗时可能较长,因此在生产环境中使用时需谨慎,尽量选择在业务低峰期进行。

2509_93051135的博客 678

JVM实战:内存溢出的定位与分析

如果出现了内存溢出,首先我们需要定位到发生内存溢出的环节,并且进行分析,是正常还是非正常情况,如果是正常的需求,就应该考虑加大内存的设置,如果是非正常需求,那么就要对代码进行修改,修复这个bug。内存溢出在实际的生产环境中经常会遇到,比如,不断的将数据写入到一个集合中,出现了死循环,读取超大的文件等等,都可能会造成内存溢出。分析:这个可疑是正确的,因为已经有88%的内存都被它占有,这是非常有可能出现内存溢出的。为了演示效果,我们将设置执行的参数,这里使用的是Idea编辑器。接下来,我们模拟内存溢出的场景。

write less , do more 2250

JVM 调优实战--内存溢出的定位和MAT分析

目录 内存溢出的定位和分析 模拟内存溢出代码 MAT分析 内存溢出的定位和分析 模拟内存溢出代码 添加运行参数: ①-Xms8m:初始堆内存大小为8M; ②-Xmx8m:最大堆内存大小为8M; ③HeapDumpOnOutOfMemoryError:当发生堆内存溢出时dump到文件。 在idea中添加参数,并运行程序: dump文件也已经生成: ...

学亮编程手记 831

JVM内存溢出的定位与分析

一、内存溢出的初步认识及分析 如果出现内存溢出,首先我们先定位到发生内存溢出的环节,并且进行分析,是正常还是非正常情况,如果正常需求,则考虑增加JVM的内存设置,如果非正常需求,那么要对代码进行修改,修复bug 定位方法: 借助jmap与MAT工具进行定位分析 jstat命令可查看堆的使用情况及垃圾回收情况。 用法:jstat –gcutil pid S0 S1 E 为新生代 O为老年代 M是元区间(方法区) YGC新生代执行次数 YGCT新生代执行时间 FGC老年代执行次数 FGCT老年代执行时间 G.

weixin_38007801的博客 522

JVM体验之内存溢出问题的定位方法

测试代码如下:1234567891011121314151617 运行过程如下所示我们在这里可以看到内存在不断地上涨,而Java在到一定时候会爆出OOM异常。如下:Exception in thread "main" java.lang.OutOfMemoryError: Java heap spaceat java.util.Arrays.copyOf(Arrays.java:3210)at java.util.Arrays.copyOf(Arrays.java:3181)at java.ut

weixin_53953440的博客 455
上一篇: redis简单介绍
下一篇: MySql存储引擎和索引原理
辛一一
博客等级 码龄10年 125粉丝 62原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值