Linux程序调试优化(1)——内存占用详解及优化思路

文章目录

  • 1.free查看总体的内存占用
  • 2./proc/$PID/status 查看某进程状态

linux开发最重要的两个参数,分别是内存以及CPU使用率,若内存出现严重不足,则在需要使用内存时,可能出现申请不到的情况,导致 OOM,Linux系统主动杀死占用内存比较高的进程。

1.free查看总体的内存占用

image.png

free中的信息,其实都来自/proc/meminfo。
可以用free -k 则显示数据的单位是KB,free -m 则看到的单位是MB
total:物理内存的总大小
计算方式:total = used + free + buff/cache

used:真正被使用内存的大小,其中包括shared共享内存大小
计算方式:used = total - free - buff/cache

free:未使用内存的大小
计算方式:free = total - buff/cache - used

shared:共享内存大小,包括mmap申请的共享内存,以及加载的动态链接库以及程序的代码段等。
这个值以及包含在used中

buff/cache:缓存和缓冲区的大小,主要目的是为了提升IO的性能,加快IO的速度,当系统内存不足时,会尝试从这边借用内存。Buffer 是对磁盘数据的缓存,而 Cache 是文件数据的缓存,它们既会用在读请求中,也会用在写请求中。

之所以buff/cache能加快IO性能,是因为实际场景中,从内存读取数据的效率远远大于从磁盘读取,如果频繁从磁盘读取数据,会影响CPU工作效率,所以Linux系统在内存中开辟缓存空间,把要用到的数据提前加载到内存中,提升CPU工作效率。

Linux系统读文件数据,首先判断数据是否在cache,如果在则从cache中读取,如果不在,则从磁盘中读取,并且次数会将读取的数据缓存到cache中,下次读取数据则会更快。
image.png

Linux系统写文件数据,首先是往cache中写入数据,此时将写入的cache页标记为脏页,也就是标记cache上还有数据没有同步到磁盘上,待内核在合适的时机将数据统一刷新到磁盘上,如果cache中的数据已经同步到磁盘上,我们就叫它干净页。
image.png

avaliable:剩余可使用的内存 ,理论上total - used就是剩下的内存,但实际上并不是所有剩余内存都可使用,所以 available <(total - used)即available < ( buff/cache + free),但比较接近这个值。

2./proc/$PID/status 查看某进程状态

当看到整体内存不足时,一般都需要去分析是哪个进程占用的内存比较多,并且确认该进程的内存是否一直在增长,如果是的话,则可能发生了内存泄漏。

xzx@ubuntu:~/share/project_ipc/hm3001/70mai/mike$ cat /proc/128622/status 
Name:   fwupd
Umask:  0022
State:  S (sleeping)
Tgid:   128622
Ngid:   0
Pid:    128622
PPid:   1
TracerPid:      0
Uid:    0       0       0       0
Gid:    0       0       0       0
FDSize: 256
Groups:  
NStgid: 128622
NSpid:  128622
NSpgid: 128622
NSsid:  128622
VmPeak:   633144 kB
VmSize:   567608 kB
VmLck:         0 kB
VmPin:         0 kB
VmHWM:     24532 kB
VmRSS:     24532 kB
RssAnon:            4244 kB
RssFile:           20288 kB
RssShmem:              0 kB
VmData:    45180 kB
VmStk:       132 kB
VmExe:       332 kB
VmLib:     57656 kB
VmPTE:       540 kB
VmSwap:        0 kB
HugetlbPages:          0 kB
CoreDumping:    0
THP_enabled:    1
Threads:        5
SigQ:   0/23440
SigPnd: 0000000000000000
ShdPnd: 0000000000000000
SigBlk: 0000000000000000
SigIgn: 0000000000001000
SigCgt: 0000000180004000
CapInh: 0000000000000000
CapPrm: 0000003ffffeffff
CapEff: 0000003ffffeffff
CapBnd: 0000003ffffeffff
CapAmb: 0000000000000000
NoNewPrivs:     0
Seccomp:        2
Speculation_Store_Bypass:       thread force mitigated
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:        66
nonvoluntary_ctxt_switches:     7

