记一次 JVM CPU 使用率飙高问题的排查过程

springboot+poi导出百万级数据避免OOM内存溢出 记录下在实际项目中碰到过一个重大问题,全量导出百万级数据,由于之前在开发环境数据没有达到百万级别,因此此问题没有处理,上到测试环境后,数据量达到150万的时候,全量导出所有的数据出现内存溢出问题。这段代码亲测有效,到测试环境上导出五百多万条数据都没有出现OOM问题,希望对各位朋友有效。这里实现了多个sheet页导出的数据,excel导出一个sheet最多能导出100万多一点数据,至于具体数字,请朋友们自行百度下。 阅读详情

点击上方“芋道源码”,选择“设为星标”

管她前浪,还是后浪?

能浪的浪,才是好浪!

每天 10:33 更新文章,每天掉亿点点头发...

源码精品专栏

 

来源:guobinhit.blog.youkuaiyun.com/

article/details/70823903


问题现象

首先,我们一起看看通过 VisualVM 监控到的机器 CPU 使用率图:

a834a31d31ac561d6ee8be6b8cee928e.png

如上图所示,在 下午3:45 分之前,CPU 的使用率明显飙高,最高飙到近 100%,为什么会出现这样的现象呢?

基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

  • 项目地址:https://gitee.com/zhijiantianya/ruoyi-vue-pro

  • 视频教程:https://doc.iocoder.cn/video/

排查过程

Step 1: 使用top命令,查询资源占用情况:

4253ac038bd98b99dafeb7ec8a53f2a9.png

如上图所示,显示了服务器当前的资源占用情况,其中PID为5456的进程占用的资源最多。

在这里,我们也使用top -p PID命令,查询指定PID的资源占用情况:

dc4b231ee3d6e5df70acd615edb5e82a.png

Step 2: 使用ps -mp PID -o THREAD,tid,time命令,查询该进程的线程情况:

804cd7d92b19ee4b41dab31b8432b38d.png

在这里,我们也使用ps -mp PID -o THREAD,tid,time | sort -rn命令,将该进程下的线程按资源使用情况倒序展示:

20058c249f44189032a9785e25ec5a8d.png

Step 3: 使用printf "%x\n" PID命令,将PID转为十六进制的TID:

30cf5f1ddcc2775ebd0378d8c9b64934.png

在这里,我们之所以需要将PID转为十六进制是因为在堆栈信息中,PID是以十六进制形式存在的。

Step 4: 使用jstack PID | grep TID -A 100命令,查询堆栈信息:

79ee8b5c1c5e280fc7b5ac4bdf68f43f.png

如上图所示,显示该进程下多个线程均处于TIMED_WAITING状态。

虽然线程处于WAITING或者TIMED_WAITING状态都不会消耗 CPU,但是线程频繁的挂起和唤醒却会消耗 CPU,而且代价高昂。

而上面之所以会出现 CPU 使用率飙高的情况,则是因为有人在做压测。

特别地,在 mock 底层接口的时候,使用了类似TimeUnit.SECONDS.sleep(1)这样的语句。

至于为何在 下午3:45 分之后,CPU 的使用率降下来了,则是因为停止了压测。

除此之外,我们还可以使用jinfo和jstat命令来查询 Java 进程的启动参数以及 GC 情况:

使用jinfo PID命令,查询启动参数:

605e3f06e3cc584ff343ac2c1bba276d.png

如上图所示,使用该命令我们主要是为了查询启动参数,如初始化堆大小、垃圾回收器等配置。

使用jstat -gcutil PID 1000命令,查询 GC 情况:

50a33454270891025f52fbcd833d64fd.png

如上图所示,显示了PID为20567的 Java 进程每秒的 GC 情况,其中1000表示 GC 状态的更新频率,单位为毫秒。



欢迎加入我的知识星球,一起探讨架构,交流源码。加入方式,长按下方二维码噢:

3af80923db1e531b5de273289f26ade5.png

已在知识星球更新源码解析如下:

33aa402b52de3302724942de883628e5.jpeg

800d3a4fe98a6dfefa44af0bc36463fb.jpeg

a60f81f6dc8e058961577688b45e1d71.jpeg

0da1f49f015abe8fd98c57222390471c.jpeg

最近更新《芋道 SpringBoot 2.X 入门》系列,已经 101 余篇,覆盖了 MyBatis、Redis、MongoDB、ES、分库分表、读写分离、SpringMVC、Webflux、权限、WebSocket、Dubbo、RabbitMQ、RocketMQ、Kafka、性能测试等等内容。

提供近 3W 行代码的 SpringBoot 示例,以及超 4W 行代码的电商微服务项目。

获取方式:点“在看”,关注公众号并回复 666 领取,更多内容陆续奉上。

