今天就跟大家聊聊有关Windows桌面堆栈耗尽该怎么办,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。
创新互联建站长期为上千余家客户提供的网站建设服务,团队从业经验10年,关注不同地域、不同群体,并针对不同对象提供差异化的产品和服务;打造开放共赢平台,与合作伙伴共同营造健康的互联网生态环境。为峰峰矿企业提供专业的成都网站建设、成都做网站,峰峰矿网站改版等技术服务。拥有10余年丰富建站经验和众多成功案例,为您定制开发。
在系统上的每个桌面对象都有与之相关联的桌面堆栈。桌面对象使用堆来存储菜单、 挂钩、 字符串,和窗口。系统将从系统范围内的 48 MB 缓冲区分配桌面堆。除了桌面的堆打印机和字体驱动程序也使用该缓冲区。
桌面机将与窗口站相关联。窗口站可包含零个或多个桌面。桌面堆分配为与窗口站的桌面的大小可以更改以下注册表值中。
注意Microsoft 不建议使用 / 3gb 开关。在 boot.ini 文件中指定了 / 3gb 开关。
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\SubSystems\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
后面的数字值"SharedSection ="控件如何桌面堆分配。这些 SharedSection 值指定以千字节为单位)。没有与交互式和非交互式窗口站的桌面的单独设置。
注意如果修改了注册表中的 SharedSection值,则系统必须重新启动之前所做的更改生效。
重要此分区、 方法,或任务包含告诉您如何修改注册表的步骤。但是,如果注册表修改不当可能会出现严重问题。因此,请确保您仔细按照这些步骤。附加的保护注册表之前先备份您对其进行修改。然后,您可以在出现问题时还原注册表。有关如何备份和还原注册表的详细信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
322756 (http://support.microsoft.com/kb/322756/ ) 如何备份和还原在 Windows 注册表
第一个 SharedSection 值 (1024) 是到所有桌面公共共享的堆大小。这包括持有句柄窗口、 菜单、 图标、 游标,和等) 和共享的系统设置全局句柄表。是不可能您将需要更改此值。
第二个 SharedSection 值 (3072) 是为与"交互式"窗口站 WinSta0 相关联的每个桌面桌面堆的大小。用户对象 (如挂接、 菜单、 字符串,和窗口会消耗此桌面堆中的内存。是不可能将需要更改此第二个 SharedSection 值。
在 $ 交互式窗口工作站中创建的每个桌面使用默认的 3072 KB 桌面堆。默认状态下,有三个台式计算机由系统创建 Winsta0 中:
Winlogon
默认的应用程序的桌面将由其"Winsta0\default"指定 STARTUPINFO.lpDesktop结构成员中的所有进程使用的"默认"。空 lpDesktop 结构成员时窗口站和桌面上继承自父进程。在本地系统帐户下选中 允许服务与桌面交互]启动选项执行的所有服务将都使用"Winsta0\Default"。所有这些进程将共享相同的桌面堆与"默认"应用程序桌面相关联。
显示屏幕保护程序时,在交互式窗口站 (WinSta0) 创建 屏幕保护程序-的屏幕保护程序桌面。
第三个 SharedSection 值 (512) 是为"非交互式"窗口站与相关联的每个桌面桌面堆的大小。如果不存在此值为非交互式窗口站桌面堆的大小将与为交互式窗口站 (第二个 SharedSection 值) 指定的大小相同。
如果仅有两个 SharedSection 值,您可以添加"、 512"作为第三个值以指定在非交互式窗口工作站中创建的台式机桌面堆的大小。
每一个用户帐户下执行的服务进程将在创建服务控制管理器 (SCM) 的非交互式窗口站收到一个新的桌面。因此,用户帐户下执行每个服务将消耗桌面堆在第三个 SharedSection 该值中指定的千字节数。在 $ 允许服务与桌面交互进行与本地系统帐户下执行的所有服务 不 选定的共享的非交互式服务窗口站 (服务-0x0 3e7 $) 中的"默认"桌面桌面堆。
在交互式和非交互式窗口站中使用的总桌面堆必须适合 48 MB 系统范围内缓冲区。
递减第二个或第三个 SharedSection 值将增加可创建在相应的窗口站的桌面机的数量。较小的值将限制挂钩、 菜单、 字符串,和可以创建一个桌面中的窗口的数。另一方面,增加第二个或第三个 SharedSection 值将减小桌面可创建的数,但它会增加的挂钩、 菜单、 字符串,和可以创建一个桌面中的窗口数。
由于 SCM 在非交互式窗口站的用户帐户下运行的每个服务进程中创建一个新的桌面,较大的桌面值的第三个 SharedSection 值将减少在系统可以成功地运行的用户帐户服务的数目。可以指定为第二个或第三个 SharedSection 值的最小值是 128。 若要使用较小的值的任何尝试将默认为 128。
桌面堆由 User32.dll 分配一个过程时需要的用户对象。如果不依赖于 User32.dll 应用程序,它将不消耗桌面堆。
注意在 Windows Server 2003,当满足下列条件之一为真时在系统事件日志中记录特定的事件:
如果桌面堆已满,会记录以下事件:
事件类型: 警告
事件源: Win32k
事件类别: 无
事件 ID: 243
日期:Date
时间:Time
用户: 不适用
计算机:ServerName
描述: A 桌面堆栈分配失败。
在这种情况下增加桌面堆的大小。
如果总的桌面堆栈将成为系统范围的缓冲区大小,会记录以下事件:
事件类型: 警告
事件源: Win32k
事件类别: 无
事件 ID: 244
日期:Date
时间:Time
用户: 不适用
计算机:ServerName
描述: 无法创建桌面堆耗尽由于的桌面。
在这种情况下减小桌面的堆大小。
在 Windows Server 2003,系统范围的缓冲区是 20 MB,当满足下列条件之一为真时:
您是在终端服务环境中。
在 Boot.ini 文件中指定了 / 3gb 开关。
补充:桌面堆栈耗尽的原因有两种一种是没有安全的调用系统动态链接库User32.dll和kernel32.dll,另外一种就是桌面堆栈真的被耗尽了。通过分析,之所以导致此问题是由于长期使用远程桌面Terminal Services 导致缓冲区只有20MB而没有满足交互式进程调用需要的48MB所导致。
附错误信息: Warning: 243:A desktop heap allocation failed.
看完上述内容,你们对Windows桌面堆栈耗尽该怎么办有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注创新互联行业资讯频道,感谢大家的支持。