我正在调查我的应用程序的一个奇怪的问题,其中2个版本的Windows的行为是不同的:
Windows XP(32位)
Windows Server 2008(64位)
我的发现如下。
Windows XP(32位)
在运行我的testing场景时,XMLparsing器在parsing一个非常大的configuration文件的过程中某个时候失败(请参阅此问题以获取更多信息)。
在失败时,进程大小约为2.3GB。 请注意,registry项已设置为允许进程超过默认的最大进程大小(在32位操作系统上)为2GB。
如何使32位Perl读取64位Windowsregistry?
为不同的起始目录configuration用于ConEmu的Cygwin
如何在linux命令行中查看进程的命令行和环境variables
在64位ubuntu编译32位汇编程序
用于了解Windows中正在运行的进程的布局(分段)的任何工具?
失败的系统是调用IXMLDOMDocument::load()失败,如上面链接的问题中所述。
Windows Server 2008(64位)
我在Windows Server 2008中运行完全相同的testing场景 – 唯一的variables是操作系统。 当我看着我的任务pipe理器下的进程,它旁边有一个* 32 ,我假设它意味着它在32位兼容模式下运行。
我注意到的是,在Windows XP上XMLparsing失败的地方,Windows Server 2008上的进程大小只有大约1GB(IOW,大约是Windows XP的一半进程大小)。
在Windows Server 2008上,XMLparsing不会失败,它一切正常。
我的问题是:
为什么32位应用程序(以32位模式运行)在64位操作系统上占用一半内存量? 是真的使用了一半的内存,它是不同的通常的虚拟内存,还是其他的东西?
确认我的应用程序(似乎)使用Windows Server 2008上的一半内存量,没有人有任何想法,为什么XMLparsing将在Windows XP上失败? 每次运行testing用例时,通过IXMLDOMParseError访问的错误(请参阅此答案 )是不同的。 因为这似乎是非确定性的,它暗示我正在遇到内存使用问题,而不是处理格式不正确的XML。
监视并在失败/退出时重新启动subprocess
在Java中获取subprocessID
有没有办法在32位计算机上执行64位程序?
无法在64位Windows 7中以较大的堆大小运行64位JVM
你没有说你如何看待这个过程。 我假设你使用了Taskmgr.exe。 请注意,默认视图在“内存”列中提供了非常具有误导性的值。 它显示了工作集大小,进程正在使用的RAM的数量。 这与您的问题的来源无关,虚拟内存空间不足。 假设Windows 2008将显示与XP相同的价值没有多少理由,它具有明显不同的内存管理器。
你也可以看到虚拟内存的大小,使用视图+列。
您的程序不在64位操作系统上弹出的原因是因为32位进程具有接近4千兆字节的可寻址虚拟内存。 在32位操作系统上,它需要与操作系统共享地址空间,并且只能获得2千兆字节。 更多,如果您使用/ 3GB启动选项。
使用SAX解析器来避免消耗太多的内存。
不仅在32位和64位之间的可用内存方面存在差异(正如前面的答案所讨论的那样),而且它的连续内存的可用性可能会在32位上消失。
在32位的机器上,你的应用程序的DLL将乱丢第一个2GB的内存(应用程序在0x00400000,操作系统DLL在0x7xxx0000,其他DLL在其他地方)的内存格局。 最有可能的最大的连续块你有可用的是大约1.1GB。
在一台64位的机器上(使用/ LARGEADDRESSAWARE可以为你提供4GB的地址空间),在这个4GB的空间中至少有一个2GB或更大的空间。
所以你有什么不同 如果您的XML解析器依赖于大量内存而不是许多小块,则可能是您的XML解析器在32位上的连续可用空间不足,但没有用完64位上的连续可用空间。
如果你想在32位的操作系统上可视化这个,获取一个VMValidator (免费)的副本,并查看虚拟视图来查看你的内存和Pages和Paragraphs视图的可视化,以查看每个内存页面/段落的数据。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。