实战分享:生产Java服务容器占用内存高问题排查与解决

news2024/12/26 8:27:57

总框架

在这里插入图片描述

一、问题描述

生产上有一个Java应用,在发版后一周内,容器内存指标缓慢上升,最终超过60%触发内存使用告警
在这里插入图片描述

二、思路&解决方案

1、日志占用容器内存

(1)排查JVM占用了多少内存

一般我们惯性思维默认是JVM占用内存,但是通过监控发现,容器申请内存16G,JVM才占用了4G不到,占25%
在这里插入图片描述
分析可能是容器除Java进程外的模块占用了内存

(2)容器内存的组成

在这里插入图片描述

从上图可以看出:

容器内存=进程实际内存+页面缓存+kernel memory+不活跃缓存页

(3)Linux内核-页高速缓存

什么是页高速缓存?

在linux读写文件时,它用于缓存文件的逻辑内容,从而加快对磁盘上映像和数据的访问,所以通过page cache可以有效减少 I/O,提升应用的 I/O 速度,可通过/proc/meminfo、free 、/proc/vmstat等手段来监测

从读写文件这个场景可以推断出,可能是日志文件的读写占用了大量内存。查看了一下应用输出的日志大小,发现日志占用了5G左右,实锤

(4)解决方案

①导出容器本地日志文件,看下日志的组成,排查频率高且冗长、非必要的日志,修改代码取消日志的打印

②查看应用里配置的日志保存时间,可以根据需要调整短一些
在这里插入图片描述

③临时方案,手动去清除日志文件,可以发现内存马上有明显的下降

2、JVM占用容器内存

(1)常用的排查分析命令

#查看CPU占用高的Java线程
top -Hp pid
在这里插入图片描述

#查看占用内存最大的类(前30个)
jmap -histo pid | head -30
在这里插入图片描述

#查看gc统计
jstat -gc pid
在这里插入图片描述
说明:
S0C:第一个幸存区的大小
S1C:第二个幸存区的大小
S0U:第一个幸存区的使用大小
S1U:第二个幸存区的使用大小
EC:伊甸园区的大小
EU:伊甸园区的使用大小
OC:老年代大小
OU:老年代使用大小
MC:方法区大小
MU:方法区使用大小
CCSC:压缩类空间大小
CCSU:压缩类空间使用大小
YGC:年轻代垃圾回收次数
YGCT:年轻代垃圾回收消耗时间
FGC:老年代垃圾回收次数
FGCT:老年代垃圾回收消耗时间
GCT:垃圾回收消耗总时间

#查看实时GC情况(每隔1秒打印一次gc统计信息)
jstat -gcutil pid 1000
在这里插入图片描述
#查看堆信息
jmap -heap pid
在这里插入图片描述

(2)导出内存快照和线程栈信息

①导出内存快照
jmap -dump:format=b,file=xxx.hprof pid

遇到问题:

此命令会触发容器重启,导致无法获取

分析:

开始以为是导出操作占用了容器大量内存,超出限制导致的重启

于是限制了导出使用的内存为2G

jmap -dump:format=b,file=xxx.hprof -J-Xmx2g pid

发现还是会重启

于是找到了容器基础运维的人,分析可能是健康检查导致的:

应用停顿无法响应请求,触发了健康检查的失败阈值

解决方案:

把容器健康检查的阈值适当调宽松,主要是检查间隔要久一些,保证stop the world期间不会触发健康检查

②打印线程当前(当前指的是执行命令的时刻)堆栈信息

jstack -l pid >> xxx.txt

(3)分析内存快照

①将内存快照复制到本地

②准备内存分析工具MAT(需要JDK17以上环境,可以问我拿MAT和JDK的安装包)

改下配置,调大使用的内存
在这里插入图片描述
在这里插入图片描述

③使用MAT分析刚刚下载的快照

在这里插入图片描述
在这里插入图片描述

可以看出是阿里巴巴druid的一个类,占用了91%的内存

查询发现这是druid的监控模块的一个缺陷,https://blog.csdn.net/lypeng13/article/details/121911981

druid开启stat监控,所以sql信息就会存储到该Map中,占用内存,造成内存泄漏

解决方案:

直接关闭druid的stat

spring.datasource.druid.filter.stat=false

(4)分析栈信息

①通过top -Hp pid命令拿到消耗CPU/内存的线程
在这里插入图片描述

②将对应线程号切换为16进制:printf “%x\n” pid

31680 >> 7bc0 ; 31191 >> 79d7; 31295 >> 7a3f

③从栈信息里查找16进制的线程号,定位到代码
在这里插入图片描述

