据我所知,没有简单的方法来control the size of the heap的一个.Net应用程序使用的control the size of the heap。 上面的链接只回答了问题的一半。当我研究同样的问题时,得到的回答是“堆增长以使用所有可用内存”,好像这是您想要控制最大堆大小的唯一原因。 在(通常是Java)服务器环境中,您不希望行为不良的应用程序占用其他托管应用程序的内存。一个简单的解决方案是限制应用程序可以用于其堆的内存量。这是通过Java的-Xmx参数来实现的,因此您可以保证应用程序不会使用超过计划的内容,例如。- Xmx 256 M。由于在初始化期间在堆上分配内存会减慢应用程序的启动速度,因此Java使用-Xms arg允许在初始化期间进行大量对象创建的应用程序以较大的堆块开始,而不是JVM不断地在堆上运行。 .Net的浏览器不具备这种能力。我怀疑这是因为.Net的虚拟机不是虚拟机。这个API恰好是一个API(我可能会补充说,它非常全面),它充当native.dll的适配器,当涉及到内存管理时,它相当于一种更像可执行文件的方法。 我问过这个关于SharePoint开发的问题,确实听说可以通过使用名为Web应用程序的IIS模块来控制堆大小,您可以告诉IIS限制给定Web应用程序的内存。我想知道这是否是因为IIS有自定义的例程,这些例程替换/覆盖new()/malloc()/etc,从而可以为客户端应用程序提供这种类型的控制。这就意味着独立的.Net应用程序不太可能成功,除非你想用C++编写一个自定义内存管理器,并为.Net创建一个接口
4条答案
按热度按时间h5qlskok1#
你不能在.Net中设置最大堆大小,除非你自己在一个进程中托管内存。
编辑:要控制CLR的内存分配(包括最大堆大小),您需要使用托管API来托管clr,特别是使用“内存管理器接口”,一些入门信息可以在这里找到MSDN Magazine, column CLR Inside Out : CLR Hosting APIs
编辑:为了回答你的问题,为什么你想控制内存分配或特别是最大堆大小,你通常不想,但如果你正在编写一个像SQL Server或IIS或一些真实的应用程序的应用程序,那么你就有一个很好的理由控制内存,特别是避免分页,否则MySQL本身和操作系统已经为你做了很好的工作,剩下的就是确保您的应用程序使用最少的资源来使事情正常工作。
0pizxfdo2#
不,它不适用于. NET。堆确实会继续增长,直到它不能再增长为止。(很明显,这是“在尝试通过GC恢复内存之后,增长堆”。)基本上,.NET GC中的调优几乎没有Java中那么多。您可以选择服务器GC或客户端GC,我认为有一个选项可以打开/关闭并发GC(我将在一分钟内找到链接),但基本上就是这样。
编辑:似乎还有一点,虽然不是一个巨大的数额。关于这件事,Rick Minerich's blog entry on GC settings和the subsequent one似乎知道得比我多。对于任何进一步的研究来说,它们可能是一个很好的起点--但它们大多是标志,而不是JVM中可用的那种内存限制。
编辑:Pop的回答提出了一个很好的观点--我一直在假设一个“正常”的虚拟主机模型(即。不在你的控制之下)。如果你想自己去托管它,你可能会得到更多的控制-以托管它的额外工作为代价。我不能说我曾经调查过这方面的事情。
nkcskrwz3#
你可能想看看System.Runtime.MemoryFailPoint。
tyu7yeag4#
据我所知,没有简单的方法来control the size of the heap的一个.Net应用程序使用的control the size of the heap。
上面的链接只回答了问题的一半。当我研究同样的问题时,得到的回答是“堆增长以使用所有可用内存”,好像这是您想要控制最大堆大小的唯一原因。
在(通常是Java)服务器环境中,您不希望行为不良的应用程序占用其他托管应用程序的内存。一个简单的解决方案是限制应用程序可以用于其堆的内存量。这是通过Java的-Xmx参数来实现的,因此您可以保证应用程序不会使用超过计划的内容,例如。- Xmx 256 M。由于在初始化期间在堆上分配内存会减慢应用程序的启动速度,因此Java使用-Xms arg允许在初始化期间进行大量对象创建的应用程序以较大的堆块开始,而不是JVM不断地在堆上运行。
.Net的浏览器不具备这种能力。我怀疑这是因为.Net的虚拟机不是虚拟机。这个API恰好是一个API(我可能会补充说,它非常全面),它充当native.dll的适配器,当涉及到内存管理时,它相当于一种更像可执行文件的方法。
我问过这个关于SharePoint开发的问题,确实听说可以通过使用名为Web应用程序的IIS模块来控制堆大小,您可以告诉IIS限制给定Web应用程序的内存。我想知道这是否是因为IIS有自定义的例程,这些例程替换/覆盖new()/malloc()/etc,从而可以为客户端应用程序提供这种类型的控制。这就意味着独立的.Net应用程序不太可能成功,除非你想用C++编写一个自定义内存管理器,并为.Net创建一个接口