7

C# で記述されたアプリケーション (単一プロセス) があるとします。

デフォルトでは、アプリケーションは必要以上に巨大な仮想メモリを割り当てています (たとえば、常駐メモリは約 10 MB ですが、仮想メモリは約数 GB です)。

Java では、オプションを使用してこれを制限できます。java -mx128m

.net / mono アプリケーションで同じことを行うにはどうすればよいですか? そして、ボーナスの質問: GC オプションを強制/変更して、常にメモリ使用量をできるだけ低く保つことは可能ですか (システムがメモリ不足になっているときではなく、できるだけ早く収集します)。

基本的に私の目標は、最小限のメモリ フットプリントで .net アプリケーションを作成することです。

編集: より明確にするために、ほぼすべての .net アプリケーションに同様の問題があるように思われるため、このシナリオを挿入します。

monodevelop を実行します。これは mono の下で c# アプリケーションです。1800 MB の仮想メモリを消費しますが、常駐メモリは291 MBしか使用しません。これは、アプリケーションが 300 MB 未満のメモリしか使用していないにもかかわらず、不明な理由で 1800 MB を要求したことを意味します。この理由と、それを防ぐ方法を発見したいと思います。

これはおそらくほとんどのユーザーにとっては問題ではありませんが、タスクが仮想メモリによって制限されている場合、SGE などのクラスターで実行されているアプリケーションにとっては問題になる可能性があります。

4

1 に答える 1

3

Mono には、Java のようにメモリの上限を設定するためのフラグがいくつかあります。たとえば、クラスター ジョブを実行するときは、次の環境変数を設定します。

setenv MONO_GC_PARAMS max-heap-size=8G

ここで、この質問で利用可能なその他のオプションを確認できます。

Mono GC の max-heap-size は文書化されていません。本番環境で安全に使用できますか?

于 2013-12-17T16:59:11.983 に答える