Mat*_*lly 2 memory windows service windows-xp
我有一个C#服务作为LocalSystem帐户运行,它根据需要启动许多其他进程.这已经好几个月了.就在本周,一些子流程正在崩溃.我已经为他们附加了一个远程调试器,他们在内存分配方面失败了(C++ new operator返回0x0),这是导致崩溃的间接原因.
有趣的是,如果我将RDP插入机器,我可以轻松地从CMD启动过程没有问题.然而,当服务推出它时,没有去.
机器正在运行Windows XP SP3.它没有超出提交费用约为物理RAM的80%.
是否存在一些特殊限制:服务可以使用多少进程或多少内存,包括该服务产生的进程?
任何其他想法为什么这些进程将无法分配内存.
编辑:
我已经很好地了解了来自SysInternals的Procmon的崩溃情况,并且它没有透露任何东西(我可以看到).一切看起来都很正常,然后突然崩溃.我可以通过附加一个远程调试器确认它在从c ++新调用中取消引用空指针后崩溃了.这是应用程序中分配的第一个对象之一,它永远不会失败.
我还发现,如果启用服务选项:允许服务与桌面交互,则所有子进程都会正确启动.但是,当您通过RDP进行连接时,do会出现在桌面上,如果您通过RDP = YUK注销,则很可能会终止!但这仍然不是一个理想的解决方案 - 我真的很想知道为什么子进程在第6个子进程后无法分配内存.
小智 5
我希望这个答案能帮助将来的某个人......我遇到了同样的问题 - 如果允许窗口被渲染,应用程序可以正常运行,但如果在服务下运行并且不允许与桌面交互,则会在启动时崩溃.解决方案在于增加注册表中非交互式Windows工作站堆的大小,在我的机器上设置为512KB,而交互式Windows工作站堆为3072KB.
您可以转到此处进行更改
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\SubSystems\Windows
该值是一个长字符串.您需要更改SharedSection设置,如下所示:
个SharedSection = 1024,3072,512
第二个数字是交互式 Windows工作站堆的大小,最后一个是非交互式 Windows工作站堆的大小.如果删除最后一个数字,则交互式和非交互式Windows工作站堆将具有相同的大小.这就是我做的.
请在此处阅读详细信息:http://support.microsoft.com/kb/184802