这篇帖子 看起来正是你想要的。 如果我正确理解MVP的发言,那么在32位系统上,无论如何都会受到1.5GB堆大小的限制,而且进程一开始就会用完它。在64位系统上,你的堆基本上是无限的,我认为没有任何主流服务器或个人电脑可以拥有比64位进程能够寻址的物理内存更多的内存。
据我所知,使用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代码执行环境的主机进程。