【发布时间】:2023-03-04 23:31:01
【问题描述】:
我正在调查我的应用程序的一个奇怪问题,其中行为在 2 个版本的 Windows 上有所不同:
- Windows XP(32 位)
- Windows Server 2008(64 位)
我的发现如下。
Windows XP(32 位)
运行我的测试场景时,XML 解析器在解析非常大的配置文件期间的某个时间点失败(有关详细信息,请参阅this question)。
发生故障时,进程大小约为 2.3GB。请注意,已将注册表项设置为允许进程超过默认的最大进程大小 2GB(在 32 位操作系统上)。
失败的系统是对IXMLDOMDocument::load()的调用失败,如上面链接的问题中所述。
Windows Server 2008(64 位)
我完全在 Windows Server 2008 中运行相同的测试场景——唯一的变量是操作系统。当我在任务管理器下查看我的进程时,它旁边有一个* 32,我假设这意味着它在 32 位兼容模式下运行。
我注意到的是,在 Windows XP 上 XML 解析失败时,Windows Server 2008 上的进程大小只有大约 1GB(IOW,大约是 Windows XP 上的一半)。
XML 解析在 Windows Server 2008 上不会失败,一切正常。
我的问题是:
为什么 32 位应用程序(在 32 位模式下运行)会消耗 64 位操作系统上一半的内存量?是真的用了一半的内存,还是普通的虚拟内存不一样,还是别的什么?
承认我的应用程序(似乎)在 Windows Server 2008 上使用了一半的内存量,有没有人知道为什么 XML 解析会在 Windows XP 上失败?每次我运行测试用例时,通过
IXMLDOMParseError(见this answer)访问的错误都是不同的。因为这似乎是不确定的,所以这表明我遇到了内存使用问题,而不是处理格式错误的 XML。
【问题讨论】:
-
*32表示它在 WOW64 中运行,这是 32 位应用程序的兼容层:en.wikipedia.org/wiki/WOW64 -
@gf - 这能解释为什么不同操作系统上相同场景的进程大小不同吗?
-
我不确定,但这不太可能。并不是说 MS 在这方面分享了太多细节:msdn.microsoft.com/en-us/library/aa384219%28VS.85%29.aspx
-
您如何衡量“流程规模”?这到底是哪个计数器?
-
@Alex - 任务管理器中的内存(私有工作集)计数器。
标签: windows xml memory-management 64-bit 32-bit