Резюме
Мы должны понять, какая часть нашего (или третьей стороны, возможно, самого CLR) кода приводит к упаковке целых чисел.
Описание проблемы
У нас довольно большое приложение, где мы наблюдаем высокую скорость выделения System.Int32
экземпляров. С помощью Memory Profiler мы видим небольшое количество длинных существующих Int32
экземпляров (точнее, 18) и 20-25 тысяч Int32
выделений в секунду. Все эти объекты GC собраны как объекты Gen0, система не имеет утечек памяти и может работать в течение длительного времени. При создании моментального снимка памяти GC выполняется до моментального снимка, поэтому моментальный снимок не содержит следов этих «временных» объектов.
Весь наш код был специально написан, чтобы по возможности исключить бокс, и «по замыслу» мы должны вообще не видеть боксы. Таким образом, мы подозреваем, что это какой-то неисчерпаемый забытый бокс в нашем коде или бокс, вызванный сторонним компонентом и / или самим типом CLR.
Система скомпилирована с использованием VS2008 и использует .Net 3.5 (измерения проводились как в отладочной, так и в выпускной сборках, с одинаковым поведением).
Вопрос
Как мы можем (используя windbg, VS2008, Memory Profiler, AQTime или любой другой коммерчески доступный продукт) определить, почему происходит бокс?