本文讨论称为桌面堆的资源的限制。 当此资源耗尽时,它可能会导致图形故障、内存不足错误和意外行为。
原始 KB 数: 947246
识别桌面堆耗尽的症状
当桌面堆耗尽时,你可能会在事件日志中看到事件,例如:
Log name: System
Event ID: 243
Level: Warning
Source: Win32k
Description: A desktop heap allocation failed.
在较新版本的Windows中,该事件包括更多详细信息:
Log name: System
Event ID: 243
Level: Warning
Source: Win32k
Description: A desktop heap allocation failed. Process ID: 14012. Process name: conhost.exe. Thread ID: 14260. Session ID: 0
此事件每会话只记录一次,因此,在用户首次注意到症状之前,可以记录事件数分钟甚至数小时。
计算机上的每个会话都有自己的桌面堆。 登录到系统的每个用户都有自己的桌面堆。 会话 0 是后台服务运行的独立会话,具有自己的桌面堆。
当用户的桌面堆耗尽时,该用户可能会遇到图形故障,例如窗口未按预期显示。 或者窗口可能显示,但它可能缺少某些元素,例如按钮、滚动条等。
桌面堆的默认大小通常足以供大多数用户使用,但同时打开许多应用程序窗口时,桌面堆耗尽仍可能发生。
当会话 0 的桌面堆耗尽时,它可以对整个系统产生负面影响,对所有已登录用户产生负面影响。 由于会话 0 不应包含任何图形元素,因为它对用户不可见,因此会话 0 的桌面堆与标准用户相比非常小。
切勿忽略此警告,尤其是在会话 0 中发生桌面堆耗尽时。 会话 0 的桌面堆耗尽可能是许多表面上无关的行为的根本原因,而且很难诊断。
发生这种情况时,用户还可能会看到其他通用的“内存不足”错误消息,因为应用程序尝试创建新窗口但无法执行此操作。
桌面堆耗尽的原因
此问题因桌面堆限制而发生。 关闭某些窗口,然后尝试打开其他窗口时,这些窗口可能会打开。 但是,此方法不会影响桌面堆限制。 会话 0 是一个特别会议。 当桌面堆耗尽发生在会话 0 中时,可能会导致整个系统中出现不期望和意外的行为。
如何修改桌面堆大小以修复错误
重要
此部分(或称方法或任务)介绍了修改注册表的步骤。 但是,注册表修改不当可能会出现严重问题。 因此,按以下步骤操作时请务必谨慎。 作为额外保护措施,请在修改注册表之前先将其备份。 如果之后出现问题,您就可以还原注册表。 有关如何备份和还原注册表的详细信息,请参阅:如何备份和还原 Windows 中的注册表。 通常情况下,不要增加桌面堆的大小。 仅在必要时增加它。 此外,不能修改会话 0 桌面堆。 以下信息仅适用于用户桌面堆。
若要解决此问题,请按照以下步骤修改桌面堆大小:
-
选择**“开始”**,在*“开始搜索*”框中键入 regedit,然后在“程序”列表中选择 regedit.exe。
注意
如果系统提示输入管理员密码或进行确认,请键入密码,或选择“ 继续”。
-
找到并选择
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\SubSystems注册表子项。 -
右键单击 Windows 条目,然后选择“ 修改”。
-
在“编辑字符串”对话框的“值数据”部分中,找到该
SharedSection条目,然后增加第二个值和此项的第三个值。注意
- 注册表项的第
SharedSection二个值是与交互式窗口工作站关联的每个桌面的桌面堆的大小。 在交互式窗口工作站(WinSta0)中创建的每个桌面都需要分配堆。 该值以 KB 为单位。 - 第三
SharedSection个值是与非交互窗口工作站关联的每个桌面的桌面堆的大小。 该值以 KB 为单位。 - 不要为第二
SharedSection个值设置超过 20480 KB 的值。
- 注册表项的第
默认情况下,Windows 注册表项在基于 x86 的 Windows 7 Service Pack 1 版本中包含以下数据。
%SystemRoot%\system32\csrss.exe ObjectDirectory=\Windows SharedSection=1024、12288,512 Windows=开启 SubSystemType=Windows ServerDll=basesrv,1 ServerDll=winsrv:UserServerDllInitialization,3 ServerDll=winsrv:ConServerDllInitialization,2 ProfileControl=Off MaxRequestThreads=16
Windows 7 Service Pack 1 (64 位) / Windows Server 2008 R2, 2012 R2 (64 位)
SharedSection=1024,20480,768
内存分配在以后的操作系统中是动态的。 内存分配没有限制。 但是,如果将过多的内存分配给桌面堆,则可能会影响性能。 因此,不应设置超过 20480 的值。
注意
计算机上的物理 RAM 不会影响桌面堆大小。 无法通过添加物理 RAM 来提高性能。