第一次排查 Java 内存泄漏,别人觉得惊险为什么我觉得脸红害羞呢

今天前端一直在群里说,服务是不是又挂了?一直返回 503。我一听这不对劲,赶紧看了一眼 K8S 的 pod 状态,居然重启了4次。测试环境只有一个副本,所以赶紧把副本数给上调到了3个。

堵住前端的嘴,免得破坏我在老板心目中的形象,我害怕下次加薪名单没有我,而优化名单有我。

image.png

暂时安抚好前端之后我得立马看看哪里出问题了,先看看 K8S 为什么让这个容器领盒饭了。

Last State: Terminated 
Reason: OOMKilled

看起来是 JVM 胃口太大,被 K8S 嫌弃从而被赶走了。看看最近谁提交部署了,把人拉过来拷问一番。

代码摆出来分析,发现这小子每次使用http调用都会 new 一个连接池对象。一次业务请求使用了 6 次 http 调用,也就是会 new 6 个连接池对象。有可能是这里的问题,抓紧改了发上去测试看看。

image.png

不出意外的话又出意外了,上去之后也没缓解,那就不是这个问题了。要找到具体的原因还是不能瞎猜,得有专业的工具来进行分析才行。之前为了省点镜像空间,所以使用了 jre 的基础镜像。

image.png

总所周知,jre 只有一个运行环境,是没有开发工具的。所以我们得使用 jdk。你说我为省那点空间干什么?都想抽自己了。我们应该以 "让打靶老板花钱"为荣,以 "为打靶老板省钱"为耻。

image.png

把JDK准备好之后,就要开始我的第一次了。开始之前总是需要洗白白的,把一些影响心情的东西全部处理掉,就像这个 Skywalking,之前一直跟着我。但现在影响到我了,我得暂时把它放一边。不然他会在进行的过程中一直蹦出来烦人。

使用 Skywalking 需要设置此环境变量,每一次执行Java相关的命令都会执行 Skywalking 的一些操作,可以使用 unset 命令把环境变量临时置空。因为等我做完还是需要他来继续给我工作的。

unset JAVA_TOOL_OPTIONS

image.png

琐碎事处理完了之后,就得挑个技师才行。这行命令一把梭就会打印出所有 java 进程信息,这主要是为了获取到 vmid,也就是技师的编号。

jps -lv
root@xxx-ext-6464577d8-vvz2n:/app# jps -lv
608 sun.tools.jps.Jps -Denv.class.path=.:/usr/local/java/lib/rt.jar:/usr/local/java/lib/dt.jar:/usr/local/java/lib/tools.jar -Dapplication.home=/usr/local/openjdk-8 -Xms8m
7 /root/app/xxx-ext.jar -javaagent:/skywalking/agent/skywalking-agent.jar -Dfile.encoding=UTF-8 -Xms1024m -Xmx2048m
568 sun.tools.jstat.Jstat -javaagent:/skywalking/agent/skywalking-agent.jar -Denv.class.path=.:/usr/local/java/lib/rt.jar:/usr/local/java/lib/dt.jar:/usr/local/java/lib/tools.jar -Dapplication.home=/usr/local/openjdk-8 -Xms8m

这里总共查到3个Java进程,608 jps7 xxx-ext568 jstat。中间这个 7 号技师 xxx-ext 就是我相中的,我将会把第一次交给他。

image.png

选完技师就正式开始了,过程中要时刻关心对方的身体状态。隔几秒钟就问一下状态怎么样?为了方便时刻了解对方的身体状态,可以用这个命令每隔5s就问一下。如果你对自己的能力有信心可以把间隔设置短一些。

# jstat -gcutil {vmid} {间隔毫秒}
jstat -gcutil 7 5000
root@xxx-ext-6464577d8-vvz2n:/app# jstat -gcutil 7 5000
  S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT     GCT
 99.96   0.00 100.00 100.00  95.85  94.74    178    8.047     8    3.966   12.012
 99.97   0.00 100.00 100.00  95.50  94.33    178    8.047    11    8.072   16.118
 99.99   0.00 100.00 100.00  95.51  94.33    178    8.047    14   12.408   20.455
