下面两句代码有什么区别,哪个更稳定些,内存分配成功的机率会高点?
我发现用了下面其中的一句之后,都会导致程序偶尔报内存分配失败的错误,但程序只占了几十M的内存,系统空闲内存超过2G,需要分配的对象只有几十K。
SetProcessWorkingSetSize(Process.GetCurrentProcess().Handle.ToInt32(), -1, -1);
EmptyWorkingSet(Process.GetCurrentProcess().Handle.ToInt32());
http://msdn.microsoft.com/en-us/library/windows/desktop/ms686234(v=vs.85).aspx
If both dwMinimumWorkingSetSize and dwMaximumWorkingSetSize have the value (SIZE_T)–1, the function removes as many pages as possible from the working set of the specified process.
MSDN这句我之前也看了,意思我是看懂了,但无耐操作系统的基础有点差,没弄清,这样设置后和我的页面偶尔内存分配失败的错误有什么关联。
还有就是上面两句代码的功能是否是等效的呢?
如果内存频繁分配失败,我调整SetProcessWorkingSetSize的最后一个参数,是否可以改善这种情况呢?(当然这个我可以用实践来进行测试,要是有个理论依据就更好了)
@沧海一杰: 你先找本《操作系统》的书看下,最好有介绍 Windows 的,要注意看内存管理这一章,重点了解 Windows 的虚拟内存管理机制。然后,我明天再来回答。
@Launcher: 好
@沧海一杰:
1:还有就是上面两句代码的功能是否是等效的呢?(学习要认真,如果你读 MSDN 的文章都马虎,我如何确定你仔细读过我写过的每一话呢?)
http://msdn.microsoft.com/en-us/library/windows/desktop/ms686234(v=vs.85).aspx
The working set of the specified process can be emptied by specifying the value (SIZE_T)–1 for both the minimum and maximum working set sizes. This removes as many pages as possible from the working set. The EmptyWorkingSet function can also be used for this purpose.
2:如果内存频繁分配失败,我调整SetProcessWorkingSetSize的最后一个参数,是否可以改善这种情况呢?(以 EmptyWorkingSet 和 32 位地址空间为例,并假设你了解物理内存、虚拟内存、分页、页面错误这些概念)
调用 EmptyWorkingSet 后分配失败是正常现象,修改参数并不一定增加分配成功率。EmptyWorkingSet 的行为是将进程占用的物理内存换出到虚拟内存中(换出单位是物理页面的整数倍,被换出的页的条件可能是进程没有调用的代码、数据等)。换出后,当你再次分配新的对象时,系统需要把一些代码和数据再次换进到物理内存,虽然你只是写了一条新建几十K的对象的语句,但是为了执行此语句,除了你这几十K的对象需要的内存外,系统还需要为执行代码需要的内存、以及关联的代码和数据需要的内存找到足够多的物理页面,这时候就会发生页面切换(这个时间可能会很长),而页面切换的时候就会产生页面错误(页面错误是经常发生的),由于页面切换的延时和页面错误,那么就有可能发生内存分配失败。
@Launcher: 谢谢,你的批评我会注意的
@Launcher: 这个回答 一定要赞一个!