Pid:当前进程id
PPid:当前进程的父进程ID
VmPeak:当前进程运行过程中占用内存的峰值
VmSize:进程当前使用的虚拟内存的大小,包括了进程使用的所有虚拟内存区域的大小,包括未分配的、已分配但尚未使用的、已使用的以及共享的内存区域等。虚拟内存大小包含了进程可访问的所有虚拟地址空间,但不一定都会被实际占用。
VmLck:当前进程已经锁住的物理内存的大小.锁住的物理内存不能交换到硬盘
VmHWM:进程所使用的物理内存的峰值
VmRSS:进程当前使用物理内存的大小
VmData: 进程占用的数据段大小
VmStk:进程占用的栈大小
VmExe:进程占用的代码段大小
VmLib:进程所加载的动态库所占用的内存大小
VmPTE:进程占用的页表大小
VmSwap:进程所使用的交换区的大小

一般是看VmRSS的增长情况来确认是否发生了内存泄漏,如果VmRss即真实物理内存大小不断在增长,则代表内存发生了泄漏。而VmHWM代表物理占用内存峰值,能看到该进程对内存的需求情况,如果峰值很高,代表这个进程存在内存需求比较多的情况。

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

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

相关文章

顺丰快递免费的API开放物流信息查询接口

文章目录 目录 文章目录 安装流程 小结 概要安装流程技术细节小结 概要 官方地址&#xff1a;顺丰开放平台 注册成功之后&#xff0c;需要认证&#xff0c;进入当前如图下&#xff0c;认证的入口如图&#xff08;已认证的页面&#xff09; 点击新建应用 安装流程 1. 需要下载…

【模拟】Leetcode 替换所有的问号

题目讲解 1576. 替换所有的问号 算法讲解 这里有两个特殊情况&#xff1a;如果&#xff1f;在第一个位置&#xff0c;只需要判断后面的符号&#xff1b; 如果&#xff1f;在最后一个位置&#xff0c;只需要判断前面的符号 class Solution { public:string modifyString(stri…

Java:定时任务无法正常执行(scheduling + ShedLock)

目录 一、场景二、代码片段三、排查四、原因五、解决 一、场景 1、使用定时任务(scheduling) 分布式锁(ShedLock)定期执行一段代码 2、configureTasks()对于任务执行周期的更新是正常的 3、但任务方法无法被执行 二、代码片段 三、排查 1、确认Trigger没有问题 2、查看red…

如何在MobaXterm上使用rz命令

1、首先输入命令和想下载的文件&#xff0c;如下图&#xff1a; 2、按住ctrl鼠标右键&#xff0c;选择如下选项&#xff1a; 上传命令是rz&#xff0c;选择Receive...... 下载命令是sz&#xff0c;选择Send...... 3、我这里是要把Linux上的文件下载到我的本地window磁盘&…

【计算机考研】408网课汇总+资源分享

408王道的视频就比较通俗易懂 王道的教材非常契合408的大纲&#xff0c;是专门为408大纲而编写的&#xff0c;而教材是方方面面都讲解的透彻。 建议王道为主&#xff0c;网络搜索为辅&#xff01; 王道中讲解不清楚&#xff0c;看不懂的知识点&#xff0c;可以尝试在网络上进…

小车项目介绍

STM32智能小车基于STM32F103C8T6进行开发 该项目具有OLED,USART串口,ADC测量电压,陀螺仪,超声波测距模块,红外循迹模块,蓝牙模块,按键,电机驱动,电机,舵机,电源等功能 功能详细介绍: OLED模块 使用:OLED显示屏模块 0.96寸 IIC/SPI 选择原因&#xff1a;价格较低、使用方便…

OpenHarmony轻量系统开发【4】编写第一个程序、启动流程分析

摘要&#xff1a;本文简单介绍如何编写第一个hello world程序&#xff0c;以及程序是被执行的 适合群体&#xff1a;适用于Hi3861开发板&#xff0c;启动流程分析 4.1编写第一个程序 编写一个hello world程序比较简单&#xff0c;可以参考官网&#xff1a; https://gitee.c…

Redis中的订阅发布(三)

订阅发布 发送消息 当一个Redis客户端执行PUBLISH 命令将消息message发送给频道channel的时候&#xff0c;服务器需要执行以下 两个动作: 1.将消息message发送给channel频道的所有订阅者2.如果一个或多个模式pattern与频道channel相匹配&#xff0c;那么将消息message发送给…

开源相机管理库Aravis例程学习(二)——连续采集multiple-acquisition-main-thread

开源相机管理库Aravis例程学习&#xff08;二&#xff09;——连续采集multiple-acquisition-main-thread 简介例程代码函数说明arv_camera_set_acquisition_modearv_camera_create_streamarv_camera_get_payloadarv_buffer_newarv_stream_push_bufferarv_camera_start_acquisi…