100.00   0.00 100.00 100.00  95.48  94.30    178    8.047    18   17.140   25.187
100.00   0.00 100.00 100.00  95.48  94.30    178    8.047    23   22.730   30.776
100.00   0.00 100.00 100.00  95.48  94.30    178    8.047    27   27.035   35.082
100.00   0.00 100.00 100.00  95.49  94.30    178    8.047    32   32.614   40.661

虽然是第一次,但对方给回来的信息务必要了然于胸。知己知彼胜券在握,所以要把下面的心法记住。这会影响我们下一步的动作。

S0/S1 是Survivor区空间使用率
E 是新生代空间使用率
O 是老年代空间使用率
YGC 是 Young GC 次数
YGCT 是 Young GC 总耗时
FGC 是 Full GC 次数
FGCT 是 Full GC 总耗时

当对方的状态到达一个关键点的时候,一般是老年代满,或者是新生代满,这就表示对方快溢出来了。像我提供的这个示例,E 和 O 的使用率都是100,就说明对方不仅满了,还快噶了。我们得赶紧把这个关键时刻详细探究一下,看看是哪个对象让对方感觉到满的。

image.png

用这个命令查询对方体内对象占用排名,不用贪多,前10个就绰绰有余了。你能把前10个全部弄清楚就够牛了。

jmap -histo:live 7 | head -n 10
root@xxx-ext-6464577d8-vvz2n:/app# jmap -histo:live 7 | head -n 10

 num     #instances         #bytes  class name
