Как мне найти, где память используется в C #? - PullRequest
7 голосов
/ 22 марта 2011

У меня запущен проект C # XNA в WP7, и я обнаружил, что он потребляет память между изменениями экрана и не возвращает его, что в итоге приводит к исключению из памяти.

Я посмотрел и посмотрел, но яне могу за всю жизнь найти, куда идет эта память.

Есть ли способ узнать, где используется память и почему она не возвращается устройству?

Спасибо за любую помощь!

Ответы [ 6 ]

6 голосов
/ 22 марта 2011

Используйте Microsoft * CLR Profiler для .NET Framework 4 (бесплатно) в версии Windows для вашего проекта.

С помощью этого вы можете получить временную шкалу вашегоРаспределение памяти проекта.Или вы можете проверить саму кучу.Это дает вам список всего, что распределяется по типу.Вы, вероятно, увидите объект, который вы чрезмерно выделяете, оттуда вы можете вызвать график распределения для этого типа или этого диапазона времени.Это покажет, какие функции распределили эти объекты.

Вот случайная запись в блоге , в которой есть несколько снимков экрана и обсуждение CLR Profiler в действии.(Не совсем то, что вы будете делать с ним, но полезное введение, если вы никогда ранее не использовали CLR Profiler.)

Однако : потому что вы используете XNA, и вы обычнопридется действительно тяжело заставить C # исчерпать управляемую память, возможно, вам не хватает неуправляемой памяти.Есть ли где-то, что вы не звоните Dispose() до того, как прекратите использовать созданный вами графический или звуковой объект?Я обсуждал детали этого пары раз .

Так что просто знайте, что, если у вас есть много очень маленьких объектов, обнаруженных в CLR Profiler- они могут фактически использовать огромное количество неуправляемой памяти.

2 голосов
/ 22 марта 2011

Вы можете попробовать ANG Memory Profiler от Redgate (но это стоит), и я не уверен, что буду использовать его с WP7, но это для C #.

Существует бесплатная пробная версия, так что вы можете использовать ее для определения проблемы.

1 голос
/ 22 марта 2011

Используйте CLR Profiler для .NET Framework 2.0 .Это не поддерживается в XNA 4.0 по умолчанию, но у Дэйва в Crappy Coding есть обходной путь .

1 голос
/ 22 марта 2011

Инструментарий coding4fun содержит счетчик памяти, который помогает отслеживать использование памяти вашим приложением. Вот документация и статья , демонстрирующая его использование.

1 голос
/ 22 марта 2011

Eqatec имеет профилировщик, который работает с WP7.Это не профилировщик памяти, но я бы попробовал посмотреть, что он показывает.Это может помочь направить вас в правильном направлении.

0 голосов
/ 28 июля 2016

Я использую Mono profiler . У этого есть различные варианты; самое простое использование -

mono --profile=log program.exe

И затем, после выхода program.exe, он оставляет файл профилировщика (output.mlpd по умолчанию) , и для чтения собранной информации используйте:

mprof-report output.mlpd

например. Я делаю mprof-report output.mlpd | vim -.

По умолчанию он собирает кучу различной информации. В самом начале вывода (с заданными настройками по умолчанию) вы увидите таблицу функций, отсортированных по столбцу «распределено», например, отрывок:

Allocation summary
  24      Bytes      Count  Average Type name
  25    7357392     306558       24 System.IntPtr
  26    6677904     139123       48 System.Collections.ArrayList.ArrayListEnumeratorSimple
  27    5842736     136185       42 Mono.Unix.Native.Syscall._pollfd[]
  28    3078176      49566       62 System.Byte[]
  29    2574504      38057       67 System.String
  30     908320      14803       61 System.Int32[]
  31     719984       5294      136 Mono.Globalization.Unicode.SortKeyBuffer

Его преимущества сошли с ума:

  • Это кроссплатформенное решение, поэтому вы можете легко профилировать распределение памяти .net в GNU / Linux и Mac.
  • Разработано создателями и крупнейшими пользователями .net - Microsoft. Ранее он был разработан Xamarin, но MS купил их, и теперь они упоминаются на главной странице Mono.
...