[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: 自动更新后内存貌似没有释放



Ming Hua 写道:
On Mon, Dec 31, 2007 at 01:40:57PM +0800, shell909090 wrote:
这句也就只针对上面说的状况才成立,就是程序运行结束后为什么空余内存很小。 因为程序在运行的时候,除了即时申请的动态堆和栈。代码区,静态数据区都是作 为文件映射到进程空间的。因此即使退出,只要没有新的内存申请,这部分内容还 会继续保留在cache中。自然在这个时候察看空余内存,会发现大量的内存被占 用,空余内存让人很抓狂。原来我曾经因为这个事情,把2G的内存(当时很大了)升 级到4G。结果不但问题没有解决,反而引发了需要重编译内核以支持大内存容量的 问题。最后查到问题关键,差点吐血。

好吧,我就把你的原文全文引在下面:

On Mon, Dec 31, 2007 at 11:01:53AM +0800, shell909090 wrote:
Linux在内存计算上比较特殊,当读取一个文件后,会一直保存在cache里面,直到
有程序需要内存才按照使用释放。因此在内存足够的情况下, Linux访问读取过的
文件的速度非常快。不过在察看系统空余内存的时候,就会非常不好看,基本都是
8M上下。一旦不足,就释放缓存。因此理论上说,只要你写个程序申请大量内存,
就会把缓存挤出来。不过这样除了使得系统性能下降,没有别的好处。

既然你都说了,程序退出后,stack 和 heap 所占的内存会释放 (我并不清楚
heap 所占的内存会不会被立即释放),为什么 "察看系统空余内存的时候,就会非
常不好看,基本都是8M上下" 会成立?难道你运行的程序都是只使用静态数据区,
使用的 stack 和 heap 都不到 8MB 的?

另外在 Linux 下查看内存是被正在运行的程序占用还是被 cache 占用是很容易的
事情 (free 命令的输出里就分得很明确),大可不必用 "最后查到问题关键,差点
吐血" 这样耸人听闻的说法吧...

呵呵……吐血的不是内存问题。
理论上说,退出程序后产生的内存应当远远大于8M。可我也不知道为什么,每次我 看的时候都是8M上下,怀疑是某个设置的问题。 让我吐血的是,我察看剩余内存计数来估算内存是否足够(很早前的时候,我刚刚 学用Linux)。然后得出2G不足,需要加到4G。好容易去加了内存,发现内核支持的 内存大小是4G不到400M。又要重编译内核。编译了内核照样不够,还是只剩下一点 内存。最后查看了一些文章,发现Linux的剩余内存始终是不足的,因为大量的空 间会被运行中读取的文件吃掉。按照这个算法,2G已经绰绰有余了。花钱花时间就 是因为不熟悉内存问题,所以气的够呛。
Ming
2007.12.30




Reply to: