ubuntu 内存占用解析

来源:互联网 发布:c语言else if语句用法 编辑:程序博客网 时间:2024/05/18 00:15

ubuntu  内存占用解析

最近在使用电脑的时候,使用top 命令,发现ubuntu内存使用很紧张:

我的电脑是512 Mb的内存,可以看到使用了467Mb  还剩8Mb了,但是打开系统监视器的时候

可以看到两个内存显示不一样,到底以哪一个为准呢?仔细观察一下,命令行中的cached占用的内存161456k

加上系统监视器的306Mb,差不多就是现在内存使用的情况467Mb。

网上查了一下:

用free -m命令查看

lyh@lyh-desktop:~$ free -m
             total       used       free     shared    buffers     cached
Mem:           464        414         49          0          3        120
-/+ buffers/cache:        290        173
Swap:          445         23        422
然后第一行那个464是总共使用的内存,连cache也算进去了,不用看,第二行290才是真正的占用了。173是空闲的。

也就是说使用了290Mb的内存


参见:


Linux 内存机制

Mem:表示物理内存统计。
-/+ buffers/cached:表示物理内存的缓存统计
Swap:表示硬盘上交换分区的使用情况。只有mem被当前进程实际占用完,即没有了buffers和cache时,才会使用到swap。

Mem 行(第一行)数据说明:

Total:1035108KB。表示物理内存总大小。

Used:1008984KB。表示总计分配给缓存(包含buffers 与cache )使用的数量,但其中可能部分缓存并未实际使用。

Free:26124KB。表示未被分配的内存。

Shared:0kb。共享内存,一般系统不会用到。

Buffers:124212KB。系统分配但未被使用的buffers 数量。

Cached:413000KB。系统分配但未被使用的cache 数量。

-/+ buffers/cache 行(第二行)数据说明:

Used:471772kb,实际使用的buffers 与cache 总量,也是实际使用的内存总量。

Free: 563336kb, 未被使用的buffers 与cache 和未被分配的内存之和,这就是系统当前实际可用内存。

根据以上分析,可以得出一下结论:

1. 实际可用内存大小:

Free(-/+ buffers/cache行)= Free(Mem)+buffers(Mem)+Cached(Mem);

563336 = 26124 + 124212+ 413000

2. 已经分配的内存大小:

Used(Mem) = Used(-/+ buffers/cache)+ buffers(Mem) + Cached(Mem)

1008984kb = 471772 + 124212 +413000

3. 物理内存总大小

total(Mem)= used(-/+ buffers/cache) + free(-/+ buffers/cache)

1035108 = 471772 + 563336

二. buffer 与cache 的区别

A buffer is something that has yet to be "written" to disk.

A cache is something that has been "read" from the disk and stored for later use.

2.1 Cache

Cache:高速缓存,是位于CPU与主内存间的一种容量较小但速度很高的存储器。

由于CPU的速度远高于主内存,CPU直接从内存中存取数据要等待一定时间周期,Cache中保存着CPU刚用过或循环使用的一部分数据,当CPU再次使用该部分数据时可从Cache中直接调用,这样就减少了CPU的等待时间,提高了系统的效率。

Cache又分为一级Cache(L1 Cache)和二级Cache(L2 Cache),L1 Cache集成在CPU内部,L2 Cache早期一般是焊在主板上,现在也都集成在CPU内部,常见的容量有256KB或512KB L2 Cache。

2.2 Buffer

Buffer:缓冲区,一个用于存储速度不同步的设备或优先级不同的设备之间传输数据的区域。通过缓冲区,可以使进程之间的相互等待变少,从而使从速度慢的设备读入数据时,速度快的设备的操作进程不发生间断。

在Free命令中显示的buffer和cache,它们都是占用内存:

buffer : 作为buffer cache的内存,是块设备的读写缓冲区,更靠近存储设备,或者直接就是disk的缓冲区。

cache: 作为page cache的内存, 文件系统的cache,是memory的缓冲区

 如果cache 的值很大,说明cache住的文件数很多。如果频繁访问到的文件都能被cache住,那么磁盘的读IO 必会非常小


free命令里各项内存指标说明:


total used free shared buffers cached
Mem: 16425996 10727220 5698776 0 380904 9389832
-/+ buffers/cache: 956484 15469512
Swap: 8273464 212 8273252

其中第一行用全局角度描述系统使用的内存状况:
total——总物理内存
used——已使用内存,一般情况这个值会比较大,因为这个值包括了cache+应用程序使用的内存
free——完全未被使用的内存
shared——应用程序共享内存
buffers——缓存,主要用于目录方面,inode值等(ls大目录可看到这个值增加)
cached——缓存,用于已打开的文件
总结:
total=used+free
used=buffers+cached (maybe add shared also)

第二行描述应用程序的内存使用:
前个值表示-buffers/cache——应用程序使用的内存大小,used减去缓存值
后个值表示+buffers/cache——所有可供应用程序使用的内存大小,free加上缓存值
总结: 
-buffers/cache=used-buffers-cached
+buffers/cache=free+buffers+cached

第三行表示swap的使用:
used——已使用
free——未使用

什么是Cache Memory(缓存内存):

当你读写文件的时候,Linux内核为了提高读写性能与速度,会将文件在内存中进行缓存,这部分内存就是Cache Memory(缓存内存)。即使你的程序运行结束后,Cache Memory也不会自动释放。这就会导致你在Linux系统中程序频繁读写文件后,你会发现可用物理内存会很少。

其实这缓存内存(Cache Memory)在你需要使用内存的时候会自动释放,所以你不必担心没有内存可用。如果你希望手动去释放Cache Memory也是有办法的。

如何释放Cache Memory(缓存内存):

用下面的命令可以释放Cache Memory:

To free pagecache:
echo 1 > /proc/sys/vm/drop_caches
To free dentries and inodes:
echo 2 > /proc/sys/vm/drop_caches
To free pagecache, dentries and inodes:
echo 3 > /proc/sys/vm/drop_caches

注意,释放前最好sync一下,防止丢失数据。

参考地址:http://hi.baidu.com/yacker/item/3926ceda78032230e3108f09



原创粉丝点击