Как ограничить память, которая может быть выделена конкретным классом? - PullRequest
3 голосов
/ 30 января 2011

Я загружаю несколько внешних сборок в свое приложение во время выполнения.И мне нужно ограничить объем памяти, который может использоваться конкретным классом, который определен в каждой из внешних сборок, например, 10 МБ на экземпляр, в противном случае мы получим OutOfMemory.

Я гуглил, как лучше всего это сделать, и нашел некоторую информацию о CLR Runtime Hosting .Кажется, это то, что мне нужно, но я не могу найти хороших примеров.

Может кто-нибудь поделиться примерами кода или, возможно, ссылками на управление памятью с помощью CLR Runtime Hosting?Или, может быть, есть лучшие решения для ограничения объема памяти на класс?

Заранее спасибо.

Ответы [ 2 ]

4 голосов
/ 30 января 2011

Это не то, что вы сможете сделать через CLR Hosting. Если вы размещаете CLR, вы можете выполнить требования выделения ресурсов от GC до Windows, например, так что вместо VirtualAlloc он использует какой-то другой распределитель. Однако хост не вызывается при каждом выделении объекта (это будет слишком дорого).

Теоретически это можно сделать с помощью API профилирования CLR. Это позволяет вам получать обратный вызов всякий раз, когда объект выделен.

Боюсь, что вы пытаетесь взглянуть на это с неправильной точки зрения. Вместо того, чтобы ограничивать объем памяти, используемый экземплярами класса, который является очень детализированным, вы могли бы вместо этого попытаться изолировать эти внешние сборки в отдельные процессы, возможно, даже ограничив их с помощью API-объектов Win32 Job Object?

0 голосов
/ 30 января 2011

Если вы стремитесь ограничить потребление памяти отдельным процессом, я думаю, что вы должны использовать свойство MaxWorkingSet класса Process. Подробнее см. http://msdn.microsoft.com/en-us/library/system.diagnostics.process.maxworkingset.aspx

...