free命令是linux系統中常用來查看內存大概情況的shell命令,其執行的效果如下:
root@mimosa_24FD52F24E00:/# free
total used free shared buffers
Mem: 61056 34296 26760 0 3776
-/+ buffers: 30520 30536
Swap: 0 0 0
root@mimosa_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結果的剩餘內存的統計值處於波動降低的這麼一個現象。