64位中的内存泄漏是否需要更长时间才能导致OutOfMemoryException超过32位

时间:2014-01-08 15:42:03

标签: .net memory-leaks out-of-memory 32bit-64bit

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

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

至少有两种情况
  • 内存碎片 - 没有连续的内存块来分配大对象,因此即使看上去有足够的可用内存,也可能抛出此异常

  • 低物理内存 - 没有足够的可用内存,连续或不连续,无法分配新对象

3 个答案:

答案 0 :(得分:1)

如果在32位进程中耗尽地址空间,那么转移到64位进程将允许您运行更长时间。在耗尽地址空间之前,系统可能会耗尽页面表资源。

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

答案 1 :(得分:1)

绝对需要更长时间......

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

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

有关详细信息,请查看此post

答案 2 :(得分:0)

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

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