ALL / Coding代码堆 · 2016年3月6日

假优化内存问题

EmptyWorkingSet

SetProcessWorkingSetSize

EmptyWorkingSet:申请大量的内存来强制Windows丢弃缓存数据,并且将程序数据写入页面文件。然后再释放申请的内存,从而降低内存用量。这确实能够释放内存,使内存空闲。然而当你要运行的程序便不得不从页面文件中读取所需数据,从而话费更长的时间。任何用于缓存的内存都可以被丢弃,于是Windows便不得不从硬盘中取得它所需的数据。增加了windows对硬盘的读取次数,使硬盘更加高速的运转。

SetProcessWorkingSetSize:使用这个函数来设置应用程序最小和最大的运行空间,只会保留需要的内存.当应用程序被闲置或系统内存太低时,操作系统会自动调用这个机制来设置应用程序的内存.应用程序也可以使用 VirtualLock 来锁住一定范围的内存不被系统释放;当你加大运行空间给应用程序,你能够得到的物理内存取决于系统,这会造成其他应用程序降低性能或系统总体降低性能,这也可能导致请求物理内存的操作失败,例如:建立 进程,线程,内核池,就必须小心的使用该函数.
实际上SetProcessWorkingSetSize是强制把进程的物理内存搬到虚拟内存中.

潜在的危害:当SetProcessWorkingSetSize将应用程序占用的内存移至虚拟内存,一旦,应用程序被激活或者有操作请求时,这些内存又会被重新占用.如果你强制使用该方法来设置程序占用的内存,那么可能在一定程度上反而会降低系统性能,因为系统需要频繁的进行内存和硬盘间的页面交换。通俗点讲,如果你频繁使用了SetProcessWorkingSetSize,意味着你的硬盘将每秒将 I/O 大量数据;硬盘的磁针将拼命旋转,这也就是之前有不少内存优化插件提示,不要频繁调用的原因。