您可以通过将应用程序构建到 64 位体系结构来分配超过 ~2 GB 的内存,这需要您在 Visual Studio 中创建新的构建配置,并且应用程序的构建只能在 64 位版本的 Windows 上运行. 在 .NET 中,为您的应用程序使用默认的“任何 CPU”构建选项,我发现我只能从堆中分配大约 1.5 GB 的内存(即使在 64 位 Windows 机器上),这是因为应用程序实际上只有在“Any CPU”模式下内置时才能在 32 位模式下运行。但是通过编译到 x64 架构,您可以在应用程序执行期间从堆中分配更多的内存,我将在下面解释如何为您的应用程序创建 x64 构建:
同样,在您的 .NET 项目中使用普通(默认)“任何 CPU”构建选项,您的应用程序将始终在 32 位模式下运行,即使在 64 位 Windows 操作系统上也是如此。因此,在应用程序执行期间,您将无法分配超过 1.5 到 2 GB 的 RAM 内存。要在真正的 64 位模式下运行 .NET 应用程序,您需要进入构建配置管理器并为 x64 体系结构创建一个构建类型,然后使用该构建类型显式地为 x64 重新编译您的程序。可以使用以下步骤为您的 .NET 解决方案创建 x64 构建模式选项:
-
在 Visual Studio“解决方案资源管理器”窗格中,右键单击解决方案图标并从弹出菜单中选择“配置管理器”选项。这将打开 .NET 解决方案文件的构建“配置管理器”对话框窗口。
-
在构建“配置管理器”对话框的右侧顶部,单击向下箭头并选择“<new>”选项。这将打开“新解决方案平台”对话框。
-
在“新建解决方案平台”对话框中,对于“平台”选项,从下拉菜单中选择“x64”。然后单击“确定”按钮,新的 x64 构建选项现在将在“配置管理器”对话框中可用。
-
然后,在“配置管理器”对话框中,在“Active Solution Platform”下拉菜单中选择“x64”。单击“关闭”按钮。
-
在 Visual Studio“解决方案资源管理器”窗格中,右键单击 CS 项目图标并从弹出菜单中选择“属性”选项(此菜单底部的最后一个选项)。这将打开 CS 项目属性窗口。
-
在 CS 项目属性窗口的左侧,单击“构建”选项卡以显示代码项目的构建属性。在此窗口的顶部,请注意“平台”现在应该显示“x64”(而不是默认的“任何 CPU”选项)。如果“平台”下拉菜单未显示“x64”,您现在应该选择它。
-
然后只需构建您的代码,在“bin”文件夹中,您现在应该有一个 x64 文件夹,其中包含应用程序的新 64 位构建。
在 64 位 Windows 操作系统上使用 64 位构建的应用程序将允许您的程序分配超过 ~2GB 的内存,大概最多 2^64 个地址空间(如果您有可用的 RAM 和磁盘空间,这是截至撰写本回复时的真正限制因素)。
如果您的应用程序中的内存仍然不足,您还可以增加 Windows 内存页面文件的大小。在 Windows 上,如果 RAM 内存空间用完,页面文件允许操作系统将内存从 RAM 转移到磁盘。但是将部分 RAM 内存移入和移出磁盘会花费大量时间,因此它可能会对应用程序的性能产生真正的影响。无论性能如何,通过增加页面大小,您可以(理论上)使页面文件与 Windows 机器的 C: 驱动器上的可用空间一样大。在这种情况下,您的应用程序将能够在程序执行期间分配,例如,最多 4 TB 的内存(或您的页面文件大小设置的任何内存量)。要更改 Windows 机器的页面文件设置,
-
右键单击“这台电脑”并在弹出菜单中选择“属性”选项,打开“系统属性”对话框。这也可以在更高版本的 Windows(Windows 10、Win 2012 Server 等)中通过转到“开始”>“控制面板”>“系统和安全”>“系统”来完成。
-
在“系统”对话框的左侧,单击“高级系统属性”选项。这将显示 Windows 旧版“系统属性”对话框的“高级”选项卡。
-
在“系统属性”对话框的“高级”选项卡上,单击“性能”框中的“设置”按钮。这将打开“性能选项”对话框。
-
在“性能选项”对话框中,单击“高级”选项卡以查看 Windows 内存页面文件的当前大小设置。
-
要增加页面文件大小,请单击“更改”按钮,将打开“虚拟内存”对话框。
-
在“虚拟内存”对话框中,选择“C:”驱动器,然后在“自定义大小”下,设置“初始”和“最大”大小。您可以使用 C: 驱动器上最大可用空间量的任何大小,但进行此更改将为硬盘驱动器上的页面文件保留该空间。
-
然后在所有对话框上单击“确定”以提交新设置。然后重新启动计算机以确保所有更改都已正确完成并且新的页面文件设置正在运行。
无论如何,我希望这可以帮助人们理解为什么他们会在 .NET 应用程序中遇到这个 1.5 - 2 GB 内存限制问题,即使在 64 位 Windows 机器上运行也是如此。这对人们来说可能是一个非常令人困惑的问题,我希望我的解释是有道理的。如果需要,请随时向我发送有关此答案的问题。