Redian新闻
>
new ArrayList 不当导致 CPU 飙升 。。

new ArrayList 不当导致 CPU 飙升 。。

公众号新闻

来源:juejin.cn/post/7139202066362138654

  • 前言
  • 当时场景
  • 正常的jvm监控曲线图
  • 产生问题的jvm监控曲线图
  • 具体分析
  • 结束语

昨天线上容器突然cpu飙升,也是第一次排查这种问题所以记录一下~

前言

首先问题是这样的,周五正在写文档,突然收到了线上报警,发现cpu占用达到了90多,上平台监控系统查看容器,在jvm监控中发现有一个pod在两个小时内产生了61次youngGc一次fullGc,这个问题特别严重且少见,由于我之前也没有排查过此类问题,所以也是百度,但整个过程也有一些自己的思考,所以跟大家分享一下~

当时场景

我先给大家看一下一副正常的gc曲线监控(为保密性,我自己按照平台监控画了出来):

正常的jvm监控曲线图

正常的jvm监控曲线图

产生问题的jvm监控曲线图

产生问题的jvm监控曲线图

可以看的出来,正常情况下该系统很少gc(具体看业务系统使用情况、jvm内存分配),但是在图二中出现了大量异常的gc情况甚至触发了fullGc,所以我当时立马进行了分析。

具体分析

首先异常gc的情况只出现在一个pod上(系统有多个pod),在监控系统找到对应的pod,进入pod内部查看问题原因,排查问题一定要冷静

  1. 进入pod之后,输入top查看各linux进程对系统资源的使用情况(因我这是事后补稿,资源使用不高,大家看步骤即可)

图片
  1. 分析资源使用情况在当时的情况下

top

当时我的pid为1的进程cpu上到了130(多核)那我认定就是java应用出问题了,control+c退出继续往下走

  1. 输入top -H -p pid 通过此命令可以查看实际占用CPU最高的的线程的id,pid为刚才资源使用高的pid号

top -H -p pid

  1. 出现具体线程的资源使用情况,表格里的pid代表线程的id,我们称他为tid

tid

  1. 我记得当时的tip为746(上述图片只是我给大家重复步骤),使用命令printf "%x\n" 746,将线程tid转换为16进制

tid转换为16进制

因为我们线程id号在堆栈里是16进制的所以需要做一个进制转换

  1. 输入jstack pid | grep 2ea >gc.stack
jstack pid | grep 2ea >gc.stack

jstack

解释一下,jstack是jdk给提供的监控调优小工具之一,jstack会生成JVM当前时刻的线程快照,然后我们可以通过它查看某个Java进程内的线程堆栈信息,之后我们把堆栈信息通过管道收集2ea线程的信息,然后将信息生成为gc.stack文件,我随便起的,随意

  1. 当时我先cat gc.stack 发现数据有点多在容器里看不方便,于是我下载到本地浏览,因为公司对各个机器的访问做了限制,我只能用跳板机先找到一台没用的机器a,把文件下载到a然后我再把a里的文件下载到本地(本地访问跳板机OK),先输入python -m SimpleHTTPServer 8080,linux自带python,这个是开启一个简单http服务供外界访问

开启http服务

然后登录跳板机,使用curl下载curl -o http://ip地址/gcInfo.stack

为方便演示,我在图中把ip换了一个假的

curl

之后用同样的方法从本地下载跳板机就可以了,记得关闭python开启的建议服务嗷

  1. 把文件下载到了本地,打开查看编辑器搜索2ea,找到nid为2ea的堆栈信息

找到nid为2ea的堆栈信息

之后找到对应的impl根据行数分析程序

  1. 发现是在文件异步导出excel的时候,导出接口使用了公共列表查询接口,列表接口查询数据最多为分页200一批,而导出数据量每个人的权限几万到十几万不等

导出excel

