当前位置: 首页 > article >正文

linux进程用户态内存泄露问题从进程角度跟踪举例

我们习惯性的会看下那个进程在泄漏内存,我这里使用一个test_malloc的测试进程,该进程每2秒钟会分配一个10000字节的空间,并作简单赋值(注意:如果仅malloc而不使用,编译器会优化,实际测试时将看不到内存泄漏的测试效果):
 这里的VSZ和RSS的单位是kb,程序运行前:

lark@ubuntu:~$ ps -aux | grep "malloc"

USER   PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND

lark      2336   0.0        0.0      2496   576  pts/0      S+      00:16    0:00    ./malloc 

虚拟内存 2496*1k /1024/1024 = 2.5M左右    物理内存: 576*1k/1024/1024 = 0.5M左右 

 程序运行一段时间后:

lark@ubuntu:~$ ps -aux | grep "malloc"

USER   PID %CPU %MEM    VSZ   RSS    TTY      STAT START   TIME COMMAND

lark       2336  0.0        0.9      20580 19056  pts/0      S+    00:16     0:01    ./malloc

虚拟内存: 20580 *1k /1024/1024 = 20M左右  物理内存: 19056  *1k/1024/1024 = 19M左右

这样对比可以看到该malloc进程有明显的内存泄露。

1,查看/proc/meminfo
主要监控系统还有MemFree,对比前后两次的Memfree。

lark@ubuntu:~$ cat /proc/meminfo 
MemTotal:        1974040 kB
MemFree:          149104 kB
MemAvailable:     762944 kB
Buffers:           45088 kB
Cached:           681120 kB
SwapCached:            0 kB
Active:           315612 kB
Inactive:         969976 kB
Active(anon):       1632 kB
Inactive(anon):   562180 kB
Active(file):     313980 kB
Inactive(file):   407796 kB
SwapTotal:       2097148 kB
SwapFree:        2097148 kB
Dirty:               196 kB
AnonPages:        559404 kB
Mapped:           256972 kB
Shmem:              4420 kB
KReclaimable:      66448 kB
Slab:             162704 kB
SReclaimable:      66448 kB
SUnreclaim:        96256 kB
KernelStack:       11168 kB
PageTables:        13724 kB
VmallocTotal:   34359738367 kB
VmallocUsed:       61388 kB

进程运行一段时间后的meminfo信息 

lark@ubuntu:~$ cat /proc/meminfo 
MemTotal:        1974040 kB
MemFree:          129160 kB
MemAvailable:     753136 kB
Buffers:           45184 kB
Cached:           681128 kB
SwapCached:            0 kB
Active:           316100 kB
Inactive:         983808 kB
Active(anon):       1632 kB
Inactive(anon):   576392 kB
Active(file):     314468 kB
Inactive(file):   407416 kB
SwapTotal:       2097148 kB
SwapFree:        2097148 kB
Dirty:                 0 kB
AnonPages:        573672 kB
Mapped:           256984 kB
Shmem:              4428 kB
KReclaimable:      66500 kB
Slab:             162764 kB
SReclaimable:      66500 kB
SUnreclaim:        96264 kB
KernelStack:       11152 kB
PageTables:        13708 kB
VmallocTotal:   34359738367 kB
VmallocUsed:       61388 kB

 MemFree前后变化 MemFree从 149104KB降为 129160 kB,少了20M左右,看SReclaimable前后没有变化。

2,查看进程状态属性stat/statm/status里面的VSZ和RSS

查看物理内存占用,通过/proc/pid/stat或/proc/pid/statm(这里不能设置字体颜色,以粗体表示)

lark@ubuntu:~$ cat /proc/2336/statm
1152 804 271 1 0 605 0

所有数值均以‌内存页(page)‌为单位(通常1页=4KB),我们看到的1152 表示VSZ,804表示物理内存RSS ,271是共享内存页数,1表示文本段(代码)占用页数。0是库文件占用页数,605 是数据段+栈占用页数,0是 脏页数量。 

lark@ubuntu:~$ cat /proc/2336/statm
5442 5094 271 1 0 4895 0 

