Windows
除了使用进程来管理资源外,还是用Session
和desktop
来管理资源。 比如只有在同一个Session
里面的进程才可以共享剪贴板数据, Windows Message
只能在属于同一个desktop
的进程之间传递。 而desktop heap
,是操作系统管理的,为不同session
创建的, 由同一session
内所有desktop
共享的内存。当创建进程,创建GUI
的时候, 都会消耗desktop heap
。当Desktop Heap
用光后,系统中各种莫名其妙的问题就会发生。 比如无法创建新进程,无法弹出菜单,API
调用会莫名其妙地出错。 引用
到support.microsoft.com 上搜索desktop heap,可以找到更多的信息。
Desktop heap
用光的原因往往是太多进程同时运行,或者创建了太多GUI object
。 怀疑是Desktop heap
相关问题的时候,首先可以用下面这篇文章的方法来检查是否Desktop heap
用光: - 首先,先到 Desktop Heap Monitor Version 8.1 下载安装程式。
- 安装的时候预设会自动解压缩相关档案到 c:\kktools 目录下,但并不会自动执行。
- 接下来就直接执行以下的批次档,就可以自动完成所有应该的动作了。以下是批次档的内容:
复制代码-
- @echo off
- cd /d c:\kktools\dheapmon8.1\x86
- dheapinst.exe -y srv*http://msdl.microsoft.com/download/symbols
- dheapmon.exe -l
- dheapmon.exe > %TEMP%\dheap.txt
- start %TEMP%\dheap.txt
- dheapmon.exe -u
- dheapinst.exe -r
|
当你想看目前 Desktop Heap Size 时,直接点选批次档就可以完成所有步骤了,且批次档会自动将 driver 卸载,不会对你的电脑造成负担。
将3072 修改8192,10240,15360,20480 等数值...
MaxRequestThreads 这个参数约定了可以管理的最大线程数量,这个数量默认近为16 也有人修改此参数到80(有没有效就不得而知)
microsoft号称修改SharedSection的第二个值,即3072,把该值改成“4096”或是“8192”后就可以解决运行大量程序时报内存不足的问题。
MS把这个值叫做“desktop heap”。
如果确认是desktop heap问题后,可以参考改变注册表来做调整。 通过
regedit.exe命令进入注册表,根据一下路径查找注册表参数: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\SubSystems\Windows 其中,
Windows是一个字符串参数,默认值如下(每一部分以空格间隔): %SystemRoot%\system32\csrss.exe ObjectDirectory=\Windows SharedSection=1024,3072,512 Windows=On SubSystemType=Windows ServerDll=basesrv,1 ServerDll=winsrv:UserServerDllInitialization,3 ServerDll=winsrv:ConServerDllInitialization,2 ProfileControl=Off MaxRequestThreads=16[ 此帖被呆水瓶在2009-10-11 22:03重新编辑 ]