CCleaner怎么清理软件缓存 CCleaner清理要勾选哪些 ccleanerfree下载

CCleaner软件是一款优秀的数据清理软件&#xff0c;其中没有硬盘和内存的设置&#xff0c;也不含任何广告软件&#xff0c;其出色的注册表清洁功能能够保证您的电脑更稳定运行。本文将围绕CCleaner怎么清理软件缓存&#xff0c;CCleaner清理要勾选哪些的相关内容进行介绍。 一、…

使用Hugo、Github Pages搭建自己的博客

文章目录 搭建博客框架及对比使用Hugo搭建博客使用Github Pages部署博客 搭建博客框架及对比 在众多的博客框架中&#xff0c;Hugo、Jekyll和Hexo因其出色的性能和易用性而备受推崇。 特点HugoJekyllHexo速度极高中等较高易用性高中等高&#xff08;熟悉JavaScript者&#xf…

如何应对孩子情绪化地发脾气?

你有小孩儿吗&#xff1f;是否受孩子发脾气的困扰&#xff1f;如果都没有&#xff0c;可以跳出去看看别人的文章了&#xff0c;如果有&#xff0c;可以继续往下看。 白牙有个小闺女&#xff0c;3 岁半&#xff0c;今天她看大人洗脚&#xff0c;她也想洗&#xff0c;但没来得及给…

【微信小程序——开发DAY5(黑马程序员课程)】

微信小程序——开发DAY5&#xff08;黑马程序员课程&#xff09; 使用npm包注意&#xff1a;先安装node.js安装Vant组件库使用Vant组件库定制全局主题样式API Promise化 全局数据共享&#xff08;又叫做&#xff1a;状态管理&#xff09;1.安装Mobx相关的包2.删除miniprogram.n…

音质更细腻,时尚与舒适兼备,唐麦M5耳机体验

在音乐的世界里&#xff0c;一款好的耳机就像是一位懂你的老朋友&#xff0c;它能够准确传达音乐的情感&#xff0c;让你沉浸在每一个音符中。所以无论是在通勤的路上&#xff0c;还是在健身的过程中&#xff0c;一款优质的蓝牙耳机总能为我们带来更加丰富的听觉体验。最近我最…

数据类型知识

1&#xff0c;介绍 根据数据所占的空间不同&#xff0c;把数据分为不同的数据类型 js的变量数据类型是在程序运行中&#xff0c;靠等号右边数值的值来判断的 js动态变量&#xff0c;里面的数据类型是可以变化的 2.数据类型 1.简单数据类型 程序里面&#xff0c;数字前面有…

每日OJ题_BFS解决最短路③_力扣127. 单词接龙

目录 ③力扣127. 单词接龙 解析代码 ③力扣127. 单词接龙 127. 单词接龙 难度 困难 字典 wordList 中从单词 beginWord 和 endWord 的 转换序列 是一个按下述规格形成的序列 beginWord -> s1 -> s2 -> ... -> sk&#xff1a; 每一对相邻的单词只差一个字母。…

GPT人工智能在线网页版大全

平民不参与内测&#xff0c;还能使用 ChatGPT 吗&#xff1f; 自去年 ChatGPT 爆红以来&#xff0c;关于它的消息铺天盖地。如果你真的想使用它&#xff0c;途径有很多。除了官方网站外国内还有许多 ChatGPT 的镜像网站&#xff0c;其中不乏免费的 3.5 版本。虽然有些网站需要…

Spring Task 定时任务调度

一、概念 Spring Task 是 Spring 框架的一个组件&#xff0c;它为任务调度提供了支持&#xff0c;使得开发者能够创建后台任务或定期执行的任务。通过 Spring Task&#xff0c;您可以方便地在 Java 应用程序中实现定时任务&#xff0c;比如每天凌晨进行数据同步、每小时执行一…

EasyRecovery数据恢复软件2024免费版下载亲测可用(支持win7,win10)

EasyRecovery数据恢复软件是由全球著名的数据恢复公司Ontrack出品的一款专业级数据文件恢复工具。它支持恢复多种存储介质上的数据&#xff0c;包括硬盘、光盘、U盘/移动硬盘、数码相机以及Raid文件恢复等&#xff0c;能恢复的文件类型也相当丰富&#xff0c;包括文档、表格、图…

基于Springboot+Vue的Java项目-校园周边美食探索及分享平台系统开发实战(附演示视频+源码+LW)

大家好&#xff01;我是程序员一帆&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;Java毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计 &am…