linux OutOfMemoryError 内存溢出排查

server/2025/1/18 17:32:49/

前言

内存溢出我会先分成两种情况。
一种是8g内存服务器分配给服务2g内存,导致服务内存溢出。
一种是8g内存服务器把内存全部分给服务导致的内存溢出。
也就是说一种是给服务加配置,一种需要调整服务的代码处理。

思路整理

日志排查

第一步应该是日志排查。如果系统做的比较完善,服务器监控做的也比较好的话。负责人应该是第一个收到短信(或者其它)得到消息。服务出问题了。
那么这个时候处理问题的第一步就是看服务的日志。这里用tomcat举例

查看实时日志

tail -f /home/tomcat/logs/catalina.out

通常这个时候更推荐查看日志文件的最后几行,比如最后一千行。

tail -n 1000 /home/tomcat/logs/catalina.out

或者如果你想要搜索日志文件中的特定关键字(例如"error")

grep "error" /home/tomcat/logs/catalina.out

注意/home/tomcat/替换为你实际的Tomcat安装路径。

通过日志定位到具体代码和具体的操作。再根据日志对代码和数据进行分析。

服务器配置查看

vmstat 1

执行vmstat 1命令会有详细的服务器内存和cpu信息的显示。

vmstat 1

执行之后的结果示例如下:

procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st1  0  20480 123456  89012 456789    0    0    20    10   65   78  5  3 90  2  01  0  20480 123400  89012 456800    0    0     0     4   60   75  4  3 92  1  00  0  20480 123350  89012 456820    0    0     5    15   68   80  6  3 89  2  0

解释:

procs:
r:正在运行和等待CPU时间的进程数。
b:处于不可中断睡眠状态的进程数。
memory:
swpd:已使用的交换空间(swap)大小,单位为KB。
free:空闲内存大小,单位为KB。
buff:用作缓冲的内存大小,单位为KB。这部分内存用来存储磁盘块的缓冲区。
cache:用作缓存的内存大小,单位为KB。这部分内存用来存储从磁盘读取的文件数据,以加快后续访问速度。
swap:
si:从磁盘交换到内存的数据量(每秒),单位为KB/s。
so:从内存交换到磁盘的数据量(每秒),单位为KB/s。
io:
bi:从块设备读取的数据量(每秒),单位为KB/s。
bo:写到块设备的数据量(每秒),单位为KB/s。
system:
in:每秒发生的中断数,包括时钟中断。
cs:每秒发生的上下文切换数。
cpu:
us:用户空间占用的CPU百分比。
sy:内核空间占用的CPU百分比。
id:空闲CPU百分比。
wa:等待I/O操作的CPU时间百分比。
st:被虚拟机偷去的时间百分比(在虚拟化环境中可能会看到)

命令总结:
这个命令输出的内容很详细,但是过多。不利于快速排查问题。

free -m

free -m 命令用于显示Linux系统中内存的使用情况,单位是MB(兆字节)。

free -m

执行之后的结果示例如下:

total        used        free      shared  buff/cache   available
Mem:        8000        2000        1000         300        5000        5500
Swap:       2048           0        2048

解释:

Mem: 表示物理内存(RAM)的使用情况。
total:物理内存总量,单位是MB。在这个例子中,总内存是8000MB。
used:已使用的物理内存量,包括为进程分配的内存和内核使用的内存。在这个例子中,已使用内存是2000MB。
free:未被使用的物理内存量。在这个例子中,空闲内存是1000MB。
shared:多个进程共享的内存量(这个字段在某些Linux发行版或free命令的版本中可能不显示)。在这个例子中,共享内存是300MB。
buff/cache:被用作缓冲和缓存的内存量。这部分内存可以被回收用于其他目的,如果系统需要更多内存的话。在这个例子中,缓冲和缓存内存是5000MB。
available:估计的可用内存量,考虑了缓存和缓冲区内存的可回收性。这个值比free列更准确地反映了系统可用于启动新应用程序而不必交换到磁盘上的内存量。在这个例子中,可用内存是5500MBSwap: 表示交换空间(swap space)的使用情况。
total:交换空间总量,单位是MB。在这个例子中,总交换空间是2048MB。
used:已使用的交换空间量。在这个例子中,没有使用交换空间(0MB)。
free:未被使用的交换空间量。在这个例子中,空闲交换空间是2048MB

命令总结:
推荐使用。如果available列的值很低,而buff/cache列的值很高,这可能意味着系统正在积极使用缓存,但仍有足够的内存可供新进程使用(因为缓存可以被回收)。然而,如果used列的值很高,并且available列的值很低,那么你可能需要考虑增加物理内存或优化你的应用程序以减少内存使用。 如果物理内存和交换空间的used都已经满了,在不能增加服务器资源的情况下,应该是要调整代码的。

Swap详解


http://www.ppmy.cn/server/159408.html

相关文章

使用redis-cli命令实现redis crud操作

项目场景: 线上环境上redis中的key影响数据展示,需要删除。但环境特殊没办法通过 redis客户端工具直连。只能使用redis-cli命令来实现。 操作步骤: 1、确定redis安装的服务器; 2、找到redis的安装目录下 ##找到redis安装目…

用公网服务器实现内网穿透

首先需要一个公网服务器 下载frp 搜索github下载到frp,服务端frps/客户端frpc。。下载的时候要注意自己本地内网机的cpu版本和服务端cpu架构 我的电脑是mac M1PRO版本 下载的是:darwinarm64 比如 服务端一般是Linux(Intel 64位CPU&#xf…

Red Hat8:搭建FTP服务器

目录 一、匿名FTP访问 1、新建挂载文件 2、挂载 3、关闭防火墙 4、搭建yum源 5、安装VSFTPD 6、 打开配置文件 7、设置配置文件如下几个参数 8、重启vsftpd服务 9、进入图形化界面配置网络 10、查看IP地址 11、安装ftp服务 12、遇到拒绝连接 13、测试 二、本地…

【Delete 删除数据语法合集】.NET开源ORM框架 SqlSugar 系列

系列文章目录 🎀🎀🎀 .NET开源 ORM 框架 SqlSugar 系列 🎀🎀🎀 文章目录 系列文章目录前言 🍃一、根据实体删除1.1 强类型实体2.2 无主键实体删除2.3 Object、接口、抽象类 删除 二、根据主键三…

Java负载均衡

Java中的负载均衡原理是指通过合理分配网络请求或计算任务的方式,将工作负载分配到多个服务器、处理单元或服务实例上,从而提高系统的性能、可扩展性和可用性。负载均衡不仅可以分散请求压力,还能增强系统的容错能力,避免单点故障…

数据结构 数组

1. 常见的错误 这里我要特别纠正一个“错误”。我在面试的时候,常常会问数组和链表的区别,很多人都回答说,“链表适合插入、删除,时间复杂度O(1);数组适合查找,查找时间复杂度为O(1)”。 实际上&#xff…

VTK知识学习(36)-图像平滑

1、前言 图像平滑常用于图像的预处理中,如计算梯度时先对图像进行平滑处理,可以减少噪声对梯度的影响。图像平滑一般是通过模板卷积运算实现。模板可以看作一个大小为nxn的小图像,例如 3x3、5x5等,模板的每个像素都对应一个系数值…

海康MV-EB435i立体相机SDK安装(ROS 2)

文章目录 一、简介二、驱动配置小结 一、简介 MV-EB435i相机是一款低成本、小体积、配置全面的立体相机,凭借硬件级的深度图像处理方案,相机可在高性能输出的同时维持低功耗的水平。相机采用海康MV3D SDK,并提供跨平台支持,广泛应…