代码之家  ›  专栏  ›  技术社区  ›  Assaf Lavie

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

  •  4
  • Assaf Lavie  · 技术社区  · 15 年前

    我可以配置我的C应用程序,将其内存消耗限制为,比如说,200MB吗? iow,我不想等待自动GC(它似乎允许堆的增长比这个应用程序实际需要的要大得多)。

    我知道在Java中有一个命令行开关,你可以传递给实现这个的JVM。C中是否有等价物?

    附笔

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

    3 回复  |  直到 14 年前
        1
  •  3
  •   Community Egal    7 年前

    我不知道常规clr有任何这样的选择。我可以想象,如果您实现自己的CLR主机,您可以控制这一点。

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

    您可以做一些事情来限制内存使用。请参阅此问题了解一些信息: Reducing memory usage of .NET applications?

        2
  •  2
  •   Tarik    15 年前

    内存管理器允许主机 提供一个接口,通过该接口 clr将请求所有内存 分配。它取代了 Windows_®内存API和标准 C clr分配例程。而且, 该接口允许CLR通知 结果的主人 未能完成特定分配(用于 例如,内存分配失败 从固定锁的螺纹上 某些可靠性后果)。它 还允许主机自定义 clr对失败分配的响应, 范围从内存不足异常 被一路抛到地上 这个过程被破坏了。主人 还可以使用此管理器重新获取 通过卸载来自clr的内存 未使用的应用程序域和强制垃圾 收集。内存管理器 接口列在

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

    编辑:

    实际上,我并不建议你自己管理内存,因为你进入的越多,你可能遇到的问题就越多,相反,clr会完美地完成这个任务。

    但如果你说我自己处理事情是很重要的,那我什么都做不到。

        3
  •  1
  •   MichaelGG    15 年前

    我没试过,但你可以打电话给我 SetProcessWorkingSetSizeEx 传递正确的标志以强制您的进程获得的内存永远不会超过这么多。我不知道GC是否会考虑到这一点,并更经常地进行清理,或者您是否只是从内存异常中解脱出来。