@
LotusChuan 1. 那些缓冲加速用的进程,在设计上就给了很低的重要性,内存不足的时候首先会把它们杀掉;
2. 系统内核里哪里有虚表的概念,那是 C++之类的语言为了实现多态而引入的设计。程序可以向系统申请一定大小的内存,可以是私有的,也可以是共享的(例如多个程序使用了同一个动态链接库)。如果没有 swapfile 这种设计,内存不足时其他程序当然就申请不到内存了。
当然我知道你想说的第二点是什么,其实这对应 Windows 的“提交大小”。也就是程序向系统申请的内存大小,而不是放在物理内存中的那部分大小。
但排查有没有发生内存泄漏的时候当然就是关注这个指标(即程序向系统申请的内存大小,而不是实际使用的),毕竟物理内存可能只有 8GB ,但程序却申请了 10GB ,其中一大半在 swapfile 里面。你去查看程序使用的物理内存大小,那永远不可能超过 8GB 。
这时候还要骗自己“它占的物理内存没有增加,所以没有内存泄漏”吗?
内存不足的时候,泄漏的这部分内存页面根据最近最少使用机制,当然优先被放进 swapfile 了。而且因为内存泄漏之后,程序逻辑里没办法访问它们,所以它们也没有机会再被放进物理内存中。
硬盘上多了一段永远不会用到的数据,大多数时候当然不会让系统变卡。当然,新程序启动的时候,或者程序打开一些文件的时候,系统把物理内存中的数据(也包括泄漏的部分)写到硬盘里,这时候会比以往要慢一些。
但因为大多数时候启动一个程序或者打开一个比较大的文件都得花上不少时间,稍微多个一两百毫秒,用起来根本没什么感觉。所以并不能根据“内存用了这么多还不卡”的主观感受来判断是不是内存泄露。
至于我有没有证据证明内存没有回收,你可以关注一下硬盘可用空间的大小,硬盘的写入量统计信息,以及为什么这个论坛里不少用户一星期要重启一次电脑。当然也有人不信,觉得 smartctl 的数据是假的。那就没有什么办法了。