cat /proc/meminfo 讀出的內核信息進行解釋:
MemTotal: 507480 kB
MemFree: 10800 kB
Buffers: 34728 kB
Cached: 98852 kB
SwapCached: 128 kB
Active: 304248 kB
Inactive: 46192 kB
HighTotal: 0 kB
HighFree: 0 kB
LowTotal: 507480 kB
LowFree: 10800 kB
SwapTotal: 979956 kB
SwapFree: 941296 kB
Dirty: 32 kB
Writeback: 0 kB
AnonPages: 216756 kB
Mapped: 77560 kB
Slab: 22952 kB
SReclaimable: 15512 kB
SUnreclaim: 7440 kB
PageTables: 2640 kB
NFS_Unstable: 0 kB
Bounce: 0 kB
CommitLimit: 1233696 kB
Committed_AS: 828508 kB
VmallocTotal: 516088 kB
VmallocUsed: 5032 kB
VmallocChunk: 510580 kB
MemTotal: 所有可用RAM大小(即物理內存減去一些預留位和內核的二進制代碼大小)
MemFree: LowFree與HighFree的總和,被系統留着未使用的內存
Buffers: 用來給文件做緩衝大小
Cached: 被高速緩衝存儲器(cache memory)用的內存的大小(等於 diskcache minus SwapCache ).
SwapCached:被高速緩衝存儲器(cache memory)用的交換空間的大小
已經被交換出來的內存,但仍然被存放在swapfile中。用來在需要的時候很快的被替換而不需要再次打開I/O端口。
Active: 在活躍使用中的緩衝或高速緩衝存儲器頁面文件的大小,除非非常必要否則不會被移作他用.
Inactive: 在不經常使用中的緩衝或高速緩衝存儲器頁面文件的大小,可能被用於其他途徑.
HighTotal:
HighFree: 該區域不是直接映射到內核空間。內核必須使用不同的手法使用該段內存。
LowTotal:
LowFree: 低位可以達到高位內存一樣的作用,而且它還能夠被內核用來記錄一些自己的數據結構。Among many
other things, it is where everything from the Slab is
allocated. Bad things happen when you're out of lowmem.
SwapTotal: 交換空間的總大小
SwapFree: 未被使用交換空間的大小
Dirty: 等待被寫回到磁盤的內存大小。
Writeback: 正在被寫回到磁盤的內存大小。
AnonPages:未映射頁的內存大小
Mapped: 設備和文件等映射的大小。
Slab: 內核數據結構緩存的大小,可以減少申請和釋放內存帶來的消耗。
SReclaimable:可收回Slab的大小
SUnreclaim:不可收回Slab的大小(SUnreclaim+SReclaimable=Slab)
PageTables:管理內存分頁頁面的索引表的大小。
NFS_Unstable:不穩定頁表的大小
VmallocTotal: 可以vmalloc虛擬內存大小
VmallocUsed: 已經被使用的虛擬內存大小。
VmallocChunk: largest contigious block of vmalloc area which is free
VSS- Virtual Set Size 虛擬耗用內存(包含共享庫佔用的內存)
RSS- Resident Set Size 實際使用物理內存(包含共享庫佔用的內存)
PSS- Proportional Set Size 實際使用的物理內存(比例分配共享庫佔用的內存)
USS- Unique Set Size 進程獨自佔用的物理內存(不包含共享庫佔用的內存)
一般來說內存佔用大小有如下規律:VSS >= RSS >= PSS >= USS
下面簡單來個例子,看看已用內存和物理內存大小..
結果:Used 488M/Total 495M
MemTotal: 507480 kB
MemFree: 10800 kB
Buffers: 34728 kB
Cached: 98852 kB
SwapCached: 128 kB
Active: 304248 kB
Inactive: 46192 kB
HighTotal: 0 kB
HighFree: 0 kB
LowTotal: 507480 kB
LowFree: 10800 kB
SwapTotal: 979956 kB
SwapFree: 941296 kB
Dirty: 32 kB
Writeback: 0 kB
AnonPages: 216756 kB
Mapped: 77560 kB
Slab: 22952 kB
SReclaimable: 15512 kB
SUnreclaim: 7440 kB
PageTables: 2640 kB
NFS_Unstable: 0 kB
Bounce: 0 kB
CommitLimit: 1233696 kB
Committed_AS: 828508 kB
VmallocTotal: 516088 kB
VmallocUsed: 5032 kB
VmallocChunk: 510580 kB
MemTotal: 所有可用RAM大小(即物理內存減去一些預留位和內核的二進制代碼大小)
MemFree: LowFree與HighFree的總和,被系統留着未使用的內存
Buffers: 用來給文件做緩衝大小
Cached: 被高速緩衝存儲器(cache memory)用的內存的大小(等於 diskcache minus SwapCache ).
SwapCached:被高速緩衝存儲器(cache memory)用的交換空間的大小
已經被交換出來的內存,但仍然被存放在swapfile中。用來在需要的時候很快的被替換而不需要再次打開I/O端口。
Active: 在活躍使用中的緩衝或高速緩衝存儲器頁面文件的大小,除非非常必要否則不會被移作他用.
Inactive: 在不經常使用中的緩衝或高速緩衝存儲器頁面文件的大小,可能被用於其他途徑.
HighTotal:
HighFree: 該區域不是直接映射到內核空間。內核必須使用不同的手法使用該段內存。
LowTotal:
LowFree: 低位可以達到高位內存一樣的作用,而且它還能夠被內核用來記錄一些自己的數據結構。Among many
other things, it is where everything from the Slab is
allocated. Bad things happen when you're out of lowmem.
SwapTotal: 交換空間的總大小
SwapFree: 未被使用交換空間的大小
Dirty: 等待被寫回到磁盤的內存大小。
Writeback: 正在被寫回到磁盤的內存大小。
AnonPages:未映射頁的內存大小
Mapped: 設備和文件等映射的大小。
Slab: 內核數據結構緩存的大小,可以減少申請和釋放內存帶來的消耗。
SReclaimable:可收回Slab的大小
SUnreclaim:不可收回Slab的大小(SUnreclaim+SReclaimable=Slab)
PageTables:管理內存分頁頁面的索引表的大小。
NFS_Unstable:不穩定頁表的大小
VmallocTotal: 可以vmalloc虛擬內存大小
VmallocUsed: 已經被使用的虛擬內存大小。
VmallocChunk: largest contigious block of vmalloc area which is free
VSS- Virtual Set Size 虛擬耗用內存(包含共享庫佔用的內存)
RSS- Resident Set Size 實際使用物理內存(包含共享庫佔用的內存)
PSS- Proportional Set Size 實際使用的物理內存(比例分配共享庫佔用的內存)
USS- Unique Set Size 進程獨自佔用的物理內存(不包含共享庫佔用的內存)
一般來說內存佔用大小有如下規律:VSS >= RSS >= PSS >= USS
下面簡單來個例子,看看已用內存和物理內存大小..
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int MemInfo(char* Info, int len);
int main()
{
char buf[128];
memset(buf, 0, 128);
MemInfo(buf, 100);
printf("%s", buf);
return 0;
}
int MemInfo(char* Info, int len)
{
char sStatBuf[256];
FILE* fp;
int flag;
int TotalMem;
int UsedMem;
char* line;
if(system("free -m | awk '{print $2,$3}' > mem"));
memset(sStatBuf, 0, 256);
fp = fopen("mem", "rb");
if(fp < 0)
{
return -1;
}
fread(sStatBuf,1, sizeof(sStatBuf) , fp);
line = strstr(sStatBuf, "/n");
TotalMem = atoi(line);
line = strstr(line, " ");
UsedMem = atoi(line);
memset(sStatBuf, 0, 256);
sprintf(sStatBuf, "Used %dM/Total %dM/n", UsedMem, TotalMem);
if(strlen(sStatBuf) > len)
{
return -1;
}
memcpy(Info, sStatBuf, strlen(sStatBuf));
return 0;
}
結果:Used 488M/Total 495M