Dan <dgadda@asu.edu> 写道
> 是否有命令可以将已释放的内存还给操作系统?
> 任何建议都会非常有帮助。
我写过一些内存管理器,它们可以将未使用的内存释放给操作系统(Unix、Windows、OpenVMS),事后看来,这可能不值得费这个麻烦。 这里有一个关键问题:你期望通过释放内存获得什么好处?
请注意,释放的内存量必须相当大,才能对计算机的整体性能产生显著影响:如果你放弃 8KB 左右的内存,操作系统不会感激涕零。 如果在程序终止前仅几分钟才收回几个兆字节的内存,操作系统也不会受益太多;在宏大的计划中,十兆字节秒算不上什么。
那么,这对能够有效地将内存释放给操作系统的程序有什么启示呢?它必须是一种以某种“阶段”运行的程序,其中需要大量内存的阶段之后是一个内存需求量大大减少但运行时间很长的阶段。 这样的程序确实存在——我们可以想象,例如,一个程序在计算后期阶段所需的单个值时操作了数千个 1000x1000 的矩阵,但在初始计算完成后不需要保留这些多兆字节的矩阵。 根据我的经验(不可否认并不详尽),这样的程序非常罕见——并非不存在(我无意在这里引发一场轶事大战),但确实是例外,而不是规则。
请记住,在虚拟内存操作系统中,已分配但未使用的内存成本相对较低:如果它在一段时间内未被引用,它将迁移到交换空间,只是占用磁盘上的某些空间,但不会阻止操作系统和其他程序访问物理 RAM。 除非你的交换空间不足,否则这不会有太大区别——如果交换空间确实稀缺,你可能还有其他问题。
与保留空闲内存相比,释放内存有一个明显的好处:当你再次需要它时,操作系统可以给你一大块新清零的页面,而不是从分页磁盘仔细检索数兆字节的垃圾,只是为了让你覆盖它们。 能够告诉操作系统“我不再关心此内存块中的数据”的程序似乎相当普遍,但好处很少是巨大的——如果巨大,许多系统有(不便携但有用)的方法来提供帮助,但通常不是在通用分配器的框架内。
总而言之:释放内存通常帮助不大,而在可能的情况下,通常还有其他问题会促使系统特定的解决方案。 IMHO,YMMV,等等。
--
Eric Sosman