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

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

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

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

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

2 ответа

Решение

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

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

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

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

Другие вопросы по тегам