如何增加.NET的堆大小?

21

在.NET中是否有类似于java -Xmx内存大小分配的功能?


看看这个线程:最大堆大小 - 唯一的解决方案是插入更多内存。 - weismat
2个回答

13

这篇帖子 看起来正是你想要的。

如果我正确理解MVP的发言,那么在32位系统上,无论如何都会受到1.5GB堆大小的限制,而且进程一开始就会用完它。在64位系统上,你的堆基本上是无限的,我认为没有任何主流服务器或个人电脑可以拥有比64位进程能够寻址的物理内存更多的内存。


1
如果您想将堆的大小限制为一定数量,该怎么办? - Kelly S. French
请确保将您的程序集构建为x64或Any CPU!如果您构建为x86,则即使在x64操作系统/硬件上,也会有1.5GB的限制。 - Despertar
我认为OP是在询问如何将.Net应用程序的堆限制为仅使用256MB。他想知道是否有一个参数/配置/环境变量可以做到这一点,而不仅仅是增加堆大小。 - Kelly S. French

7
据我所知,使用CLR控制.Net应用程序的堆大小没有简单的方法。
@ Dave答案中的链接只回答了问题的一半。当我研究这个问题时,回复是“堆增长以使用所有可用内存”,好像这是您想控制最大堆大小的唯一原因。
在(通常是Java)服务器环境中,您不希望一个表现不佳的应用程序牺牲其他托管应用程序的内存。一个简单的解决方案是限制应用程序可以用于其堆的内存量。这可以通过Java的-Xmx参数实现,因此您可以保证应用程序不会使用超过计划的内存,例如-Xmx256M。由于在初始化期间在堆上分配内存可能会减慢应用程序的启动速度,因此Java使用-Xms参数允许在初始化期间执行大量对象创建的应用程序从大块堆开始,而不是JVM不断调整堆大小。
.Net的CLR没有这个能力。我怀疑这是因为.Net的CLR不是虚拟机。 CLR恰好是一个API(非常全面,我必须补充说),它作为适配器服务于本地.dll,这相当于一种更像可执行文件的方法,当涉及到内存管理时。
我已经问过这个关于SharePoint开发的问题,并听说可能可以通过使用称为Web Apps的IIS模块来控制堆大小,从而告诉IIS限制给定Web应用程序的内存。我想知道这是因为IIS有定制的例程来替换/覆盖new()/malloc()/等,因此可以为客户端应用程序提供此类控制。这意味着独立的.Net应用程序没有机会,除非您想编写一个自定义内存管理器并为.Net创建一个接口。
底线是CLR程序使用托管进程放置的任何内存管理策略/控件。这就是为什么您必须从IIS内部控制C#网页的内存使用情况,因为IIS实际上是提供CLR代码执行环境的主机进程。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接