我可以在32位系统上分配大于4GB的对象吗?

时间:2013-02-28 00:11:31

标签: c# java .net memory jvm

假设没有运行时或操作系统的限制。我可以分配一个大于虚拟地址空间的对象吗?

1 个答案:

答案 0 :(得分:10)

我试图在这个措辞奇怪的问题中找到一个真正的问题。这些问题怎么样?

  

假设有足够的虚拟内存空间,是否存在对.NET中对象大小的理论限制?

是。无论操作系统如何,运行时都不允许大于2 GB的单个托管对象。

  

在Windows中分配大于虚拟内存空间的内存块是否合法?

是。人们常常对这一事实感到惊讶,但请记住,虚拟内存被称为虚拟内存是有原因的;它不是真实记忆。真实内存是磁盘空间。

内存不是RAM - 这只是磁盘空间上的快速,方便的缓存。内存不是虚拟内存;虚拟内存只是一种引用内存的便捷方式。在我看来,内存最好是可视化为磁盘上交换文件中的页面。

如果你想在32位Windows中分配一个40亿字节的块,那就没问题了;操作系统将在磁盘上保留40亿个字节。然后,您可以决定如何将其映射到虚拟地址空间;它并不都适合,所以你必须自己管理映射并取消映射。雷蒙德在这里描述了如何做到这一点:

http://blogs.msdn.com/b/oldnewthing/archive/2004/08/10/211890.aspx

我不知道有任何库允许你对C#中很容易做的内存块进行操作,但是如果没有可用的内存块就不会特别困难。坦率地说,虽然我倾向于使用内存映射文件(你可以从C#中完成),而不是自己进行映射。