5442*4k/1024/1024  = 20M左右

lark@ubuntu:~$ cat /proc/2336/status
Name:    malloc
Umask:    0002
State:    S (sleeping)
Tgid:    2336
Ngid:    0
Pid:    2336
PPid:    2177
TracerPid:    0
Uid:    1000    1000    1000    1000
Gid:    1000    1000    1000    1000
FDSize:    256
Groups:    4 24 27 30 46 120 133 134 1000 
NStgid:    2336
NSpid:    2336
NSpgid:    2336
NSsid:    2177
VmPeak:        4740 kB
VmSize:        4740 kB
VmLck:           0 kB
VmPin:           0 kB
VmHWM:        3216 kB
VmRSS:        3216 kB
RssAnon:        2132 kB
RssFile:        1084 kB
RssShmem:           0 kB
VmData:        2420 kB
VmStk:         132 kB
VmExe:           4 kB
VmLib:        1652 kB
VmPTE:          44 kB
VmSwap:           0 kB
HugetlbPages:           0 kB
CoreDumping:    0
THP_enabled:    1
Threads:    1
SigQ:    0/7336
SigPnd:    0000000000000000
ShdPnd:    0000000000000000
SigBlk:    0000000000000000
SigIgn:    0000000000000000
SigCgt:    0000000000000000
CapInh:    0000000000000000
CapPrm:    0000000000000000
CapEff:    0000000000000000
CapBnd:    000001ffffffffff
CapAmb:    0000000000000000
NoNewPrivs:    0
Seccomp:    0
Seccomp_filters:    0
Speculation_Store_Bypass:    thread vulnerable
SpeculationIndirectBranch:    conditional enabled
Cpus_allowed:    ffffffff,ffffffff,ffffffff,ffffffff
Cpus_allowed_list:    0-127
Mems_allowed:    00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000001
Mems_allowed_list:    0
voluntary_ctxt_switches:    2230
nonvoluntary_ctxt_switches:    0 

