У нас есть приложение .NET, которое наши клиенты считают слишком большим для массового развертывания, и мы хотели бы понять, что влияет на наш объем памяти и можно ли добиться большего, не отказываясь от .NET и wpf.
Мы заинтересованы в улучшении как общего размера, так и частного рабочего набора (pws). В этом вопросе я просто хочу посмотреть на pws. VMMap обычно сообщает pws 105 МБ. Из этого 11 Мб - образ, 31 Мб - куча, 52 Мб - управляемая куча, 7 Мб - личные данные, а остальное - стек, таблица страниц и т. Д.
Самый большой приз здесь - управляемая куча. Мы можем учесть около 8 МБ управляемой кучи непосредственно в нашем собственном коде, то есть объектах и окнах, которые мы создаем и которыми управляем. Остальные предположительно .NET объекты, созданные элементами инфраструктуры, которые мы используем.
То, что мы хотели бы сделать, - это определить, какой элемент структуры учитывает какую часть этого использования, и, возможно, реструктурировать нашу систему, чтобы избежать их использования, где это возможно. Кто-нибудь может подсказать, как можно провести это расследование?
Дополнительные уточнения:
До сих пор я использовал ряд инструментов, в том числе отличные профилировщики ANTS и WinDbg с SOS, и они позволяют мне видеть объекты в управляемой куче, но реальный интерес здесь - не «Что?», А 'Зачем?' В идеале я хотел бы иметь возможность сказать: «Ну, здесь создано 10 МБ объектов, потому что мы используем WCF. Если мы напишем собственный нативный транспорт, мы могли бы сэкономить 8 МБ из этого с x риском для качества и y усилиями по разработке».
Выполнение gcroot для 300 000+ объектов невозможно.