Я бы добавил фрагментация памяти в список. Это может произойти при использовании объектов, которые инкапсулируют собственные ресурсы, которые после их выделения не могут быть перемещены сборщиком мусора и потенциально могут фрагментировать кучу.
Один реальный пример из жизни - когда вы создаете и уничтожаете множество сокетов. Буферы, которые они используют для чтения / записи данных, должны быть закреплены, чтобы их можно было перенести в собственный API-интерфейс WinSock. Это означает, что когда происходит сборка мусора, даже если часть памяти освобождается для сокетов, которые были уничтожены, она может оставить память в фрагментированном состоянии, так как сборщик мусора не может сжать кучу после сбора. Таким образом, буферы чтения / записи являются основными кандидатами на объединение. Кроме того, если вы используете объекты SocketEventArgs, они также будут хорошими кандидатами.
Вот хорошая статья , в которой рассказывается о процессе сборки мусора, сжатии памяти и почему помогает пул объектов.