---
title: "假优化内存问题"
id: "267"
type: "post"
slug: "%e5%81%87%e4%bc%98%e5%8c%96%e5%86%85%e5%ad%98%e9%97%ae%e9%a2%98"
published_at: "2016-03-05T20:10:41+00:00"
modified_at: "2017-01-28T14:49:42+00:00"
url: "https://seq.ink/all/267.html"
markdown_url: "https://seq.ink/all/267.html.md"
excerpt: "EmptyWorkingSet SetProcessWorkingSetSize EmptyWorkingSet：申请大量的内存来强制Windows丢弃缓存数据，并且将程序数据写入页面文件。然后再释放申请的内存，从而降低内存用量。这确实能够释放内存，使内存空闲。然而当你要运行的程序便不得不从页面文件中读取所需数据，从而话费更长的时间。任何用于缓存的内存都可以被丢弃，于是Windows便不得不从硬盘中取得它所需的数据。增加了windows对硬盘的读取次数，使硬盘更加高速的运转。 SetProcessWorkingSetSize：使用这个函数来设置应用程序最小和最大的运行空间,只会保留需要的内存.当应用程序被闲置或系统内存太低时,操作系统会自动调用这个机制来设置应用程序的内存.应用程序也可以使用 VirtualLock 来锁住一定范围的内存不被系统释放;当你加大运行空间给应用程序,你能够得到的物理内存取决于系统,这会造成其他应用程序降低性能或系统总体降低性能,这也可能导致请求物理内存的操作失败,例如:建立 进程,线程,内核池,就必须小心的使用该函数. 实际上SetProcessWorkingSetSize是强制把进程的物理内存搬到虚拟内存中. 潜在的危害：当SetProcessWorkingSetSize将应用程序占用的内存移至虚拟内存,一旦,应用程序被激活或者有操作请求时,这些内存又会被重新占用.如果你强制使用该方法来设置程序占用的内存,那么可能在一定程度上反而会降低系统性能,因为系统需要频繁的进行内存和硬盘间的页面交换。通俗点讲，如果你频繁使用了SetProcessWorkingSetSize,意味着你的硬盘将每秒将 I/O 大量数据;硬盘的磁针将拼命旋转，这也就是之前有不少内存优化插件提示，不要频繁调用的原因。"
taxonomy_category:
  - "ALL"
  - "Coding代码堆"
---

EmptyWorkingSet

SetProcessWorkingSetSize

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

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

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