32位和64位Windows版本的进程大小和行为差异

3
我正在调查一个与我的应用程序相关的奇怪问题,在两个版本的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位兼容模式运行。
我注意到的是,在XML解析在Windows XP上失败的那一点,Windows Server 2008上的进程大小只有约1GB(换句话说,大约是Windows XP上进程大小的一半)。
XML解析在Windows Server 2008上不会失败,所有内容都按预期工作。
我的问题是:
  1. 为什么在64位操作系统上以32位模式运行的应用程序会消耗一半的内存?它是真的使用了一半的内存,还是在使用虚拟内存方面有所不同,或者是其他原因?

  2. 承认我的应用程序在Windows Server 2008上似乎只使用了一半的内存,但是有没有人想过为什么在Windows XP上XML解析会失败?每次我运行测试用例时,通过IXMLDOMParseError访问的错误(参见this answer)都是不同的。由于这似乎是不确定性的,这表明我遇到了内存使用问题,而不是处理格式错误的XML。


*32 表示它正在运行在 WOW64 中,这是一个用于 32 位应用程序的兼容性层:http://en.wikipedia.org/wiki/WOW64 - Georg Fritzsche
@gf - 这是否可以解释为什么在不同操作系统上相同情况下的进程大小会有所不同? - LeopardSkinPillBoxHat
我不确定,但那么多的可能性相当小。虽然微软在这方面并没有分享太多细节:http://msdn.microsoft.com/en-us/library/aa384219%28VS.85%29.aspx - Georg Fritzsche
你是如何测量“进程大小”的?这具体是哪个计数器? - Alex Budovski
@Alex - 任务管理器中的内存(私有工作集)计数器。 - LeopardSkinPillBoxHat
你使用了哪个注册表设置? - Squashman
2个回答

1
你没有说你是如何观察进程的。我假设你使用了Taskmgr.exe。请注意,它的默认视图在内存列中给出的值非常误导人。它显示的是工作集大小,即进程正在使用的RAM量。这与你遇到的问题源——虚拟内存空间不足——无关。没有太多理由认为Windows 2008会显示与XP相同的值,因为它有一个显著不同的内存管理器。
你可以查看虚拟内存大小,使用“查看+列”选项。
你的程序在64位操作系统上不会崩溃的原因是32位进程有接近4GB的可寻址虚拟内存。在32位操作系统上,它需要与操作系统共享地址空间,只能获得2GB。如果使用/3GB启动选项,则可获得更多内存。
使用SAX解析器以避免消耗过多内存。

1
除了使用/3GB选项启动之外,单个进程还需要链接/LARGEADDRESSAWARE选项,否则它仍将被限制在2GB的虚拟地址空间内。 - R Samuel Klatchko
@RSamuel - 是的,我已经将我的应用程序与该选项链接。 - LeopardSkinPillBoxHat

0

除了之前提到的32位和64位可用内存的差异外,可能会导致你的应用程序在32位上崩溃的是连续内存的可用性。

在32位机器上,你的应用程序的DLL将散布在内存景观的前2GB中(应用程序位于0x00400000,操作系统DLL位于0x7xxx0000,其他DLL位于其他位置)。最有可能的是,你可用的最大连续块大小约为1.1GB。

在64位机器上(使用/LARGEADDRESSAWARE可以获得4GB地址空间),你将至少拥有一个2GB或更大的块。

这就是你们之间的区别。如果你的XML解析器依赖于大块内存而不是许多小块,则可能是你的XML解析器在32位上用完了连续可用空间,但在64位上没有用完。

如果您想在32位操作系统上可视化此内容,请获取VMValidator(免费)的副本,并查看虚拟视图以可视化您的内存,查看页面和段落视图以查看每个内存页面/段落的数据。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接