Как избежать сбора мусора в реальном времени .NET-приложения? - PullRequest
11 голосов
/ 17 сентября 2008

Я пишу финансовое приложение на C #, которое получает сообщения из сети, переводит их в другой объект в соответствии с типом сообщения и, наконец, применяет к ним бизнес-логику приложения.

Дело в том, что после применения бизнес-логики я уверен, что мне больше никогда не понадобится этот экземпляр. Вместо того, чтобы ждать, пока сборщик мусора освободит их, я бы хотел явно «удалить» их.

Есть ли лучший способ сделать это в C #, должен ли я использовать пул объектов для повторного использования всегда одного и того же набора экземпляров, или есть лучшая стратегия.

Цель состоит в том, чтобы избежать сбора мусора для использования любого ЦП во время критического процесса.

Ответы [ 13 ]

1 голос
/ 17 сентября 2008

Вместо создания нового экземпляра объекта каждый раз, когда вы получаете сообщение, почему бы вам не использовать объекты, которые уже были использованы? Таким образом, вы не будете бороться с сборщиком мусора, и ваша кучная память не будет фрагментирована. **

Для каждого типа сообщений вы можете создать пул для хранения экземпляров, которые не используются. Всякий раз, когда вы получаете сетевое сообщение, вы просматриваете тип сообщения, извлекаете ожидающий экземпляр из соответствующего пула и применяете свою бизнес-логику. После этого вы помещаете этот экземпляр объекта сообщения обратно в его пул.

Скорее всего, вы захотите «лениво» загрузить свой пул экземплярами, чтобы ваш код легко масштабировался. Поэтому вашему классу пула нужно будет определить, когда был извлечен нулевой экземпляр, и заполнить его, прежде чем раздавать его. Затем, когда вызывающий код помещает его обратно в пул, это реальный экземпляр.

** «Пул объектов - это шаблон, который позволяет использовать объекты, а не распределять и освобождать их, что помогает предотвратить фрагментацию кучи и дорогостоящие сжатия GC».

http://geekswithblogs.net/robp/archive/2008/08/07/speedy-c-part-2-optimizing-memory-allocations---pooling-and.aspx

1 голос
/ 17 сентября 2008

Вы можете иметь ограниченное количество экземпляров каждого типа в пуле и использовать уже готовые экземпляры. Размер пула будет зависеть от количества сообщений, которые вы будете обрабатывать.

0 голосов
/ 17 сентября 2008

Теоретически GC не должен работать, если ваш процессор находится под большой нагрузкой или если это действительно не нужно. Но если вам нужно, вы можете просто сохранить все свои объекты в памяти, возможно, один экземпляр, и никогда не очищать их, если вы не готовы. Это, вероятно, единственный способ гарантировать, когда GC работает.

...