我可以(或者我想)在.net中设置最大堆大小吗?

ugmeyewa  于 2023-10-21  发布在  .NET
关注(0)|答案(4)|浏览(105)

我有Java背景,我习惯的一件事是告诉JVM最大堆大小应该是多少。如果正在运行的程序试图吞下超过允许的资源,而垃圾收集器无法释放更多的资源,那么OutOfMemoryError就会被抛出,一切都会发生。因此,在Java中设置最大堆大小是很重要的。

**这是否适用于.net?**可以设置堆大小限制吗?这个机器是否只是不断地增加它的堆,直到它达到机器的物理极限?或者,由于某种微妙的原因,我的Java眼罩阻止了我看到。

h5qlskok

h5qlskok1#

你不能在.Net中设置最大堆大小,除非你自己在一个进程中托管内存。
编辑:要控制CLR的内存分配(包括最大堆大小),您需要使用托管API来托管clr,特别是使用“内存管理器接口”,一些入门信息可以在这里找到MSDN Magazine, column CLR Inside Out : CLR Hosting APIs
编辑:为了回答你的问题,为什么你想控制内存分配或特别是最大堆大小,你通常不想,但如果你正在编写一个像SQL Server或IIS或一些真实的应用程序的应用程序,那么你就有一个很好的理由控制内存,特别是避免分页,否则MySQL本身和操作系统已经为你做了很好的工作,剩下的就是确保您的应用程序使用最少的资源来使事情正常工作。

0pizxfdo

0pizxfdo2#

不,它不适用于. NET。堆确实会继续增长,直到它不能再增长为止。(很明显,这是“在尝试通过GC恢复内存之后,增长堆”。)基本上,.NET GC中的调优几乎没有Java中那么多。您可以选择服务器GC或客户端GC,我认为有一个选项可以打开/关闭并发GC(我将在一分钟内找到链接),但基本上就是这样。
编辑:似乎还有一点,虽然不是一个巨大的数额。关于这件事,Rick Minerich's blog entry on GC settingsthe subsequent one似乎知道得比我多。对于任何进一步的研究来说,它们可能是一个很好的起点--但它们大多是标志,而不是JVM中可用的那种内存限制。
编辑:Pop的回答提出了一个很好的观点--我一直在假设一个“正常”的虚拟主机模型(即。不在你的控制之下)。如果你想自己去托管它,你可能会得到更多的控制-以托管它的额外工作为代价。我不能说我曾经调查过这方面的事情。

tyu7yeag

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创建一个接口

相关问题