Вместо создания нового экземпляра объекта каждый раз, когда вы получаете сообщение, почему бы вам не использовать объекты, которые уже были использованы? Таким образом, вы не будете бороться с сборщиком мусора, и ваша кучная память не будет фрагментирована. **
Для каждого типа сообщений вы можете создать пул для хранения экземпляров, которые не используются. Всякий раз, когда вы получаете сетевое сообщение, вы просматриваете тип сообщения, извлекаете ожидающий экземпляр из соответствующего пула и применяете свою бизнес-логику. После этого вы помещаете этот экземпляр объекта сообщения обратно в его пул.
Скорее всего, вы захотите «лениво» загрузить свой пул экземплярами, чтобы ваш код легко масштабировался. Поэтому вашему классу пула нужно будет определить, когда был извлечен нулевой экземпляр, и заполнить его, прежде чем раздавать его. Затем, когда вызывающий код помещает его обратно в пул, это реальный экземпляр.
** «Пул объектов - это шаблон, который позволяет использовать объекты, а не распределять и освобождать их, что помогает предотвратить фрагментацию кучи и дорогостоящие сжатия GC».
http://geekswithblogs.net/robp/archive/2008/08/07/speedy-c-part-2-optimizing-memory-allocations---pooling-and.aspx