Я пишу финансовое приложение C#, которое получает сообщения из сети, переводит их на другой объект в соответствии с типом сообщения и окончательно применяет к ним прикладную бизнес-логику.Как избежать сбора мусора в реальном времени .NET-приложение?
Дело в том, что после применения бизнес-логики я уверен, что мне больше не понадобится этот экземпляр. Вместо того, чтобы ждать, когда сборщик мусора освободит их, я хотел бы явно «удалить» их.
Есть ли лучший способ сделать это на C#, следует ли использовать пул объектов для повторного использования всегда одного и того же набора экземпляров или есть лучшая стратегия.
Цель состоит в том, чтобы избежать сбора мусора, чтобы использовать любой процессор во время критически важного процесса.
В .Net объединение в пул полезно, когда (a) создание заданного объекта происходит медленно или (b) в 32-разрядном приложении для уменьшения фрагментации памяти массива/списка/dict и т. Д., В котором используются данные блок> 64 КБ, например > 8K элементов x 8 B на элемент, или 16K элементов x 4 B на элемент. .Net ** никогда не перемещает (перемещает) такие большие блоки **, что может привести к фрагментированной памяти, если вы каждый раз запрашиваете разные размеры. Обеспечьте выделение достаточно больших # элементов спереди и сохраните их. (Но очистите их поля, когда они не используются, поэтому GC может восстановить все, на что они указывают.) Если превышает выделенный размер, удвоьте # элемента. – ToolmakerSteve 2014-03-22 20:34:36
В крайнем случае у меня есть одно 32-разрядное приложение (из-за зависимостей, которые не работают в 64-разрядной версии), поэтому, хотя я на 64-разрядной Windows с большим количеством ОЗУ, чтобы избежать фрагментации памяти, я имел для сохранения списков списков, чтобы каждый под-список соответствовал 64 КБ, так что .Net не выделял бы «кучу больших объектов». Таким образом, он может «компактно» запоминать во время GC, а не создавать большие «дыры» в адресном пространстве 4 ГБ приложения. Это конкретное приложение было проблематичным, потому что оно включало в себя много дистрибутивов DirectX из встроенной (не-НЕТ) памяти. Смешение распределений non.Net и .Net привело к фрагментации. – ToolmakerSteve 2014-03-22 20:41:13