Ограничение размера управляемой кучи в приложении C # - PullRequest
5 голосов
/ 28 октября 2009

Могу ли я настроить свое приложение C #, чтобы ограничить потребление памяти, скажем, до 200 МБ? Я не хочу ждать автоматического GC (который, кажется, позволяет куче расти намного больше, чем это фактически требуется для этого приложения).

Я знаю, что в Java есть переключатель командной строки, который вы можете передать JVM, которая достигает этого ... есть ли эквивалент в C #?

приписка

Я знаю, что могу вызывать GC из кода, но это то, что я бы предпочел не делать периодически. Я предпочел бы установить его один раз при запуске и забыть.

Ответы [ 3 ]

4 голосов
/ 28 октября 2009

Мне не известны какие-либо такие опции для обычного CLR. Я полагаю, что вы можете контролировать это, если реализуете свой собственный хост CLR.

Однако я не согласен с вашей оценкой роста кучи. Куча растет, потому что ваше приложение выделяет объекты и удерживает их.

Есть несколько вещей, которые вы можете сделать, чтобы ограничить использование памяти. Пожалуйста, посмотрите этот вопрос для некоторого ввода: Сокращение использования памяти приложениями .NET?

2 голосов
/ 28 октября 2009

Диспетчер памяти позволяет хосту обеспечить интерфейс, через который CLR запросит всю память распределение. Он заменяет оба API памяти Windows® и стандарт C CLR процедуры распределения. Более того, интерфейс позволяет CLR информировать хозяин последствий не удается определенное распределение (для пример сбоя выделения памяти из нити, удерживающей замок, может иметь определенные последствия надежности). Это также позволяет хозяину настроить Ответ CLR на неудачное размещение, начиная от OutOfMemoryException быть брошенным до конца процесс сносится. Гостья также можете использовать этот менеджер для восстановления память из CLR путем выгрузки неиспользуемые домены приложений и принудительный сбор мусора коллекция. Диспетчер памяти интерфейсы перечислены в

Источник и ещё: http://msdn.microsoft.com/en-us/magazine/cc163567.aspx#S2

Редактировать:

На самом деле я бы не советовал вам управлять памятью самостоятельно, потому что чем больше у вас проблем, тем больше проблем вы столкнетесь, вместо этого CLR отлично справляется с этой задачей.

Но если вы говорите, что для меня очень важно справляться с проблемами самостоятельно, тогда я ничего не могу.

1 голос
/ 28 октября 2009

Я не пробовал это, но вы могли бы попытаться вызвать SetProcessWorkingSetSizeEx , передав правильные флаги, чтобы убедиться, что ваш процесс никогда не получает больше, чем столько памяти. Я не знаю, будет ли GC принимать это во внимание и чаще очищать, или вы просто получите OutOfMemoryExceptions.

...