Linux内存窥视--free

free命令是linux系统中常用来查看内存大概情况的shell命令,其执行的效果如下:

[email protected]_24FD52F24E00:/# free

total         used         free       shared      buffers

Mem:         61056        34296        26760            0         3776

-/+ buffers:              30520        30536

Swap:            0            0            0

[email protected]_24FD52F24E00:/#

(这个输出的基本单位为KB)

free这个结果的产生由调用sysinfo()系统调用函数得到对应的结果,在2.6.36内核中跟踪的结果如下:

[kernel/timer.c]

SYSCALL_DEFINE1(sysinfo, struct sysinfo __user *, info)

{

struct sysinfo val;

do_sysinfo(&val);

if (copy_to_user(info, &val, sizeof(struct sysinfo)))

return -EFAULT;

return 0;

}

sysinfo()系统调用最终由上面的函数给出内核的统计值。

其中,do_sysinfo()函数的实现也在同一文件中,其定义的部分内容如下:

[kernel/timer.c: sysinfo()->do_sysinfo()]

/**

* do_sysinfo - fill in sysinfo struct

* @info: pointer to buffer to fill

*/

int do_sysinfo(struct sysinfo *info)

{

...

si_meminfo(info);

...

bitcount = 0;

mem_unit = info->mem_unit;

while (mem_unit > 1) {

bitcount++;

mem_unit >>= 1;

sav_total = mem_total;

mem_total <<= 1;

if (mem_total < sav_total)

goto out;

}

/*

* If mem_total did not overflow, multiply all memory values by

* info->mem_unit and set it to 1.  This leaves things compatible

* with 2.2.x, and also retains compatibility with earlier 2.4.x

* kernels...

*/

info->mem_unit = 1;

info->totalram <<= bitcount;

info->freeram <<= bitcount;

info->sharedram <<= bitcount;

info->bufferram <<= bitcount;

info->totalswap <<= bitcount;

info->freeswap <<= bitcount;

info->totalhigh <<= bitcount;

info->freehigh <<= bitcount;

out:

return 0;

}

其中,do_sysinfo()调用si_meminfo()获取vm_stat[]当前的未被使用内存总量,通过global_page_state()函数获得:

[mm/page_alloc.c: sysinfo()->do_sysinfo()->si_meminfo()]

void si_meminfo(struct sysinfo *val)

{

val->totalram = totalram_pages;

val->sharedram = 0;

val->freeram = global_page_state(NR_FREE_PAGES);

val->bufferram = nr_blockdev_pages();

val->totalhigh = totalhigh_pages;

val->freehigh = nr_free_highpages();

val->mem_unit = PAGE_SIZE;

}

由global_page_state()函数的名称可以猜测,vm_stat对内存的管理的基本单位为页,此处为4KB内存大小。

确定了freeram的取值来源,也可以知道free命令的输出的基本单位为4KB,即free会存在最多4KB的误差。此时,若检查程序的内存泄露,对于泄露的内存远小于4KB的情况,可能需要一定时间的累加才能获知free得到的剩余内存在降低,由于系统一般在运行中,而且linux内核会尽可能地使用内存用于提高系统的执行效率,所以,要想明确得到较小内存泄露程序的证据,时间会增加很多,最终,应该是比较长时间的free结果的剩余内存的统计值处于波动降低的这么一个现象。

时间: 2024-10-11 07:30:25

Linux内存窥视--free的相关文章

linux内存管理