分析栈信息需重点留意线程的状态

public enum State {
 
        /**
         * Thread state for a thread which has not yet started.
         * 线程创建后尚未启动的线程处于这种状态
         */
        NEW,
 
        /**
         * Thread state for a runnable thread.  A thread in the runnable
         * Runable包括了操作系统线程状态中的Running和Ready, 也就是处于此
状态的线程有可能正在执行, 也有可能正在等待着CPU为它分配执行时间
         */
        RUNNABLE,
 
        /**
         * Thread state for a thread blocked waiting for a monitor lock.
         * 线程被阻塞了, “阻塞状态”与“等待状态”的区别是: “阻塞状态”在等
待着获取到一个排他锁, 这个事件将在另外一个线程放弃这个锁的时候发生; 而“等待状
态”则是在等待一段时间, 或者唤醒动作的发生。 在程序等待进入同步区域的时候, 线程将
进入这种状态。
         */
        BLOCKED,
 
        /**
         * Thread state for a waiting thread.
         * 无限期等待状态,处于这种状态的线程不会被分配CPU执行时间,它们要等待被
其他线程显式地唤醒
         */
        WAITING,
 
        /**
         * Thread state for a waiting thread with a specified waiting time.
         * 线程等待被唤醒,处于这种状态的线程也不会被分配CPU执行时间, 不过无
须等待被其他线程显式地唤醒, 在一定时间之后它们会由系统自动唤醒
         */
        TIMED_WAITING,
 
        /**
         * Thread state for a terminated thread.
         * 线程已经执行结束
         */
        TERMINATED;
    }

三、经验心得

这个内存问题一直都存在,但是之前因为dump不出来快照一直拖着,真正去解决的时候发现,其实并不算困难

  • 善于利用身边的资源,找专业的人咨询是个好办法
  • 有时候困难只是我们自己想象出来的,去干就完事了
  • 对技术保持敬畏以及好奇心,只会用不懂原理的话,很容易出问题

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

OpenAI叩响AGI之门: 12天直播精华大放送

01.OpenAI新篇章: 12天直播精华放送 当地时间12月5日-20日,人工智能巨头OpenAI完成了连续12个工作日的12场直播,虽然周末短暂休息了两天,但圣诞节的技术盛宴依然引发了广泛关注。内容密集、干货充足,许多小伙伴们可能感到信息有点…

神经网络-AlexNet

AlexNet是在2012年的ImageNet竞赛后,整理发表的文章,也是对CNN网络的衍生。 网络结构 AlexNet网络结构如下图所示,网络分为了上下两部分,对应两个不同的GPU训练,可以更好的利用GPU算力。只有在特殊的网络层后&#x…

【Beats01】企业级日志分析系统ELK之Metricbeat与Heartbeat 监控

Beats 收集数据 Beats 是一个免费且开放的平台,集合了多种单一用途数据采集器。它们从成百上千或成千上万台机器 和系统向 Logstash 或 Elasticsearch 发送数据。 虽然利用 logstash 就可以收集日志,功能强大,但由于 Logtash 是基于Java实现…

目标检测——基于yolov8和pyqt的螺栓松动检测系统

目录 1.项目克隆和环境配置1.1 我这里使用的是v8.0.6版本1.2 项目代码结构介绍 2.数据集介绍2.1 数据集采集2.2采集结果介绍 3.模型训练4.pyqt界面设计4.1 界面内容介绍4.2 界面实现 5.操作中的逻辑实现5.1 图片检测5.2 文件夹检测5.3 视频检测和摄像头检测 6. 效果展示 1.项目…

云边端架构的优势是什么?面临哪些挑战?

一、云边端架构的优势 降低网络延迟:在传统集中式架构中,数据需传输到云计算中心处理,导致网络延迟较高。而云边端架构将计算和存储推向边缘设备,可在离用户更近的地方处理数据,大大降低了网络延迟,提升了用…

微机接口课设——基于Proteus和8086的打地鼠设计(8255、8253、8259)

原理图设计 汇编代码 ; I/O 端口地址定义 IOY0 EQU 0600H IOY1 EQU 0640H IOY2 EQU 0680HMY8255_A EQU IOY000H*2 ; 8255 A 口端口地址 MY8255_B EQU IOY001H*2 ; 8255 B 口端口地址 MY8255_C EQU IOY002H*2 ; 8255 C 口端口地址 MY8255_MODE EQU IOY003H*2 ; …

Origin教程008:Origin绘制热图

文章目录 练习数据热图练习数据 https://download.csdn.net/download/WwLK123/90185283热图 使用拖拽的方式导入数据: 然后【单击】全选数据: 然后选择【绘图】->【等高线图】->【带标签热图】: 然后勾选【Y数据跨列】: 点击【确定