----------------------------------------------
   1:        454962     1852234368  [C
   2:       1773671       56757472  java.util.HashMap$Node
   3:        881987       30188352  [B
   4:         55036       19781352  [Ljava.util.HashMap$Node;
   5:        857235       13715760  java.lang.Integer
   6:        852094       13633504  com.knuddels.jtokkit.ByteArrayWrapper
   7:        454195       10900680  java.lang.String
   8:        104386        6436624  [Ljava.lang.Object;
   9:        191593        6130976  java.util.concurrent.ConcurrentHashMap$Node
  10:         63278        5568464  java.lang.reflect.Method

可以看到对方已经在边缘了,我们要抓紧分析了。我提供的这个示例,排名前三分别是 [Cjava.util.HashMap$Node[B[C 表示字符数组,[B 表示字节数组。看来对方偏爱 [C,占用差不多1.7G,需要重点分析它。

这一步就到了十字路口,关键点在于我们能不能从这里分析得到对方偏爱的对象,从而定位到代码中的问题点。一旦我们定位到代码中的问题点,那就证明对方已经被我们拿捏了,流程结束。

那就开始分析吧,先看看最近哪个瘪犊子提交了代码,把他拉过来。然后看最近改动的代码哪里和 [C 相关,一般是 List<String>StringBuffer 这类对象。

image.png

我没想到小丑竟是我自己🤡,有一个接口入参是一个 List<ID>,当这个 list 传了空的时候,就会把库里的所有数据都查出来。

破案了,这次把对方完全拿捏了,流程结束。

image.png

如果上一步无法拿捏,那就不要讲武德了。把对方的一举一动dump下来,最终导出成堆快照来分析。

dump 时间取决于数据量

jmap -dump:live,format=b,file=heap.hprof 7
root@xxx-ext-6464577d8-vvz2n:/app# jmap -dump:live,format=b,file=heap.hprof 7
Dumping heap to /app/heap.hprof ...
Heap dump file created

将dump文件从pod中复制出来

kubectl cp <ns>/<pod>:/app/heap.hprof ./heap.hprof
kubectl cp test/xxx-ext-6464577d8-vvz2n:/app/heap.hprof ./heap.hprof

我摊牌了,这一步我压根没做。

image.png

当我想从pod中把对快照复制出来的时候磁盘空间不够,然后pod就被 K8S 这个暴脾气干了,只剩下我颤抖的手无力地放在键盘上。

Ref

https://juejin.cn/post/7006229454523482126

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/892903.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【C语言】一维数组应用Fibonacci数列

Fibonacci数&#xff08;斐波那契数列&#xff09; 前两项为1&#xff0c;从第三项开始&#xff0c;每一项为前两项的和。可以知道连续三项的关系&#xff1a;f[i]f[i-1]f[i-2] 使用数组进行存储&#xff0c;十分方便。可以知道前n项的fibonacci数。 #include <stdio.h>…

数据治理(2)-数据标准

前言 在建模前规划制定数据标准&#xff0c;或在建模使用过程中根据业务情况沉淀企业业务的数据标准。通过规范约束标准代码、度量单位、字段标准、命名词典&#xff0c;来保障数据处理的一致性&#xff0c;从源头上保障数据的标准化生产&#xff0c;节约后续数据应用和处理的…

什么是 C/2023 A3(紫金山-阿特拉斯)彗星?让我们用 Python 来绘制它的路径

彗星的基本概念 彗星&#xff08;Comet&#xff09;&#xff0c;是指进入太阳系内亮度和形状会随日距变化而变化的绕日运动的天体&#xff0c;呈云雾状的独特外貌&#xff0c;也是中国神话传说的扫帚星&#xff08;星官名&#xff09;。彗星分为彗核、彗发、彗尾三部分。彗核由…

一起体验AI动手实验,OceanBase 2024 年度发布会精彩预告

2024年OceanBase年度发布会将于10月23日在北京望京凯悦酒店举行。此次大会围绕“不止于记录”的主题&#xff0c;共同探讨当前数据库领域的前沿话题&#xff0c;包含主论坛、分论坛、AI 动手实训营、开源技术交流会等多个环节&#xff0c;诚邀全国各地的企业和开发者共同参与&a…

一个月学会Java 第18天 容器与泛型(有容器的原码解读)

Day18 容器与泛型 我们来简单讲讲容器是什么&#xff0c;顾名思义&#xff0c;是存东西的器皿&#xff0c;就叫做容器&#xff0c;那在我们计算机中需要存的是什么呢&#xff0c;是不是就是数据啊&#xff0c;所以我们的java是有提供一系列数据容器的&#xff0c;容器我们也叫做…

Redis:分布式 - 集群

Redis&#xff1a;分布式 - 集群 集群数据分片哈希求余一致性哈希算法哈希槽分区算法 Docker搭建集群集群操作重定向故障转移集群扩容 集群 在主从复制与哨兵模式中&#xff0c;数据库的数据对于每一台主机来说&#xff0c;都是全量保存的。这就会导致&#xff0c;就算引入再多…

Unity网络开发基础 —— 实践小项目

概述 接Unity网络开发基础 导入基础知识中的代码 需求分析 手动写Handler类 手动书写消息池 using GamePlayer; using System; using System.Collections; using System.Collections.Generic; using UnityEngine;/// <summary> /// 消息池中 主要是用于 注册 ID和消息类…

ps提示不能使用移动工具,因为目标通道被隐藏的解决办法

解决&#xff1a;按F7&#xff0c;或者从窗口把图层打开 按图示找到快速蒙版图层。它可能被隐藏或以特殊图标显示。右键删除或者拖到右下角垃圾桶里

岩石分类检测数据集 4700张 岩石检测 带标注 voc yolo 9类

岩石分类检测数据集 4700张 岩石检测 带标注 voc yolo 9类 岩石分类检测数据集 (Rock Classification and Detection Dataset) 描述: 本数据集旨在支持对不同类型的岩石进行自动分类和检测&#xff0c;特别适用于地质勘探、矿物识别、环境监测等领域。通过使用该数据集训练的模…

智慧云党建”主题网站设计与实现(源码+定制+开发)

博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、InfoQ等平台…

5G NR UE初始接入信令流程

文章目录 5G NR UE初始接入信令流程 5G NR UE初始接入信令流程 用户设备向gNB-DU发送RRCSetupRequest消息。gNB-DU 包含 RRC 消息&#xff0c;如果 UE 被接纳&#xff0c;则在 INITIAL UL RRC MESSAGE TRANSFER 消息中包括为 UE 分配的低层配置&#xff0c;并将其传输到 gNB-CU…

Sounding Reference Signal (SRS)

文章目录 探测参考信号&#xff08;SRS&#xff09;Sounding Reference Signals 探测参考信号的生成基序列 探测参考信号&#xff08;SRS&#xff09; 探测参考信号&#xff08;SRS&#xff09;在上行链路中传输&#xff0c;使网络能够估计不同频率下的信道质量。 Sounding R…

2024双十一值得购买的好物有哪些?看完这五款好物让你不后悔!

随着一年一度的双十一购物狂欢节即将拉开帷幕&#xff0c;作为一名热衷于分享购物心得的博主&#xff0c;我今天特别想在这里为大家详细介绍五款我个人非常期待入手的好物。这些产品都是经过我精心挑选和试用的&#xff0c;我相信它们不仅能够满足我的需求&#xff0c;同样也能…

使用HTML和CSS实现3D波浪动画效果

使用HTML和CSS实现3D波浪动画效果 在本篇博客中&#xff0c;将详细介绍如何使用HTML与CSS创建一个3D波浪动画效果。这个效果不仅能够在网页中创建立体感强的视觉体验&#xff0c;还能够通过悬停和聚焦实现与用户的交互。我们将逐步解析代码中的每个部分&#xff0c;帮助你掌握…

Stm32+Esp8266连接阿里云程序移植教程(MQTT协议)

Stm32Esp8266连接阿里云程序移植教程&#xff08;MQTT协议&#xff09; 一、前期准备二、移植过程三、程序的使用3.1 连接上阿里云3.2 传输用户数据到阿里云3.3 解析从阿里云下发给用户的数据3.4 关于调试接口 一、前期准备 自己要的工程文件移植所需的文件&#xff08;如下图&…

[ACTF2020] 新生赛]Exec1

目录 0x01命令执行 [ACTF2020 新生赛]Exec1 1、解法1 2、解法2 3、总结 3.1php命令注入函数 3.2java命令注入函数 3.3常见管道符 0x02SQL注入 [极客大挑战 2019]EasySQL1 0x01命令执行 [ACTF2020 新生赛]Exec1 1、解法1 ping本地&#xff0c;有回显&#xff0c;TTL…

数据分析Python for Data专业书籍pdf

随着大数据时代的到来&#xff0c;数据分析已成为企业决策、科学研究以及日常生活中不可或缺的一部分。对于想要学习数据分析的人来说&#xff0c;Python 是最理想的编程语言之一。其简洁的语法、强大的库以及丰富的社区支持&#xff0c;使得 Python 成为数据分析的首选工具。本…

隐蔽的并发错误

欢迎关注公众号 【11来了】 &#xff0c;持续 中间件源码、系统设计、面试进阶相关内容 在我后台回复 「资料」 可领取 编程高频电子书&#xff01; 在我后台回复「面试」可领取 30w 字的硬核面试笔记&#xff01; 感谢你的关注&#xff01; 隐蔽的 synchronized 并发错误 在使…

基于SpringBoot+Vue+Uniapp汽车保养系统小程序的设计与实现

详细视频演示 请联系我获取更详细的演示视频 项目运行截图 技术框架 后端采用SpringBoot框架 Spring Boot 是一个用于快速开发基于 Spring 框架的应用程序的开源框架。它采用约定大于配置的理念&#xff0c;提供了一套默认的配置&#xff0c;让开发者可以更专注于业务逻辑而…

PROFINET转SSI协议模块快速使用说明

Profinet网关PROFINET转SSI协议 PN4SSI模块快速使用说明 * 应用时PNSSI模块时&#xff0c;拨码全部拨到OFF。 (1) 在博途中新建一个项目&#xff0c;通过“选项”——“管理通用站描述文件”添加模块的GSD文件。 选择GSD文件所在的目录&#xff0c;点击安装&#xff1a; (…