【问题标题】:How to limit a memory that can be allocated by a specific class?如何限制特定类可以分配的内存?
【发布时间】:2011-06-18 02:07:57
【问题描述】:

我在运行时将几个外部程序集加载到我的应用程序中。而且我需要限制每个外部程序集中定义的特定类可以使用的内存量,例如,每个实例 10 mb,否则我们会得到 OutOfMemory。

我已经用谷歌搜索了执行此操作的最佳方法,并找到了一些关于 CLR Runtime Hosting 的信息。这似乎是我需要的东西,但我找不到任何好的例子。

任何人都可以分享代码示例或一些关于使用 CLR 运行时托管的内存管理的链接吗? 或者也许有一些更好的解决方案来限制每个类的内存量?

提前致谢。

【问题讨论】:

  • 这是一个有趣的话题。但是,您能否详细说明一下为什么要按班级进行?如果您从类实例中解放思想,也许还有其他明显的解决方案。
  • 实际上,对每个班级进行限制并不是那么重要。一个确切类型的类是我唯一要实例化的东西,这就是为什么我的想法被类实例“锁定”了:)。例如,我可以在 appdomain 中做到这一点(在 appdomain 中创建每个实例),但我找不到限制每个 appdomain 内存的方法 :(。我的目标是以某种方式限制可用于“外部”的内存开发者”。

标签: .net memory-management clr clr-hosting


【解决方案1】:

如果您的目标是限制单个进程的内存消耗,我认为您应该使用 Process 类的“MaxWorkingSet”属性。详情见http://msdn.microsoft.com/en-us/library/system.diagnostics.process.maxworkingset.aspx

【讨论】:

【解决方案2】:

这不是您可以通过 CLR Hosting 完成的事情。如果您托管 CLR,则可以满足从 GC 到 Windows 的分配要求,例如因此它使用其他分配器而不是 VirtualAlloc。但是,每次分配对象时都不会调用主机(这太昂贵了)。

理论上,您可以通过使用 CLR Profiling API 来完成此操作。它确实允许您在分配对象时接收回调。

不过,我担心您试图从错误的角度来看待这个问题。您是否可以尝试将这些外部程序集隔离到单独的进程中,甚至可能使用 Win32 作业对象 API 限制它们,而不是限制类实例使用的内存量,这非常精细?

【讨论】:

  • 理论上,可以有数百个这样的程序集,并且它们处于某种交互中。这就是为什么我害怕将它们中的每一个隔离到一个单独的过程中。但是,当然,如果除了每个进程之外没有更多选项来限制内存,我别无选择:) 感谢您的回复
  • 根据我的经验,在这些情况下的标准过程是在单独的进程中运行多个插件程序集,也许每个都在单独的 AppDomain 中。一般来说,你可能有你信任的“你的”代码和你不信任的“其他”代码,所以没有太多的隔离层。
猜你喜欢
  • 2017-08-01
  • 1970-01-01
  • 2010-12-26
  • 2018-03-30
  • 2012-11-21
  • 1970-01-01
  • 2019-03-05
  • 2021-11-23
  • 1970-01-01
相关资源
最近更新 更多