【问题标题】:how can I limit the memory size for .net / mono process如何限制 .net / mono 进程的内存大小
【发布时间】:2013-03-29 10:27:41
【问题描述】:

假设你有一个用 c# 编写的应用程序(单个进程)

默认情况下,应用程序分配了巨大的虚拟内存,远远超过它的需要(例如,常驻内存约为 10mb,而虚拟内存约为几 GB)。

在 Java 中,可以使用java -mx128m 来限制这一点

我怎样才能为 .net/mono 应用程序做同样的事情? 还有一个额外的问题:是否可以强制/更改 GC 选项以始终保持尽可能低的内存使用率(收集为尽快,而不是在系统内存不足时)

基本上我的目标是创建一个内存占用最少的 .net 应用程序

编辑:为了更清楚,我插入了这个场景,因为几乎每个 .net 应用程序似乎都有类似的问题:

我运行一个 monodevelop,它是 mono 下的 c# 应用程序 - 它占用 1800 MB 的虚拟内存,而它只使用 291 MB 的常驻内存。这意味着该应用程序仅使用了不到 300MB 的内存,但它出于未知原因要求使用 1800MB。这个原因是我想发现的以及如何防止它这样做的方法。

这对大多数用户来说可能不是问题,但当任务受虚拟内存限制时,对于在 SGE 等集群上运行的应用程序可能会出现问题。

【问题讨论】:

  • 搞清楚为什么应用程序分配这么多虚拟内存不是更好吗?而不是仅仅设置一个开关来使其内存不足?
  • 你没有理解这个问题,或者我没有正确提问。这不是关于某个应用程序,而是关于所有 .net 应用程序。 Java 有这个开关,它为虚拟内存设置了一个限制,迫使它使用尽可能少的内存。这在任务受虚拟内存限制的高级集群(例如 SGE)上非常有用。我的问题是 .Net 是否有类似的可能性,以便 GC 在内存耗尽时比整个系统更快地陷入困境
  • @CodyGray 应用程序当然会分配如此多的内存,因为这对于 .net 来说是很自然的,就像任何其他使用垃圾收集器的语言一样自然 - 它不会释放内存,除非它需要释放内存并分配大量虚拟内存,而仅使用少量常驻内存,Java 中简单的“Hello world”应用程序可能会占用多达几 GB 的操作内存 - 这取决于解释器的配置 - 请参阅 stackoverflow.com/questions/561245/…
  • 在某些时候,如果您告诉我问题上不清楚的地方,而不是投反对票,或者很难回答这个问题,它会更有用吗?这是一个真正的问题 - 显然每个 .net / mono 应用程序都面临着它,根据我的 monodevelop 示例。即使是消耗大约 30mb 常驻内存的非常简单的应用程序也会消耗多达 2gb 的虚拟内存。为什么?
  • 我对 .Net 的这种行为有几个问题,其中之一是我的应用程序相对简单,占用的驻留内存不到 50mb。但是我需要在内存受限的 SGE 集群上运行它。默认为 200mb 的虚拟内存。但是,此单声道应用程序无法启动,除非虚拟内存限制未设置为至少 900mb。为什么我必须为永远不会占用超过 100mb 常驻内存的东西申请 900mb 的运行内存?

标签: .net memory mono


【解决方案1】:

Mono 有几个标志用于设置内存的上限,例如 java。例如,当我运行集群作业时,我设置了以下环境变量。

setenv MONO_GC_PARAMS max-heap-size=8G

您可以在此处查看此问题的更多可用选项:

Mono GC max-heap-size isn't documented. Is it safe to use in production?

【讨论】:

    猜你喜欢
    • 2019-08-28
    • 1970-01-01
    • 2012-10-30
    • 2010-09-17
    • 2016-08-23
    • 2014-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多