首页 新闻 会员 周边

SetProcessWorkingSetSize和EmptyWorkingSet有什么区别?

0
悬赏园豆:30 [已解决问题] 解决于 2013-12-20 17:41

下面两句代码有什么区别,哪个更稳定些,内存分配成功的机率会高点?

我发现用了下面其中的一句之后,都会导致程序偶尔报内存分配失败的错误,但程序只占了几十M的内存,系统空闲内存超过2G,需要分配的对象只有几十K。

SetProcessWorkingSetSize(Process.GetCurrentProcess().Handle.ToInt32(), -1, -1);
EmptyWorkingSet(Process.GetCurrentProcess().Handle.ToInt32());

空明流光的主页 空明流光 | 初学一级 | 园豆:106
提问于:2013-12-18 17:53
< >
分享
最佳答案
0

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.

收获园豆:30
Launcher | 高人七级 |园豆:45045 | 2013-12-18 17:57

MSDN这句我之前也看了,意思我是看懂了,但无耐操作系统的基础有点差,没弄清,这样设置后和我的页面偶尔内存分配失败的错误有什么关联。

还有就是上面两句代码的功能是否是等效的呢?

如果内存频繁分配失败,我调整SetProcessWorkingSetSize的最后一个参数,是否可以改善这种情况呢?(当然这个我可以用实践来进行测试,要是有个理论依据就更好了)

空明流光 | 园豆:106 (初学一级) | 2013-12-18 18:02

@沧海一杰: 你先找本《操作系统》的书看下,最好有介绍 Windows 的,要注意看内存管理这一章,重点了解 Windows 的虚拟内存管理机制。然后,我明天再来回答。

Launcher | 园豆:45045 (高人七级) | 2013-12-18 18:07

@Launcher: 好

空明流光 | 园豆:106 (初学一级) | 2013-12-18 18:08

@沧海一杰:

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 | 园豆:45045 (高人七级) | 2013-12-19 09:43

@Launcher: 谢谢,你的批评我会注意的

空明流光 | 园豆:106 (初学一级) | 2013-12-19 09:54

@Launcher:  这个回答 一定要赞一个!

Zery | 园豆:6151 (大侠五级) | 2013-12-20 17:57
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册