linux的内存,分为三个层次分析,分别是OS系统内存、进程内存以及目标文件,以下将对这三个层次逐步记录
目标文件相关,在我的另一篇博客:https://blog.csdn.net/qq_21331015/article/details/103210449
OS系统内存
free
total used free shared buffers cached
Mem: 37176 33136 4040 2124 1544 8660
-/+ buffers/cache: 22932 14244
Swap: 0 0 0
Mem行:
Total—总已安装内存(来源于/proc/meminfo中)
Used—使用内存(total - free)
Free—未使用的内存(来源于/proc/meminfo中)
Shared--tmpfs(主要)使用的内存(来源于/proc/meminfo中的Shmem ,在内核2.6.32上可用,如果不可用,则显示为0)
Buffers--内核缓冲区使用的内存(来源于/proc/meminfo中的 Buffers)------写
cache--页面缓存 (来源于/proc/meminfo中的Cached,man的描述还有slab,但是实际效果里没有)----读
-/+ buffers/cache行: 第一行(+/-) buffers和cache
Swap行:
Total-- 交换分区总内存(SwapTotal in /proc/meminfo)
Used-- 交换分区已使用内存(total – free)
Free--未使用的内存(来源于/proc/meminfo中)
总之,free里的所有信息,在meminfo里都可以找到
Meminfo
MemTotal: 37176 kB 总可用内存(划分给OS的内存 - 内核保留部分)
MemFree: 828 kB 未使用的内存
MemAvailable: 10312 kB 估算在准备启动一个新程序时所需要的可用内存的,不包括交换区。
在不引起交换的情况下,估计可用于用户空间分配的内存量。在系统开始交换之前,空闲内存不能低于低水印。
不是所有的页面缓存都可以被释放,否则系统将开始交换。假设至少有一半的页面缓存,或者缓存的低水印值需要保留。
可回收交换的一部分由正在使用的且不能被释放的项组成。将此估计限制在低水印处。
= MemFree - wmark_low + Active(file) + Inactive(file) - min((Active(file) + Inactive(file) )/ 2, wmark_low) +
SReclaimable - min(SReclaimable / 2, wmark_low)
Buffers: 1840 kB block device 文件读写用到的page
Cached: 12080 kB 普通文件占用的缓冲
SwapCached: 0 kB 确定要swapping换页、但是尚未写入物理交换区的匿名内存页
Active: 17976 kB Active(anon) + Active(file)
Inactive: 8056 kB Inactive(anon) + Inactive(file)
Active(anon): 12884 kB 活跃的匿名内存(堆、栈等)
Inactive(anon): 3756 kB
Active(file): 5092 kB 活跃的映射内存(代码段、只读段)
Inactive(anon): 3756 kB
Active(file): 5092 kB 活跃的映射内存(代码段、只读段)
Inactive(file): 4300 kB
Unevictable: 0 kB
Mlocked: 0 kB
SwapTotal: 0 kB
SwapFree: 0 kB
Dirty: 0 kB
Writeback: 0 kB
AnonPages: 12128 kB
Mapped: 7440 kB
Shmem: 4528 kB tmpfs所使用的内存,buffers + cached = Active(file) + Inactive(file) + Shmem
Slab: 3988 kB 内核数据结构slab的大小,可以减少申请和释放内存带来的消耗。
SReclaimable: 620 kB 可收回Slab的大小
SUnreclaim: 3368 kB 不可收回Slab的大小(SUnreclaim+SReclaimable=Slab)
KernelStack: 904 kB 内核栈
PageTables: 444 kB 页表,用于存储各个用户进程的逻辑地址和物理地址的变换关系。
内存使用的压力
内存使用压力?Linux内核使用水位标记(watermark)的概念来描述这个压力情况。Linux为内存的使用设置了三种内 存水位标记,high、low、min。他们所标记的分别含义为:
剩余内存在high以上表示内存剩余较多,目前内存使用压力不大;
high-low的范 围表示目前剩余内存存在一定压力;
low-min表示内存开始有较大使用压力,剩余内存不多了;
min是最小的水位标记,当剩余内存达到这个状态时,就说 明内存面临很大压力。
小于min这部分内存,内核是保留给特定情况下使用的,一般不会分配。内存回收行为就是基于剩余内存的水位标记进行决策的
当系统剩余内存低于watermark[low]的时候,内核的kswapd开始起作用,进行内存回收。直到剩余内存达到watermark[high]的 时候停止。如果内存消耗导致剩余内存达到了或超过了watermark[min]时,就会触发直接回收(direct reclaim)。
查看水位:
cat /proc/zoneinfo
进程内存
status表示进程整体状态:命令:cat /proc/进程号/status
Name: 进程名
Umask:权限掩码(目录:777-022=755,文件:666-022=644)
State:进程状态
Tgid:线程组的ID
Pid: 进程ID,也是主线程ID
PPid: 父进程ID
TracerPid:跟踪当前进程的进程ID,如果是0,表示没有跟踪.(如strace跟踪)
。。。
VmPeak:代表当前进程运行过程中占用虚拟内存的峰值.
VmSize:代表进程现在正在占用的虚拟内存
VmLck: 代表进程已经锁住的物理内存的大小.锁住的物理内存不能交换到硬盘.
VmHWM:程序得到分配到物理内存的峰值.
VmRSS:程序现在使用的物理内存.
RssAnon:匿名内存占用的物理内存
RssFile:文件交换占用的物理内存
VmData:表示进程数据段的虚拟内存.
VmStk:表示进程栈的虚拟内存.
VmExe:表示进程代码的虚拟内存.
VmLib:表示进程所使用LIB库的虚拟内存
。。。
maps表:cat /proc/进程号/maps
分为六列:
第一列:虚拟内存的占用空间
第二列:权限
第三列:此部分在文件中的偏移,如果不是从文件中映射而来,则为0
第四列:设备号
第五列:inode节点
第六列:此段的简要描述
smaps表:cat /proc/进程号/smaps (查看我的另一篇博客)
https://blog.csdn.net/qq_21331015/article/details/99302523
全局变量怎么找
1、通过段表找到bss段即data段
2、在符号表中,虚拟地址在bss及data范围内的符号,即是全局变量
段表及符号表的相关知识,查看我的另一篇博客:
https://blog.csdn.net/qq_21331015/article/details/103210449