关于 .net:64 位的内存泄漏是否需要比 32 位更长的时间才能导致 OutOfMemoryException

Does a memory leak in 64 bit take longer to cause an OutOfMemoryException than 32 bit

在跟踪我正在处理的项目中的一些内存泄漏的过程中,我还一直在努力更新各种硬件 API 库。其中一些是非托管的 32 位库,它们强制我们的应用程序编译为 x86;这本身不是问题。我正在努力将这些库升级到 64 位版本,以便我们的应用程序不必以 32 位运行,但这让我想知道内存泄漏和可寻址内存空间。

鉴于内存泄漏,在 64 位进程中运行时,应用程序理论上是否能够在遇到 OutOfMemoryException 之前运行更长的时间?这个

至少有两种情况

  • 内存碎片 - 没有连续的内存块来分配大对象,因此即使似乎有足够的可用内存也可能会引发此异常

  • 低物理内存 - 根本没有足够的可用内存(无论是否连续)来分配新对象


绝对会花更长的时间...

但是,根据您的机器和泄漏过程,多长时间会有所不同...

虽然 x64 可以支持 8TB 的内存,但您的计算机很可能不允许这样做。因此,假设您有 4GB 的内存和 12GB 的页面文件,那么您可能有大约 14GB 的内存可供分配。 (系统有一些开销阻止了完整的 16GB)

查看这篇文章了解更多信息。


如果您在 32 位进程中耗尽了地址空间,那么迁移到 64 位进程将使您运行更长的时间。在您耗尽地址空间之前,系统可能会用完页表资源。

如果您的页面文件空间不足,那么无论是 32 位还是 64 位,您的进程都将拥有相同数量的可用内存。在这种情况下,由于 64 位进程需要更多内存用于同一事物(8 字节指针),因此它实际上会比同一进程的 32 位版本更快地耗尽内存。


当然会。在 x86 系统上,您只有大约 2GB 的内存可供您的应用程序使用。当您全部泄漏时,您就完成了,无论您拥有多少物理或其他 RAM。

在x64上,它可以运行很长时间,首先耗尽交换文件,然后使系统完全停止。