windows - 服务启动的进程无法分配内存

标签 windows windows-xp memory service

我有一个作为 LocalSystem 帐户运行的 C# 服务,它根据需要启动许多其他进程。这几个月一直很好。就在本周,一些子流程崩溃了。我已将远程调试器附加到它们,但它们在内存分配方面失败(C++ new 运算符返回 0x0),这是崩溃的间接原因。

有趣的是,如果我将 RDP 接入机器,我可以轻松地从 CMD 启动进程,没有任何问题。然而,当服务启动它时,不行。

机器运行的是 Windows XP SP3。这不是因为提交费用大约是物理 RAM 的 80%。

服务可以使用多少进程或多少内存有一些特殊限制,包括该服务产生的进程?

为什么这些进程无法分配内存的任何其他想法。

编辑:

我已经仔细查看了 SysInternals 的 Procmon 的崩溃场景,但它没有显示任何内容(我可以看到)。一切看起来都很正常,然后突然崩溃。我可以通过附加远程调试器确认它在从 c++ new 调用中取消引用空指针后崩溃。这是应用中最先分配的对象之一,它永远不会失败。

我还发现,如果我启用服务选项:允许服务与桌面交互,那么所有子进程都会正确启动。但是,当您通过 RDP 连接时,do 会出现在桌面上,不幸的是,如果您通过 RDP = YUK 注销,它就会终止!不过,这仍然不是一个理想的解决方案 - 我真的很想知道为什么子进程无法在第 6 个子进程之后分配内存。

最佳答案

我希望这个答案能对以后的人有所帮助... 我遇到了同样的问题 - 如果允许窗口呈现,应用程序将运行良好,但如果在服务下运行并且不允许与桌面交互,则会在启动时崩溃。解决办法是增加注册表中非交互式 windows station 堆的大小,在我的机器上设置为 512KB,而交互式 windows station 堆为 3072KB。

您可以通过以下方式更改它

HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\SubSystems\Windows

该值是一个长字符串。您需要更改看起来像这样的 SharedSection 设置:

SharedSection=1024,3072,512

第二个数字是交互式 windows station 堆的大小,最后一个是非交互式 windows station 堆的大小。如果删除最后一个数字,则交互式和非交互式 Windows Station 堆的大小将相同。我就是这么做的。

在此处阅读详细信息:http://support.microsoft.com/kb/184802

关于windows - 服务启动的进程无法分配内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8082813/

相关文章:

C数据结构到磁盘

windows - 为 Windows CE 安装 Docker 时出现问题

windows - 哪些 Windows 系统默认禁用命令扩展?

java - 在 FoxPro 应用程序中粘贴后,从 JTextArea 复制的文本编码已损坏

linux - 使用安装在 Linux 机器上的 Jenkins 在 IE 驱动程序上运行测试

android - 将我的设备连接到 PC 时出现问题?

php start_session() 不适用于本地主机

visual-studio-2010 - 能否在 Windows XP 上运行的 Visual Studio 中打开 Azure Web 项目 (.ccproj)?

c - 如何在共享内存中写入或读取变量?

c - free() 释放的内存中的数据会怎样?