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

Posted

技术标签:

【中文标题】32 位与 64 位 Windows 版本上的进程大小和行为差异【英文标题】:Process sizes and differences in behaviour on 32bit vs. 64bit Windows versions 【发布时间】:2011-01-10 06:48:37 【问题描述】:

我正在调查我的应用程序的一个奇怪问题,其中行为在 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 - 任务管理器中的内存(私有工作集)计数器。 【参考方案1】:

你没有说你是如何观察这个过程的。我假设你使用了 Taskmgr.exe。请注意,它的默认视图在 Memory 列中给出了非常误导性的值。它显示工作集大小,进程正在使用的 RAM 量。这与您的问题的根源无关,虚拟内存空间不足。没有太多理由假设 Windows 2008 会显示与 XP 相同的值,它具有显着不同的内存管理器。

您还可以查看虚拟内存大小,使用 View + Columns。

您的程序不会在 64 位操作系统上崩溃的原因是 32 位进程具有接近 4 GB 的可寻址虚拟内存。在 32 位操作系统上,它需要与操作系统共享地址空间,并且只有 2 GB。如果您使用 /3GB 引导选项,则更多。

使用 SAX 解析器来避免消耗太多内存。

【讨论】:

除了使用 /3GB 选项启动之外,单个进程还需要使用 /LARGEADDRESSAWARE 选项链接,否则仍将被限制为 2GB 虚拟地址空间。 @RSamuel - 是的,我已将我的应用程序与该选项相关联。【参考方案2】:

不仅 32 位和 64 位之间的可用内存存在差异(如之前的答案中所述),而且连续内存的可用性可能会在 32 位上杀死您的应用程序。

在 32 位机器上,您的应用程序的 DLL 将在前 2GB 内存中乱扔内存(应用程序位于 0x00400000,操作系统 DLL 位于 0x7xxx0000,其他 DLL 位于其他位置)。您可用的最大连续块很可能约为 1.1GB。

在 64 位机器上(通过 /LARGEADDRESSAWARE 为您提供 4GB 地址空间),您将在 4GB 空间中至少有一个大小为 2GB 或更大的块。

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

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

【讨论】:

以上是关于32 位与 64 位 Windows 版本上的进程大小和行为差异的主要内容,如果未能解决你的问题,请参考以下文章

关于windows XP 64位与32位

WINDOWS 32位与64位系统的编程差异

Matlab 编译器链接错误(64 位与 32 位)

32位系统与64位系统

查看系统版本32位与64位生产场景中的使用及对比

Xcode 5、iOS7 和 64 位与 32 位