文章有帮助的话,在看,转发吧。
谢谢支持哟 (*^__^*)
解决POI读取Excel内存溢出的问题 Office软件一直是一个诲誉参半的软件,广大普通计算机用户用Office来满足日常办公需求,于是就产生了很多生产数据和文档,需要和企业单位的专用办公系统对接,而Office的解析工作一直是程序员非常头痛的问题,经常招致程序员的谩骂,也被誉为是微软最烂的发明之一。POI的诞生解决了Excel的解析难题(POI即“讨厌的电子表格”,确实很讨厌,我也很讨厌Excel),但如果用不好POI,也会导致程序 阅读详情

相关推荐

记一次CPU有规律飙高的线上问题排查过程

cpu问题排查过程

程序男的专栏 1781

图解电商支付架构设计,这才是真电商

点击上方“芋道源码”,选择“设为星标”管她前浪,还是后浪?能浪的浪,才是好浪!每天 8:55 更新文章,每天掉亿点点头发...源码精品专栏原创 | Java 2020 超神之路,很肝~中...

芋艿V 907

记一次JVM疯狂GC导致CPU飙高的问题解决

背景 线上web服务器不时的出现非常卡的情况,登录服务器top命令发现服务器CPU非常的高,重启tomcat之后CPU恢复正常,半天或者一天之后又会出现同样的问题。解决问题首先要找到问题的爆发点,对于偶现的问题是非常难于定位的。 重启服务器之后只能等待问题再次出现,这时候首先怀疑是否某个定时任务引发大量计算或者某个请求引发了死循环,所以先把代码里面所有怀疑的地方分析了一遍,加了一点日志,结果第二天下午问题再次出现, 这次的策略是首先保护案发现场,因为线上是两个点,把一个点重启恢复之后把另一个点只下线不

m0_67645544的博客 3883

kafka-console-ui的简介及安装使用

kafka-console-ui 是一款轻量级的kafka可视化管理平台,安装、配置特别简单,一般来说只需要配置一个kafka集群地址启动即可。为了开发的省事,没有国际化支持,页面只支持中文展示。不是一个企业级的平台,目前看来只适合中、小型集群的管理。这个工具看起来是挺low的,但是对于刚接触kafka急需一个合适工具进行管理的同学来说,还是挺友好的,没有国际化支持,全是中文展示。支持broker相关配置的查看及修改。

初夏0811的博客 7420

CPU飙高系统反应慢怎么排查?

通过以上步骤,逐步排查和分析,可以找出导致 CPU 飙高、系统反应慢的原因,并进行相应的优化和修复。

秉持长期主义,保持长期生命力和竞争力 981

解决poi读取excel2007出现内存溢出问题代码参

解决poi读取excel2007出现内存溢出问题代码参

Java线上CPU飙高问题排查全指南

Java线上CPU飙高是一个常见且复杂的问题,需要我们掌握系统的排查方法和工具。本文从常见原因、排查工具、排查流程和实际案例四个方面,详细介绍了Java线上CPU飙高问题的排查和解决方法。在实际工作中,我们应该根据具体情况灵活运用这些方法和工具,同时注重预防措施,从代码层面、JVM参数调优和监控系统建设三个方面入手,减少CPU飙高问题的发生。

weixin_56018532的博客 3935

十五天学会Autodesk Inventor,看完这一系列就够了(七),工程图纸

不管哪种绘图软件,二维或三维绘图,最终均需要转换成工程图纸,才能交给现场人员进行制作,这是任一产品图都要经历的过程。那本章开始,我们一起看一下Inventor是如何实现工程图纸?

Crazydoubao的博客 4915

CPU飙高问题排查思路

工作中时不时会被指派去排查线上问题,线上问题大致分成两种:一种是业务bug相关的,这种实际上没啥好讲的,无非就是程序运行结果不符合业务,一般都是看下相关日志,获取相关入参,在本地复现bug后修复即可。另一种则是排查程序是否能稳定运行,即在程序能完成预期的功能前提下,保证程序能够有较快的响应速度,不会出现明显的卡顿以及延迟。一般出现延迟或者卡顿的情况,服务器CPU使用率通常都会异常飙高。所以问题也就转换成了排查CPU为何飙高,以及应该如何解决。

1555

勒索病毒c语言源代码,勒索病毒原理解析

一、编程思路什么是勒索病毒:遍历你电脑上所有文件,并且用加密算法加密,然后把加密秘钥发送到自己邮箱里,弹出窗口。工具:操作系统API,加密算法思路:1.程序设计 思路规划清楚1.1 加密单个文件1.2 遍历文件系统并加密文件2.工程实现: 编程3.测试上线 :、测试欢迎加入学习群【892643663】,获取全套免费C/C++企业实战级课程资源(素材+源码+视频)和编译大礼包二、代码解析//文件遍...

weixin_35355756的博客 6604

MIMO-OFDM 通信-感知一体化(ISAC)中的联合优化与性能权衡

本文深入探讨了MIMO-OFDM技术在通信-感知一体化(ISAC)系统中的核心作用与挑战。文章分析了如何通过联合优化资源分配、波束成形与波形设计,在有限的频谱与硬件资源下,实现通信速率与感知精度之间的最佳平衡,并指出了工程实践中面临的同步、干扰等关键难题。