并且该判断方法使用了嵌套循环里判断,且结合业务很容易 get 不到 value,Java 下的new ArrayList 就是返回一个 List 集合(好像不用说这么细 (;一_一 ),在整个方法结束之前,产生的 lists生命周期还在所以发生多次gc触发重启之后还影响到了别的pod。然后对代码进行了fix,紧急上线,问题解决~

结束语

遇到生产问题,大家不要害怕,遇到问题先保证服务是否可用,然后通过有限的信息层层解析,找出最终的问题。如果你会 arthas,排查起来会更轻松!

PS:如果觉得我的分享不错,欢迎大家随手点赞、在看。

 关注公众号:Java后端编程,回复下面关键字 


要Java学习完整路线,回复  路线 

缺Java入门视频,回复 视频 

要Java面试经验,回复  面试 

缺Java项目,回复: 项目 

进Java粉丝群: 加群 


PS:如果觉得我的分享不错,欢迎大家随手点赞、在看。

(完)




加我"微信获取一份 最新Java面试题资料

请备注:666不然不通过~


最近好文


1、再见了 Shiro!

2、无意中发现了一位清华妹子的资料库!

3、Spring Boot + Gzip 压缩超大 JSON 对象,传输大小减少一半!

4、牢记这16个SpringBoot 扩展接口,写出更加漂亮的代码

5、聊聊大厂都怎么防止重复下单?



最近面试BAT,整理一份面试资料Java面试BAT通关手册,覆盖了Java核心技术、JVM、Java并发、SSM、微服务、数据库、数据结构等等。
获取方式:关注公众号并回复 java 领取,更多内容陆续奉上。
明天见(。・ω・。)ノ♡

微信扫码关注该文公众号作者

戳这里提交新闻线索和高质量文章给我们。
相关阅读
英特尔演示酷睿 Ultra 1 代笔记本:关闭 CPU / GPU 模块,使用 SoC 模块播放 1080p 视频白菜价出一波美貌连衣裙 new with tag DVF equipment 等工信部:加强CPU、GPU和服务器等重点产品研发,增强算力产业自主创新能力大学新生网购苹果电脑 打开发现竟然是。。。。台风天,他们走私数千个 CPU、GPU和存储芯片So long iPhone. Generative AI needs a new device | 商论双语8/5/2023-8/11/2023 法拉盛新龍興“立秋”大特价,幸福你,我,他,她。。。。。。孔子,生命的觉醒Instacart上市,导致Databricks撕逼Snowflake。。。高调!加拿大彩票中奖者必须与支票合影的原因是。。。。基于AI和NPU的Codec变革——VPU与NPU的协同创新面试官:什么是 TCP 长连接、短连接?问倒一大片。。。HR威胁导致码农自杀???网易回应。。。斯洛文尼亚 卢布尔雅那🥬出几条白菜DVF dress.New with tag.Ventana 携手 Imagination,合作开发基于 RISC-V 的 CPU-GPU 平台请教:一个关于辞职和sign a contract with a new employer 的问题。new ArrayList 不当导致 CPU 飙升。。揭秘租妻产业链:白天当导游,晚上当女伴!详解CPU、内存、GPU知识Erklärung zur Zusammenarbeit再提频!骁龙8Gen3 for Galaxy CPU提频至3.4GHz、GPU提至1GHzNew York post种族歧视了,讨论妓女的事放的全是亚裔女人教培“老大哥”新东方净利暴涨119%,俞敏洪进军文旅:老师不当主播当导游?她提升了你生命的價值 ——臥龍崗徜徉的啟迪最高32核CPU、80核GPU,苹果M3 Ultra芯片规格曝光小红书博主的钱都是大风刮来的吗。。。。将廉价的AMD CPU变成16GB GPU麻州黄金地段,自住投资两相宜--本周房源精选--Newton/Wayland/WalthamHBM崛起:从GPU到CPUlayoff后面试被问why you are looking for a new jobChinese State Media Slams ‘Hot Kids Style’ in Children’s Fashion联想旗舰游戏笔记本 Legion 9i 曝光:RTX 40 系列 GPU + 酷睿 i9 HX CPU骁龙8 Gen 3处理器发布:CPU性能提升30%、GPU提升25%美麗阿拉斯加(二)安克雷奇 (Anchorage)英特尔 Arrow Lake-S CPU 幻灯片曝光:单核提升 5%,多核提升 15%2023年CPU&GPU天梯图(最新版)你好,我是筚(bì)篥( lì)!桃红柳緑,球场三伏一文搞懂 GPU 的概念、工作原理,以及与 CPU 的区别
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。