Когда нужно собирать объекты с помощью C#? Любой хороший ex ...Когда нужно собирать объекты?
Что такое pro и con для поддержания пула часто используемых объектов и захвата одного из пула вместо создания нового?
Когда нужно собирать объекты с помощью C#? Любой хороший ex ...Когда нужно собирать объекты?
Что такое pro и con для поддержания пула часто используемых объектов и захвата одного из пула вместо создания нового?
Есть только два типа ресурсов, о которых я могу думать, которые обычно объединяются: потоки и соединения (т. Е. В базу данных).
У обоих из них есть одна общая проблема: Недостаток.
Таким образом, основной причиной, по которой вы хотите создать пул ресурсов, является то, что вы можете позволить себе иметь ограниченное число из них в любой момент времени.
Я хотел бы добавить фрагментации памяти к списку. Это может произойти при использовании объектов, которые инкапсулируют собственные ресурсы, которые после их выделения не могут быть перемещены сборщиком мусора и могут потенциально фрагментировать кучу.
Один реальный пример - это когда вы создаете и уничтожаете множество сокетов. Буферы, которые они используют для чтения/записи данных, должны быть закреплены для переноса в собственный API WinSock, что означает, что при сборе мусора, даже если часть памяти исправлена для сокетов, где они были уничтожены, - это может оставить память в фрагментированном состоянии, так как GC не может сжать кучу после сбора. Таким образом, буферы чтения/записи являются основными кандидатами для объединения. Кроме того, если вы используете объекты SocketEventArgs, они также будут хорошими кандидатами.
Вот good article, который рассказывает о процессе сбора мусора, уплотнении памяти и о том, почему помогает пул объектов.
Существует замечательная статья журнала MSDN, озаглавленная «Восстановить утраченное искусство оптимизации памяти» в управляемом коде Эрика Брауна. http://msdn.microsoft.com/en-us/magazine/cc163856.aspx. Он включает пул объектов общего назначения с тестовой программой. Этот пул объектов поддерживает минимальные и максимальные размеры. Я не могу найти ссылки на людей, использующих это в производстве. Кто-нибудь сделал это? Кроме того, имея дело с фрагментацией памяти в приложении ASP.NET, я могу засвидетельствовать значение в ответе Мики Динеску. Кроме того, немного уточнив ответ Виталия, рассмотрим случай больших объектов (т. Е.> 85K), которые очень дороги для создания. Большие объекты участвуют только в сборке мусора Gen 2. Это означает, что они не будут собраны так быстро, как объекты, которые полностью участвуют в сборке мусора в Gen 0 и Gen 1. Эта статья Куча больших объектов, не открытая Maoni Stephens в http://msdn.microsoft.com/en-us/magazine/cc534993.aspx, объясняет подробно кучу объектов.
Для игр GC может ввести нежелательную задержку в некоторых ситуациях.Если это так, повторное использование объектов может быть хорошей идеей. В разделе this thread есть несколько полезных соображений.