Как ограничить память, которая может быть выделена конкретным классом?
Я загружаю несколько внешних сборок в свое приложение во время выполнения. И мне нужно ограничить объем памяти, который может использоваться конкретным классом, который определен в каждой из внешних сборок, например, 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 для получения подробной информации