dapp9builder的博客 216

jvm如何排查生产环境cpu飙高的问题

文章目录一、生产环境 cpu 飙高产生的原因?1. CAS 自旋没有控制自旋次数2. 死循环3. 阿里云 Redis 被注入挖矿程序4. 服务器被 DDOS 工具攻击二、windows环境下如何排查cpu飙高问题2.1. 任务管理器2.2. jvisualvm三、环境下如何排查cpu飙高问题3.1. 监控命令3.2. 使用 arthas3.3. 服务器监控系统3.4. 第三方监控软件四、linux环境下cpu飙高实战4.1. cpu飙高测试类4.2. 上传测试类4.3. 编译测试类4.4. 执行测试类4.

Gblfy_Blog 2507

Solidworks在Windows 11上安装失败?这里有解决方案

通过上述步骤,你应该能够解决在Windows 11上安装Solidworks时遇到的问题。这个方法通过调整注册表的设置,提高了安装程序的权限,从而有效避免了安装过程中的权限障碍。当然,每个系统的具体情况可能有所不同,如果在尝试上述方法后仍然无法解决问题,建议联系Solidworks的技术支持团队,获取更专业的帮助。希望本文能够对你有所帮助,祝你工作顺利,设计无忧!

nntxthml的博客 4914

【经验篇】记如何排查Linux服务器CPU使用率过高的问题

问题描述 在某一天系统更新上线一个版本后,运维人员通过监控发现Tomcat出现CPU使用率超过200%的问题,导致监控系统频繁告警。 排查过程 我们的Tomcat是部署在linux环境中,下面的排查过程均在linux下进行。 1. 查看后台服务 通过查看Tomcat的后台日志,发现日志正常打印,未发现异常信息。 2. 查看服务器信息 2.1 找出耗CPU的进程 使用top命令查看特定用户(user1)的内存、cpu及各进程的信息: [root@localhost ~]# top -u user1 使用

光阴迷客的知识库 1万+

UE5热更新(通过Pak包加载关卡资源,并添加到流关卡)

请先阅读我上一篇文章)**

xialuhui的博客 6456

关于ADS重新安装失败的解决方案

ads卸载安装license被锁无法修改导致安装最后没有证书

weixin_47103290的博客 9711

JVM虚拟机-JVM调优、内存泄漏排查、CPU飙高排查

本文系统解析JVM性能调优与故障排查,涵盖GC参数配置、内存泄漏检测及CPU飙高定位方法(线程快照与热点代码分析)。详解堆内存溢出根因(大对象分配)。助开发者掌握调优策略与异常排查链路,提升高并发场景下Java应用的稳定性与性能表现。

Crayon26的博客 1320

【DaVinci Developer专题】-28-Client Server Port Interface中useArgumentType、useArrayBaseType和useVoid介绍

共7页 目录 1 ImplPolicy = useArgumentType 2 ImplPolicy = useArrayBaseType 3 ImplPolicy = useVoid 4 三者代码差异部分 5 结尾 <--返回「实战篇」博文-总目录--> <--返回「Autosar从入门到精通-实战篇」专栏主页--> 关键字: 缩略语/术语 含义 DEV DaVinci Developer

「汽车电子助手」的博客 1505

记一次jvm疯狂gc导致CPU飙高的问题解决

在环境上遇到tomcat频繁gc导致cpu load飙高的问题,本来想自己写一个文章的,看到这个偷懒转载一下。 线上web服务器不时的出现非常卡的情况,登录服务器top命令发现服务器CPU非常的高。 重启tomcat之后CPU恢复正常,半天或者一天之后又会偶现同样的问题。 解决问题首先要找到问题的爆发点,对于偶现的问题是非常难于定位的。 重启服务器之后只能等待问题再次出现,这时候首先怀疑是否某个...

贾己人的博客 2329

北斗导航 | SPP、RTK、RTD、PPP-RTK、PPP算法原理,公式及完整matlab代码

开发参考:SPP适合入门学习GNSS定位原理和最小二乘。RTK是工程高精度定位主流方案,但依赖基站。PPP适合无基站区域的广域高精度应用。PPP-RTK是融合两者优点的新一代技术,但系统复杂度最高。· 代码资源:raPPPid(VieVS PPP)是功能完整的MATLAB开源PPP工具箱,支持多系统PPP-AR。MATLAB GPS Toolbox 提供从SPP到PPP的完整功能实现。· 实际应用:农业自动驾驶、无人机航测通常使用网络RTK;大地测量、地壳形变监测常采用PPP事后处理;

尘世冰封的专栏 830

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

上一篇: 火山引擎:ClickHouse增强计划之“多表关联查询”
下一篇: 去阿里面试到第二轮就被虐惨:高并发下怎么防止数据重复?
公众号-芋道源码
博客等级 码龄10年 1634粉丝 377原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值