虚拟内存‌相关参数:
VmSize: 4740 kB:当前虚拟内存占用总量(含共享库)
VmPeak: 4740 kB:历史峰值虚拟内存(本例中与当前值相同)
‌物理内存‌相关参数:
VmRSS: 3216 kB:实际驻留物理内存量(含共享内存)
RssAnon: 2132 kB:匿名页占用(如堆/栈),RssFile: 1084 kB为文件映射内存1
VmHWM: 3216 kB:物理内存使用峰值(与当前VmRSS一致) 

 内存泄漏嫌疑‌:若VmSize(当前虚拟内存占用总量持续增长而VmRSS不变,可能存在虚拟内存泄漏。

3,stat参数解析说明:

lark@ubuntu:~$ cat /proc/2336/stat
2336 (malloc) S 2177 2336 2177 34816 2336 1077936128 623 0 0 0 0 14 0 0 20 0 1 0 74181 4718592 804 18446744073709551615 94518316240896 94518316241573 140725828707728 0 0 0 0 0 0 1 0 0 17 6 0 0 0 0 0 94518316252584 94518316253200 94519079710720 140725828715633 140725828715642 140725828715642 1407258287185750

(1)基础进程信息描述 

pid (2336)‌
进程ID,与文件名中的2336一致。
‌comm (malloc)‌
进程名称,括号包裹的可执行文件名。
‌state (S)‌
进程状态:
S:可中断睡眠(等待事件)
其他可能值:R(运行)、D(不可中断睡眠)、Z(僵尸)等。
‌ppid (2177)‌
父进程ID。
‌pgrp (2336)‌
进程组ID,通常与进程ID相同。

(2)、资源统计信息
‌session (2177)‌
会话ID,通常与父进程ID相同。
‌tty_nr (34816)‌
控制终端设备号,34816对应pts/0类终端。
‌utime (0)‌
用户态CPU时间(单位:时钟滴答,jiffies)。
‌stime (14)‌
内核态CPU时间(jiffies)
‌cutime/cstime (0/0)‌
所有已终止子进程的累计用户态/内核态CPU时间。

(3)、内存相关字段
‌priority (20)‌
进程静态优先级(数值越小优先级越高)。
‌nice (0)‌
nice值,影响动态优先级调整。
‌num_threads (1)‌
进程包含的线程数。
‌start_time (74181)‌
进程启动时间(单位:时钟滴答,从系统启动算起)。
‌vsize (4718592)‌
虚拟内存大小(字节),此处约4.5MB
‌rss (804)‌
驻留物理内存页数(每页通常4KB,此处约3.1MB)。

(4)、其他关键字段
‌exit_signal (17)‌
进程终止时发送给父进程的信号。
‌processor (6)‌
最后一次运行的CPU编号。
‌rt_priority (0)‌
实时进程优先级(0表示非实时进程)。
‌blkio_ticks (0)‌
块设备I/O等待时间(jiffies)。

相关文章:

linux进程用户态内存泄露问题从进程角度跟踪举例

我们习惯性的会看下那个进程在泄漏内存,我这里使用一个test_malloc的测试进程,该进程每2秒钟会分配一个10000字节的空间,并作简单赋值(注意:如果仅malloc而不使用,编译器会优化,实际测试时将看不…...

数据结构-图的应用,实现环形校验和拓扑排序

文章目录 一、如何理解“图”?1.什么是图?2.无向图和有向图3.无权图和有权图 二、JGraphT-图论数据结构和算法的 Java 库1.引入Maven依赖2.环形校验2.1 什么是循环依赖 ?2.2 单元测试代码2.3 情况1:自己依赖自己2.4 情况2&#xf…...

交换机 路由器

在计算机网络中,S 和 R 常常分别代表以下设备: S:Switch(交换机)R:Router(路由器) 简要说明: Switch(交换机,S) 交换机工作在数据链…...

某乎x-zse-96 破解(补环境版本)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 一、总体概述二、请求分析分析请求流程三、逆向分析总结一、总体概述 本文主要实现某乎x-zse-96 破解(补环境版本),相关的链接: https://www.zhihu.com/search?type=content&q=%25E7%258…...

VSCode+Cline 安装配置及使用说明

安装配置 打开VSCode,点击左侧Extension图标,在弹出页面中,检索Cline,选择Cline进行安装。 安装完毕,在左侧会出现一个图标,点击图标 选择【Use your own API key】,在出来的界面中选择大模型&…...

Java中Redis面试题集锦(含过期策略详解)

🤟致敬读者 🟩感谢阅读🟦笑口常开🟪生日快乐⬛早点睡觉 📘博主相关 🟧博主信息🟨博客首页🟫专栏推荐🟥活动信息 文章目录 Java中Redis面试题集锦(含过期策…...

Maven 安装与配置指南(适用于 Windows、Linux 和 macOS)

Apache Maven 是一款广泛应用于 Java 项目的项目管理和构建工具。 本文提供在 Windows、Linux 和 macOS 系统上安装与配置 Maven 的详细步骤,旨在帮助开发者快速搭建高效的构建环境。 一、前置条件:安装 Java Development Kit (JDK) Maven 依赖于 Java …...

android 媒体框架之MediaCodec

一、MediaCodec 整体架构与设计思想 MediaCodec 是 Android 底层多媒体框架的核心组件,负责高效处理音视频编解码任务。其架构采用 生产者-消费者模型,通过双缓冲区队列(输入/输出)实现异步数据处理: 输入缓冲区队列…...

堆与堆排序及 Top-K 问题解析:从原理到实践

一、堆的本质与核心特性 堆是一种基于完全二叉树的数据结构,其核心特性为父节点与子节点的数值关系,分为大堆和小堆两类: 大堆:每个父节点的值均大于或等于其子节点的值,堆顶元素为最大值。如: 小堆:每个…...

Linux中检查当前用户是不是root

Linux中检查当前用户是不是root 检查当前用户是否为root用户。如果是root用户,输出“当前用户是root”;否则,输出“当前用户不是root”。 创建一个 aaa.sh脚本文件 写入如下内容 #!/bin/bash# 检查当前用户的UID是否为0(root用…...

软件锁:守护隐私,安心无忧

数字化时代,手机已成为我们生活中不可或缺的一部分,它不仅存储着我们的个人信息、照片、聊天记录等重要数据,还承载着我们的社交、娱乐和工作等多种功能。然而,这也意味着手机上的隐私信息面临着诸多泄露风险。无论是家人、朋友还…...

无人机桥梁3D建模、巡检、检测的航线规划

无人机桥梁3D建模、巡检、检测的航线规划 无人机在3D建模、巡检和检测任务中的航线规划存在显著差异,主要体现在飞行高度、航线模式、精度要求和传感器配置等方面。以下是三者的详细对比分析: 1. 核心目标差异 任务类型主要目标典型应用场景3D建模 生成…...

项目:贪吃蛇实现

头文件 snake.h #include<stdio.h> #include<stdlib.h> #include<windows.h> #include<locale.h> #include<stdbool.h> #include<time.h>#define POS_X 24#define POS_Y 5 #define BODY L● #define FOOD L★ #define KEY_PRESS(VK) ((…...

【Java基础05】面向对象01

文章目录 1. 设计对象并使用1.1 类与对象1.2 封装1.2.1 private关键字1.2.2 this关键字成员变量和局部变量的区别 1.2.3 构造方法1.2.4 标准JavaBean类 1.3 对象内存图 本文部分参考这篇博客 1. 设计对象并使用 1.1 类与对象 public class 类名{1、成员变量(代表属性,一般是名…...

设计模式:观察者模式 - 实战

一、观察者模式场景 1.1 什么是观察者模式&#xff1f; 观察者模式&#xff08;Observer Pattern&#xff09;观察者模式是一种行为型设计模式&#xff0c;用于定义一种一对多的依赖关系&#xff0c;当对象的状态发生变化时&#xff0c;所有依赖于它的对象都会自动收到通知并更…...

8.8 Primary ODSA service without ODSA Portal

主要ODSA服务&#xff08;不使用ODSA门户&#xff09; 以下场景描述如下情况&#xff1a; • 主ODSA客户端应用程序被允许用于该类型的主设备&#xff0c;且对终端用户启用&#xff08;已授权&#xff09;。 • 服务提供商&#xff08;SP&#xff09;能够在不涉及ODSA门户Web服…...

YOLOv8 移动端升级:借助 GhostNetv2 主干网络,实现高效特征提取

文章目录 引言GhostNetv2概述GhostNet回顾GhostNetv2创新 YOLOv8主干网络改进原YOLOv8主干分析GhostNetv2主干替换方案整体架构设计关键模块实现 完整主干网络实现YOLOv8集成与训练模型集成训练技巧 性能对比与分析计算复杂度对比优势分析 部署优化建议结论与展望 引言 目标检…...

国产化Word处理控件Spire.Doc教程:在 C# 中打印 Word 文档终极指南

在 C# 中以编程方式打印 Word 文档可以简化业务工作流程、自动化报告和增强文档管理系统。本指南全面探讨如何使用Spire.Doc for .NET打印 Word 文档&#xff0c;涵盖从基本打印到高级自定义技术的所有内容。我们将逐步介绍每种情况下的实际代码示例&#xff0c;确保您能够在实…...

java的vscode扩展插件

在 Visual Studio Code (VSCode) 中&#xff0c;Java 开发可以通过多种方式得到支持&#xff0c;包括安装专门的扩展插件。下面是一些流行的 VSCode 扩展插件&#xff0c;可以帮助你更好地进行 Java 开发&#xff1a; Language Support for Java(TM) by Red Hat 官方支持&…...

谷歌:贝叶斯框架优化LLM推理反思

&#x1f4d6;标题&#xff1a;Beyond Markovian: Reflective Exploration via Bayes-Adaptive RL for LLM Reasoning &#x1f310;来源&#xff1a;arXiv, 2505.20561 &#x1f31f;摘要 通过强化学习 (RL) 训练的大型语言模型 (LLM) 表现出强大的推理能力和紧急反射行为&a…...

Qt SQL模块基础

Qt SQL模块基础 一、Qt SQL模块支持的数据库 官方帮助文档中的Qt支持的数据库驱动如下图&#xff1a; Qt SQL 模块中提供了一些常见的数据库驱动&#xff0c;包括网络型数据库&#xff0c;如Qracle、MS SQL Server、MySQL等&#xff0c;也包括简单的单机型数据库。 Qt SQL支…...

[9-3] 串口发送串口发送+接收 江协科技学习笔记(26个知识点)

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26中断...

java 微服务中,微服务相互调用 feign 和flux 如何选择

在 Java 微服务中&#xff0c;Feign 和 Flux&#xff08;通过 WebClient 实现&#xff09;是两种不同的服务间调用方式&#xff0c;主要区别体现在编程模型、通信机制和适用场景上。 1. 编程模型 FeignFlux (WebClient)同步阻塞式&#xff1a;基于传统 Servlet 模型&#xff0…...

如何在Qt中绘制一个带有动画的弧形进度条?

如何在Qt中绘制一个弧形的进度条 在图形用户界面开发中&#xff0c;进度指示控件&#xff08;Progress Widget&#xff09;是非常常见且实用的组件。CCArcProgressWidget 是一个继承自 QWidget 的自定义控件&#xff0c;用于绘制圆弧形进度条。当然&#xff0c;笔者看了眼公开…...

参加技术会议,为程序人生的职业生涯成长添砖加瓦

参加技术会议,为程序人生的职业生涯成长添砖加瓦 关键词:技术会议、程序员职业生涯、职业成长、技术交流、人脉拓展、知识体系升级、职业竞争力 摘要:在快速迭代的IT技术领域,参加技术会议已成为程序员突破职业瓶颈、构建核心竞争力的重要途径。本文从技术会议的核心价值出…...

国产三维CAD皇冠CAD(CrownCAD)建模教程:汽车电池

在线解读『汽车电池』的三维建模流程&#xff0c;讲解3D草图、保存实体、拉伸凸台/基体、设置外观等操作技巧&#xff0c;一起和皇冠CAD&#xff08;CrownCAD&#xff09;学习制作步骤吧&#xff01; 汽车电池&#xff08;通常指铅酸蓄电池或锂离子电池&#xff09;是车辆电气系…...

记录算法笔记(2025.5.28)只出现一次的数字

给你一个 非空 整数数组 nums &#xff0c;除了某个元素只出现一次以外&#xff0c;其余每个元素均出现两次。找出那个只出现了一次的元素。 你必须设计并实现线性时间复杂度的算法来解决此问题&#xff0c;且该算法只使用常量额外空间。 示例 1 &#xff1a; 输入&#xff1…...

VMware-workstation安装教程--超详细(附带安装包)附带安装CentOS系统教程

VMware-workstation安装教程--超详细&#xff08;附带安装包&#xff09;附带安装CentOS系统教程 一、下载软件VMwware二、下载需要的镜像三、在VMware上安装系统 一、下载软件VMwware 二、下载需要的镜像 三、在VMware上安装系统 VMware 被 Broadcom&#xff08;博通&#x…...

2025年- H63-Lc171--33.搜索旋转排序数组(2次二分查找,需二刷)--Java版

1.题目描述 2.思路 输入&#xff1a;旋转后的数组 nums&#xff0c;和一个整数 target 输出&#xff1a;target 在 nums 中的下标&#xff0c;如果不存在&#xff0c;返回 -1 限制&#xff1a;时间复杂度为 O(log n)&#xff0c;所以不能用遍历&#xff0c;必须使用 二分查找…...

3D-激光SLAM笔记

目录 定位方案 编译tbb ros2humble安装 命令 colcon commond not found 栅格地图生成&#xff1a; evo画轨迹曲线 安装gtsam4.0.2 安装ceres-solver1.14.0 定位方案 1 方案一&#xff1a;改动最多 fasterlio 建图&#xff0c;加闭环优化&#xff0c;参考fast-lio增加关…...