一.Linux 进程在内存中的数据结构 一个可执行程序在存储(没有调入内存)时分为代码段,数据段,未初始化数据段三部分:    1) 代码段:存放CPU执行的机器指令.通常代码区是共享的,即其它执行程序可调用它.假如机器中有数个进程运行相同的一个程序,那么它们就可以使用同一个代码段.     2) 数据段:存放已初始化的全局变量.静态变量(包括全局和局部的).常量.static全局变量和static函数只能在当前文件中被调用.     3) 未初始化数据区(uninitializeddata s

Linux内存管理机制

一.首先大概了解一下计算机CPU.Cache.内存.硬盘之间的关系及区别. 1.  CPU也称为中央处理器(CPU,Central Processing Unit)是一块超大规模的集成电路, 是一台计算机的运算核心(Core)和控制核心( Control Unit).它的功能主要是解释计算机指令以及处理计算机软件中的数据.中央处理器主要由三核心部件组成,运算器.控制器和总线(BUS),运算器又主要由算术逻辑单元(ALU)和寄存器(RS)组成. 2.Cache即高速缓冲存储器,是位于CPU与主内存

Linux内存机制以及手动释放swap和内存

哇,感觉好久没更新了,今天我们来谈谈Linux的内存机制. 首先我们理一下概念 一.什么是linux的内存机制? 我们知道,直接从物理内存读写数据要比从硬盘读写数据要快的多,因此,我们希望所有数据的读取和写入都在内存完成,而内存是有限的,这样就引出了物理内存与虚拟内存的概念. 物理内存就是系统硬件提供的内存大小,是真正的内存,相对于物理内存,在linux下还有一个虚拟内存的概念,虚拟内存就是为了满足物理内存的不足而提出的策略,它是利用磁盘空间虚拟出的一块逻辑内存,用作虚拟内存的磁盘空间被称为交换

Linux内存管理 【转】

转自:http://blog.chinaunix.net/uid-25909619-id-4491368.html Linux内存管理 摘要:本章首先以应用程序开发者的角度审视Linux的进程内存管理,在此基础上逐步深入到内核中讨论系统物理内存管理和内核内存的使用方法.力求从外到内.水到渠成地引导网友分析Linux的内存管理与使用.在本章最后,我们给出一个内存映射的实例,帮助网友们理解内核内存管理与用户内存管理之间的关系,希望大家最终能驾驭Linux内存管理. 前言 内存管理一向是所有操作系统书

攻城狮在路上(叁)Linux(二十五)--- linux内存交换空间(swap)的构建

swap的功能是应付物理内存不足的状况,用硬盘来暂时放置内存中的信息. 对于一般主机,物理内存都差不多够用,所以也就不会用到swap,但是对于服务器而言,当遇到大量网络请求时或许就会用到. 当swap被使用的时候,主机的硬盘灯就会闪烁不停. 本篇介绍两种方式:1.设置一个swap分区   2.创建一个虚拟内存的文件. 一.使用物理分区构建swap: 1.首先是分区: A.fdisk /dev/sda; <== 根据后续提示创建一个分区. B.修改分区的ID,因为fdisk默认将分区的ID作为文件

linux内存管理浅析

[地址映射](图:左中)linux内核使用页式内存管理,应用程序给出的内存地址是虚拟地址,它需要经过若干级页表一级一级的变换,才变成真正的物理地址.想一下,地址映射还是一件很恐怖的事情.当访问一个由虚拟地址表示的内存空间时,需要先经过若干次的内存访问,得到每一级页表中用于转换的页表项(页表是存放在内存里面的),才能完成映射.也就是说,要实现一次内存访问,实际上内存被访问了N+1次(N=页表级数),并且还需要做N次加法运算.所以,地址映射必须要有硬件支持,mmu(内存管理单元)就是这个硬件.并且需

启动期间的内存管理之初始化过程概述----Linux内存管理(九)

日期 内核版本 架构 作者 GitHub CSDN 2016-06-14 Linux-4.7 X86 & arm gatieme LinuxDeviceDrivers Linux内存管理 在内存管理的上下文中, 初始化(initialization)可以有多种含义. 在许多CPU上, 必须显式设置适用于Linux内核的内存模型. 例如在x86_32上需要切换到保护模式, 然后内核才能检测到可用内存和寄存器. 而我们今天要讲的boot阶段就是系统初始化阶段使用的内存分配器. 1 前景回顾 1.1

linux内存源码分析 - 内存压缩(同步关系)

本文为原创,转载请注明:http://www.cnblogs.com/tolimit/ 概述 最近在看内存回收,内存回收在进行同步的一些情况非常复杂,然后就想,不会内存压缩的页面迁移过程中的同步关系也那么复杂吧,带着好奇心就把页面迁移的源码都大致看了一遍,还好,不复杂,也容易理解,这里我们就说说在页面迁移过程中是如何进行同步的.不过首先可能没看过的朋友需要先看看linux内存源码分析 - 内存压缩(一),因为会涉及里面的一些知识. 其实一句话可以概括页面迁移时是如何进行同步的,就是:我要开始对这

手工释放linux内存

当在Linux下频繁存取文件后,物理内存会很快被用光,当程序结束后,内存不会被正常释放,而是一直作为caching.这个问题,貌似有不少人在问,不过都没有看到有什么很好解决的办法.那么我来谈谈这个问题.一.通常情况先来说说free命令:引用[[email protected] ~]# free -m         total used free shared buffers cachedMem: 249 163     86      0        10           94-/+ b