限制C#应用程序中托管堆的大小

时间:2009-10-28 07:56:30

标签: c# .net garbage-collection

我可以配置我的C#应用​​程序将其内存消耗限制为200MB吗? IOW,我不想等待自动GC(这似乎允许堆增长远远超过此应用程序实际需要的)。

我知道在Java中有一个命令行开关,你可以传递给实现这个目的的JVM。在C#中是否有相同的东西?

P.S。

我知道我可以从代码中调用GC,但这是我不想定期做的事情。我宁愿在启动时以某种方式设置它并忘记它。

3 个答案:

答案 0 :(得分:4)

我不知道常规CLR的任何此类选项。我想如果你实现自己的CLR主机,你可以控制它。

但是,我不同意你对堆如何增长的评估。堆增长是因为您的应用程序正在分配并保留对象。

您可以采取一些措施来限制内存使用量。请参阅此问题以获得一些输入:Reducing memory usage of .NET applications?

答案 1 :(得分:2)

  

内存管理器让主机   提供一个接口,通过它   CLR将请求所有内存   分配。它取代了两者   Windows®内存API和标准   C CLR分配例程。此外,   接口允许CLR通知   主持人的后果   没有特定的分配(为   例如,内存分配失败   从持有锁的线程可能有   某些可靠性后果)。它   还允许主机自定义   CLR对分配失败的回应,   范围从OutOfMemoryException   被抛到一边   这个过程被拆除了。主人   也可以使用此经理重新获得   来自CLR的内存卸载   未使用的应用域和强制垃圾   采集。内存管理器   接口列在

来源及更多:http://msdn.microsoft.com/en-us/magazine/cc163567.aspx#S2

修改:

我实际上不会建议你自己管理内存,因为你会有更多的内容,你可能会遇到更多的问题,而CLR完全可以完成这项任务。

但如果你说我自己处理事情对我来说非常重要,那么我什么都不能。

答案 2 :(得分:1)

我没有试过这个,但你可以尝试调用SetProcessWorkingSetSizeEx传递正确的标志来强制你的进程永远不会得到更多的内存。我不知道GC是否会考虑到这一点并更频繁地清理,或者你是否只是获得OutOfMemoryExceptions。