最新要闻
- 看点:799元 ROG龙鳞ACE Aimlab鼠标上市:仅重54g
- 2030年前我国将送人上月球 新一代载人火箭三级发动机点火成功
- 天天快讯:《王者荣耀》兔年限定皮肤英雄公布:马克、瑶妹喜提新装
- 【报资讯】1300多种首次公开!中国空间站居然种了这么多“菜”
- 中国第一商贩:“傻子瓜子”创始人年广九逝世 享年84岁
- 焦点日报:美国上万架航班停飞!初步调查:因一个数据库文件损坏
- 环球观察:小米13 Pro用上安卓最高端屏幕 雷军:价格最贵
- 4000吨巨型“充电宝”广东下水:每天可发2.4万度电
- 每日信息:高德地图上线一键报平安功能 路程家人一看便知
- 天天最资讯丨2022年新生儿爆款名字出炉上热搜:男/女孩这些名字土爆了?
- 环球信息:爱奇艺APP投屏加钱 上海消保委点名批评:不合理、不厚道
- 特斯拉降价效果显著!友商会不会跟进降价?
- 焦点消息!阿凡达2不适合国人?国产科幻大片《流浪地球2》迎战 还有《满江红》等一次看爽
- 12306出现故障无法查车次 客服回应:网络问题 建议多次刷新
- 环球焦点!羡慕吗?微软宣布给员工“无限休假”福利:不再固定天数
- 环球观点:AMD RDNA3显卡架构底层细节公开!606页 应有尽有
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
天天短讯!排查+解决 Java 内存泄漏,最基本的方法,你必须学会!
来源:zhenbianshu.github.io/
(相关资料图)
前些日子小组内安排值班,轮流看顾我们的服务,主要做一些报警邮件处理、Bug 排查、运营 issue 处理的事。工作日还好,无论干什么都要上班的,若是轮到周末,那这一天算是毁了。
不知道是公司网络广了就这样还是网络运维组不给力,网络总有问题,不是这边交换机脱网了就是那边路由器坏了,还偶发地各种超时,而我们灵敏地服务探测服务总能准确地抓住偶现的小问题,给美好的工作加点料。好几次值班组的小伙伴们一起吐槽,商量着怎么避过服务保活机制,偷偷停了探测服务而不让人发现(虽然也并不敢)。
前些天我就在周末处理了一次探测服务的锅。
问题
网络问题?
晚上七点多开始,我就开始不停地收到报警邮件,邮件显示探测的几个接口有超时情况。多数执行栈都在:
java.io.BufferedReader.readLine(BufferedReader.java:371)java.io.BufferedReader.readLine(BufferReader.java:389)java_io_BufferedReader$readLine.call(Unknown Source)com.domain.detect.http.HttpClient.getResponse(HttpClient.groovy:122)com.domain.detect.http.HttpClient.this$2$getResponse(HttpClient.groovy)
这个线程栈的报错我见得多了,我们设置的 HTTP DNS 超时是 1s, connect 超时是 2s, read 超时是 3s,这种报错都是探测服务正常发送了 HTTP 请求,服务器也在收到请求正常处理后正常响应了,但数据包在网络层层转发中丢失了,所以请求线程的执行栈会停留在获取接口响应的地方。这种情况的典型特征就是能在服务器上查找到对应的日志记录。而且日志会显示服务器响应完全正常。与它相对的还有线程栈停留在 Socket connect 处的,这是在建连时就失败了,服务端完全无感知。
我注意到其中一个接口报错更频繁一些,这个接口需要上传一个 4M 的文件到服务器,然后经过一连串的业务逻辑处理,再返回 2M 的文本数据,而其他的接口则是简单的业务逻辑,我猜测可能是需要上传下载的数据太多,所以超时导致丢包的概率也更大吧。
根据这个猜想,群登上服务器,使用请求的 request_id 在近期服务日志中搜索一下,果不其然,就是网络丢包问题导致的接口超时了。
当然这样 leader 是不会满意的,这个结论还得有人接锅才行。于是赶紧联系运维和网络组,向他们确认一下当时的网络状态。网络组同学回复说是我们探测服务所在机房的交换机老旧,存在未知的转发瓶颈,正在优化,这让我更放心了,于是在部门群里简单交待一下,算是完成任务。
问题爆发
本以为这次值班就起这么一个小波浪,结果在晚上八点多,各种接口的报警邮件蜂拥而至,打得准备收拾东西过周日单休的我措手不及。
这次几乎所有的接口都在超时,而我们那个大量网络 I/O 的接口则是每次探测必超时,难道是整个机房故障了么。
我再次通过服务器和监控看到各个接口的指标都很正常,自己测试了下接口也完全 OK,既然不影响线上服务,我准备先通过探测服务的接口把探测任务停掉再慢慢排查。
结果给暂停探测任务的接口发请求好久也没有响应,这时候我才知道没这么简单。
解决
内存泄漏
于是赶快登陆探测服务器,首先是 top free df
三连,结果还真发现了些异常。
我们的探测进程 CPU 占用率特别高,达到了 900%。另外,JVM 系列面试题和答案全部整理好了,微信搜索Java技术栈,在后台发送:面试,可以在线阅读。
我们的 Java 进程,并不做大量 CPU 运算,正常情况下,CPU 应该在 100~200% 之间,出现这种 CPU 飙升的情况,要么走到了死循环,要么就是在做大量的 GC。
使用 jstat -gc pid [interval]
命令查看了 java 进程的 GC 状态,果然,FULL GC 达到了每秒一次。
这么多的 FULL GC,应该是内存泄漏没跑了,于是 使用 jstack pid > jstack.log
保存了线程栈的现场,使用 jmap -dump:format=b,file=heap.log pid
保存了堆现场,然后重启了探测服务,报警邮件终于停止了。
jstat
jstat 是一个非常强大的 JVM 监控工具,一般用法是: jstat [-options] pid interval
它支持的查看项有:
- -class 查看类加载信息
- -compile 编译统计信息
- -gc 垃圾回收信息
- -gcXXX 各区域 GC 的详细信息 如 -gcold
使用它,对定位 JVM 的内存问题很有帮助。
排查
问题虽然解决了,但为了防止它再次发生,还是要把根源揪出来。
分析栈
栈的分析很简单,看一下线程数是不是过多,多数栈都在干嘛。
> grep "java.lang.Thread.State" jstack.log | wc -l> 464
才四百多线程,并无异常。
> grep -A 1 "java.lang.Thread.State" jstack.log | grep -v "java.lang.Thread.State" | sort | uniq -c |sort -n 10 at java.lang.Class.forName0(Native Method) 10 at java.lang.Object.wait(Native Method) 16 at java.lang.ClassLoader.loadClass(ClassLoader.java:404) 44 at sun.nio.ch.EPollArrayWrapper.epollWait(Native Method) 344 at sun.misc.Unsafe.park(Native Method)
线程状态好像也无异常,接下来分析堆文件。
下载堆 dump 文件
堆文件都是一些二进制数据,在命令行查看非常麻烦,Java 为我们提供的工具都是可视化的,Linux 服务器上又没法查看,那么首先要把文件下载到本地。
由于我们设置的堆内存为 4G,所以 dump 出来的堆文件也很大,下载它确实非常费事,不过我们可以先对它进行一次压缩。
gzip
是个功能很强大的压缩命令,特别是我们可以设置 -1 ~ -9
来指定它的压缩级别,数据越大压缩比率越大,耗时也就越长,推荐使用 -6~7, -9 实在是太慢了,且收益不大,有这个压缩的时间,多出来的文件也下载好了。
使用 MAT 分析 jvm heap
MAT 是分析 Java 堆内存的利器,使用它打开我们的堆文件(将文件后缀改为 .hprof
), 它会提示我们要分析的种类,对于这次分析,果断选择 memory leak suspect
。
从上面的饼图中可以看出,绝大多数堆内存都被同一个内存占用了,再查看堆内存详情,向上层追溯,很快就发现了罪魁祸首。
分析代码
找到内存泄漏的对象了,在项目里全局搜索对象名,它是一个 Bean 对象,然后定位到它的一个类型为 Map 的属性。
这个 Map 根据类型用 ArrayList 存储了每次探测接口响应的结果,每次探测完都塞到 ArrayList 里去分析,由于 Bean 对象不会被回收,这个属性又没有清除逻辑,所以在服务十来天没有上线重启的情况下,这个 Map 越来越大,直至将内存占满。
内存满了之后,无法再给 HTTP 响应结果分配内存了,所以一直卡在 readLine 那。而我们那个大量 I/O 的接口报警次数特别多,估计跟响应太大需要更多内存有关。
给代码 owner 提了 PR,问题圆满解决。
小结
其实还是要反省一下自己的,一开始报警邮件里还有这样的线程栈:
groovy.json.internal.JsonParserCharArray.decodeValueInternal(JsonParserCharArray.java:166)groovy.json.internal.JsonParserCharArray.decodeJsonObject(JsonParserCharArray.java:132)groovy.json.internal.JsonParserCharArray.decodeValueInternal(JsonParserCharArray.java:186)groovy.json.internal.JsonParserCharArray.decodeJsonObject(JsonParserCharArray.java:132)groovy.json.internal.JsonParserCharArray.decodeValueInternal(JsonParserCharArray.java:186)
看到这种报错线程栈却没有细想,要知道 TCP 是能保证消息完整性的,况且消息没有接收完也不会把值赋给变量,这种很明显的是内部错误,如果留意后细查是能提前查出问题所在的,查问题真是差了哪一环都不行啊。
近期热文推荐:
1.1,000+ 道 Java面试题及答案整理(2022最新版)
2.劲爆!Java 协程要来了。。。
3.Spring Boot 2.x 教程,太全了!
4.别再写满屏的爆爆爆炸类了,试试装饰器模式,这才是优雅的方式!!
5.《Java开发手册(嵩山版)》最新发布,速速下载!
觉得不错,别忘了随手点赞+转发哦!
-
天天短讯!排查+解决 Java 内存泄漏,最基本的方法,你必须学会!
来源:zhenbianshu github io 前些日子小组内安排值班,轮流看顾我们的服务,主要做一些报警邮件处理...
来源: -
环球热推荐:看这篇就够了丨基于Calcite框架的SQL语法扩展探索
Calcite在大数据系统中有着广泛的运用,比如ApacheFlink,ApacheDrill等都大量使用了Calcite,理解Calcite...
来源: -
04-Sed操作参数
1Sed操作参数1 1s--替换s表示替换(substitute)文件内的字符串。[address1],[address2]s pattern replacement [flag] s
来源: 天天短讯!排查+解决 Java 内存泄漏,最基本的方法,你必须学会!
环球热推荐:看这篇就够了丨基于Calcite框架的SQL语法扩展探索
今日讯!都想来分一杯羹,低代码到底服务谁?
04-Sed操作参数
看点:799元 ROG龙鳞ACE Aimlab鼠标上市:仅重54g
2030年前我国将送人上月球 新一代载人火箭三级发动机点火成功
天天快讯:《王者荣耀》兔年限定皮肤英雄公布:马克、瑶妹喜提新装
【报资讯】1300多种首次公开!中国空间站居然种了这么多“菜”
中国第一商贩:“傻子瓜子”创始人年广九逝世 享年84岁
全球速递!【Python爬虫实战项目】Python爬虫批量下载去哪儿网站旅游数据保存本地
世界热门:辛苦加班了一年,为何年终奖比同级同事少?
天天视点!Nginx 高级篇
天天热推荐:python中argparse模块的用法
【天天快播报】使用python自动发送图片给微信好友
焦点日报:美国上万架航班停飞!初步调查:因一个数据库文件损坏
环球观察:小米13 Pro用上安卓最高端屏幕 雷军:价格最贵
4000吨巨型“充电宝”广东下水:每天可发2.4万度电
每日信息:高德地图上线一键报平安功能 路程家人一看便知
天天最资讯丨2022年新生儿爆款名字出炉上热搜:男/女孩这些名字土爆了?
环球热文:【验证码逆向专栏】某验二代滑块验证码逆向分析
开源动物行为分析实验箱(斯金纳箱)特色解析及试用条款
环球信息:爱奇艺APP投屏加钱 上海消保委点名批评:不合理、不厚道
特斯拉降价效果显著!友商会不会跟进降价?
焦点消息!阿凡达2不适合国人?国产科幻大片《流浪地球2》迎战 还有《满江红》等一次看爽
12306出现故障无法查车次 客服回应:网络问题 建议多次刷新
环球焦点!羡慕吗?微软宣布给员工“无限休假”福利:不再固定天数
C#、TS和Dart对比4.1:类型概述
全球速递!虚拟串口及其在串口转以太网中的应用
别催了,别催了,这篇文章我一次性把Shell的内容说完
环球观点:AMD RDNA3显卡架构底层细节公开!606页 应有尽有
前沿资讯!微信隐藏功能无了!群空间助手小程序宣布3月下线:号称永久保存
世界滚动:腾讯优酷后!爱奇艺限制投屏 会员只能看480P:专家发声 用户只能接受
环球快看点丨SUV比亚迪卖爆!榜一大哥月销7万+、一代神车没落
《黑豹2》女主演利蒂西娅·赖特:续集已在计划中
头条:疑似零跑C11路边停车起火 车尾疯狂往外喷火
男子开豪车带马狗羊回家过年 它们都是自己的家人:画面让网友难受
公交司机边开车边抠脚引乘客担忧 官方回应:会研究处理
焦点短讯!这些是最热门的机器学习方法!
【播资讯】通过事件总线EventBus/AsyncEventBus进行JAVA模块解耦 (史上最全)
内存、SSD价格雪崩 韩国芯片双雄终于顶不住了?
又一日系品牌拥抱比亚迪 铃木EVX概念车首发:用上刀片电池
全球视点!美国最大私人地主 大量买地引质疑!比尔盖茨回应:只为提高产量
国产家轿又一“黑马”诞生 长安逸达首发亮相
原长城汽车总裁王凤英将出任小鹏CEO 接替何小鹏?内部回应
围棋哪个国家最强?围棋哪个颜色先下?
都挺好苏明成知道自己不是亲生的是第几集?都挺好的结局是什么?
魂来枫林青的下一句是什么?魂来枫林青是什么意思?
李宁标志刺绣是真的吗?李宁标志设计含义
美的净水器好不好?净水器哪个牌子质量好性价比高?
ios7输入法怎么设置成搜狗?ios7输入法打不出汉字怎么办?
怎么修改系统启动项?修改系统启动项的方法有哪些?
新资讯:MySQL间隙锁、行锁的读写阻塞实验
win8如何找到硬件驱动程序?win8怎么进入安全模式?
港利通手机怎么样?港利通手机怎么恢复出厂设置密码?
当前播报:推特广告收入下跌严重:考虑出售15亿用户名创收
今日看点:春节正常发货:仁和N95灭菌级口罩25片15.9元发车
【全球独家】跟上Windows本步伐!苹果正开发触摸屏Mac笔记本:最早2025年发布
秒变战神!杰士邦延时避孕套大促:立减200元 不到20到手
全球新动态:文件出台!车险价格最高可再降23% 开车越稳越便宜
天天报道:TapTap 算法平台的 Serverless 探索之路
我用AI去讨债:一顿操作猛如虎 3000要回350
环球观察:不止投屏缩水 爱奇艺蓝光码率仅蓝光碟1/13 1080P也糊
4999元限量发售!雷军:小米13定制色水泥灰卖的最好
焦点关注:育碧《怒海战记》再度延期
网速比5G提升100倍 2023年我国将全面推进6G技术研发
环球热议:读编程与类型系统笔记05_函数类型
天天资讯:关于 Serverless 应用架构对企业价值的一些思考
焦点热文:男子高速撞鸟 鸟腿成三叉戟立标 丰田秒变“玛莎拉蒂”
世界关注:解除屏蔽!微信已可正常跳转抖音链接
环球最资讯丨造车新势力第一 广汽埃安宣布将涨价:最高涨6000元
全球今亮点!称雷军是导师、大哥 何小鹏:但不想成为他 太累了
每日热文:郭明錤:iPhone 15 Pro将搭载“固态按键” 取消实体键
【播资讯】东北夫妻去三亚 为省8千机票开电车3600公里 充11次电 比油便宜
新资讯:9499元割韭菜!厂商喷RTX 4080太贵 惹怒NV后帖子删除:用户叫好
短讯!24岁湖北小伙搭17个顺风车到格鲁吉亚求婚引羡慕:女子同意 结婚不要彩礼
全球速递!美国航空局系统故障 致全美航班停飞:已有8609架次延误 1251架次取消
每日快看:失灵事故再现?特斯拉刹车又出问题:八车连环相撞!这次不一样
【全球新视野】洛谷P1040. 加分二叉树
C#、TS和Dart对比2:变量和作用域
电脑故障影响数千架次航班!全美航班停飞限制取消
灵动岛只是过渡品!iPhone 16或配备屏下Face ID
当前要闻:小米将参加MWC2013:不会发布小米13 Ultra
弄疯了无数人的游戏:差点让我砸掉显示器!
焦点消息!登录、投屏处处受限!视频平台被指吃相难看 你还开会员吗?
网址导航
全球看点:P2448 无尽的生命
[概率论与数理统计]笔记:3.3 随机向量的函数的分布与数学期望
世界新资讯:React核心概念与JSX
热消息:伊利回应30支冰糕分30箱发货 被网友吐槽太浪费:订单推送失误造成
全球热点!网友拿到了一加11:真的跟老板说的一样巨流畅
mac下php环境搭建
天天快讯:MQ——如何保证消息不会丢失
144MB缓存游戏神U!AMD锐龙7000X3D定档:情人节大礼
【当前热闻】美国所有航班都已停飞 电脑系统竟突发故障:官方给出恢复时间
速看:偶数位(熟悉二进制)
当前信息:Mysql页分裂
焦点关注:日系首款电动B级轿车!本田雅阁插混版来了:可挂绿牌
广州一宝马SUV冲撞人群 官方通报:已致5死13伤 司机被控制
环球即时:太阳4天内发出两次X级耀斑:几天后指向地球、或引强烈地磁暴
世界视点!02-Sed语法介绍