LabVIEW数字式气压计自动检定系统

开发了一个基于LabVIEW开发的数字式气压计自动检定系统。在自动化检定PTB220和PTB210系列数字气压计,通过优化硬件组成和软件设计,实现高效率和高准确度的检定工作,有效降低人力成本并提升操作准确性。 项目背景 随着自动气象站的广泛部署&a…

阿里云镜像服务使用指南

阿里云容器镜像服务ACR(Alibaba Cloud Container Registry)是面向容器镜像、Helm Chart等符合OCI标准云原生制品安全托管及高效分发平台。ACR企业版支持全球同步加速、大规模和大镜像分发加速、多代码源构建加速等全链路加速能力,与容器服务A…

【Ambari】使用 Knox 进行 LDAP 身份认证

目录 一、knox介绍 二、Ambari配置LDAP认证 三、验证Knox网关 3.1YARNUI 3.2 HDFSUI 3.3 HDFS RestFULL 3.4 SparkHistoryserver 3.5 HBASEUI 一、knox介绍 Apache Knox网关是一个用于与Apache Hadoop部署的REST api和ui交互的应用程序网关。Knox网关为所有与Apache Ha…

Fiddler v5.0.2最新专业网络抓包工具简体中文版

前言 Fiddler抓包工具一个非常专业且已经翻译成中文的网络调试帮手。它就像一个超级监视器,能帮你看到电脑和互联网之间所有通过HTTP协议传输的信息。比如,当你在网上冲浪时,它可以记录下你和网站之间交换的所有“小纸条”,比如网…

我的 2024 年终总结

2024 年,我离开了待了两年的互联网公司,来到了一家聚焦教育机器人和激光切割机的公司,没错,是一家硬件公司,从未接触过的领域,但这还不是我今年最重要的里程碑事件 5 月份的时候,正式提出了离职…

汽车网络安全渗透测试

产品和企业IT的融合引发了新的网络安全风险,从功能安全到数据隐私都面临潜在威胁。汽车行业正在使用各种方法进行安全检测和验证,但传统的安全测试中漏洞检测低效且不完整。Vector带来一种使用更少测试案例的增强型灰盒渗透测试,能够在提高覆…

C#WPF基础介绍/第一个WPF程序

什么是WPF WPF(Windows Presentation Foundation)是微软公司推出的一种用于创建窗口应用程序的界面框架。它是.NET Framework的一部分,提供了一套先进的用户界面设计工具和功能,可以实现丰富的图形、动画和多媒体效果。 WPF 使用…

【EtherCATBasics】- KRTS C++示例精讲(2)

EtherCATBasics示例讲解 目录 EtherCATBasics示例讲解结构说明代码讲解 项目打开请查看【BaseFunction精讲】。 结构说明 EtherCATBasics:应用层程序,主要用于人机交互、数据显示、内核层数据交互等; EtherCATBasics.h : 数据定义…

秒验简介与下载说明

秒验简介与下载说明 产品概述 秒验是一款帮助开发者实现一键验证功能的产品,从根源上降低企业验证成本, 有效提高拉新转化率,降低因验证带来的流失率,3秒完成手机号验证 SDK信息 下载SDK 下载地址 SDK提供Maven和pod引入两种方…

算法学习(17)—— FloodFill算法

目录 关于FloodFill算法 部分OJ题详解 733. 图像渲染 200. 岛屿数量 695. 岛屿的最大面积 130. 被围绕的区域 417. 太平洋大西洋水流问题 529. 扫雷问题 LCR130. 衣橱整理 关于FloodFill算法 爆搜,深搜,回溯的算法原理并不难,这类题…

美国辅料查询之FDA批准药用辅料数据库(IID数据库)

药用辅料的性质很大程度上决定了制剂的性质,每一种新的药用辅料的问世,都会为制剂技术的发展带来新的机遇,每一种药用辅料都可能让制剂研发员开发出新剂型药物,所以在药物制剂研发过程中,药用辅料的信息调研是不可或缺…

SpringAI人工智能开发框架006---SpringAI多模态接口_编程测试springai多模态接口支持

可以看到springai对多模态的支持. 同样去创建一个项目 也是跟之前的项目一样,修改版本1.0.0 这里 然后修改仓库地址,为springai的地址 然后开始写代码

【ELK】filebeat采集数据输出到kafka指定topic

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 背景filebeat主体配置filebeat.inputs部分filebeat.output部分 filebeat完整配置 背景 今天收到需求,生产环境中通需要优化filebeat的输出,…