куда моя память шла? большое частное количество байтов

Реализуйте collectionView:viewForSupplementaryElementOfKind:atIndexPath: и предоставьте удаленный UICollectionElementKindSectionHeader, содержащий вашу метку. Если это макет потока, не забудьте также установить headerReferenceSize, иначе вы все равно ничего не увидите.

7
задан Drew Noakes 10 June 2009 в 07:53
поделиться

5 ответов

Загрузите MemProfiler с сайта Scitech. У него есть 14-дневная пробная версия.

Проблема, о которой вы сообщаете, часто возникает из-за представлений / ресурсов, которые нельзя удалить из-за наличия корня в куче. Распространенной причиной является отсутствие подключения обработчиков событий.

1
ответ дан 7 December 2019 в 03:20
поделиться

Тот факт, что ваше приложение использует много памяти, не обязательно означает, что у вас есть утечка памяти. Из информации в вашем вопросе трудно утверждать, что может быть не так.

При устранении проблем с управляемой утечкой памяти с помощью WinDbg я делаю следующее:

  • Получите обзор использования кучи с помощью ! Eeheap (он сообщает об использовании кучи, а не стеке, как вы упомянули - каждый стек имеет размер по умолчанию 1 МБ, поэтому, если вы не изменили его, вы не сможете использовать 100 МБ в стеке)

  • Выполните ! dumpheap -stat , чтобы узнать, что находится в куче. Скорее всего, если у вас есть утечка памяти, виновные будут среди основных потребителей. Чтобы получить представление о том, как развивается использование кучи, вы можете возобновить работу приложения, разбить его немного позже и затем повторить ! dumpheap -stat команда.

  • Если вы обнаружите какие-либо типы с большим количеством экземпляров, чем вы, за исключением, перечислите те, которые используют ! dumpheap -mt . Это перечислит все экземпляры определенного типа. Выберите случайные экземпляры и проверьте корни с помощью команды ! Gcroot . Это расскажет вам, что поддерживает рассматриваемые экземпляры. Если нет root, эти экземпляры будут собраны в какой-то момент.

ОБНОВЛЕНИЕ, чтобы ответить на ваши комментарии:

Управляемая куча - это только часть объема памяти управляемого приложения. Помните, что приложение .NET на самом деле является приложением внутри другого приложения - хост-процесса, который загружает среду CLR, которая, в свою очередь, загружает ваше приложение. Поэтому, прежде чем ваше приложение начнет использовать любую память, CLR уже заняла свою долю. Более того . Приложения .NET хранят как код MSIL, так и код, скомпилированный JIT, как часть следа. CLR также занимает место для различных бухгалтерских операций (например, CLR создает два дополнительных домена AddDomain для внутреннего использования).

Цифры, которые вы даете, не кажутся мне чрезмерными, но поскольку я не знаю вашего заявления, трудно сказать, являются ли они чрезмерными.

100 МБ в управляемой куче может быть нормально, в зависимости от того, что делает ваше приложение. Ты кучу проверил? И если да, то что вы нашли?

100 МБ в управляемой куче может быть нормально, в зависимости от того, что делает ваше приложение. Ты кучу проверил? И если да, то что вы нашли?

100 МБ в управляемой куче может быть нормально, в зависимости от того, что делает ваше приложение. Ты кучу проверил? И если да, то что вы нашли?

3
ответ дан 7 December 2019 в 03:20
поделиться

Вы можете попробовать прочитать эту статью в последнем журнале MSDN . Подробно рассказывается, как использовать VADump, чтобы понять, где выделена память процесса.

Вы можете скачать VADump здесь: http://go.microsoft.com/fwlink/?LinkId=149683

Чтобы разбить управляемую кучу, вы можете попробовать профилировщик памяти. Мне лично нравится JetBrains dotTrace .

1
ответ дан 7 December 2019 в 03:20
поделиться

У меня была аналогичная проблема в приложении WPF, и использовал UMDH для отслеживания того, где выделялась собственная память. (Обратите внимание, что обычно полезно установить _NT_SYMBOL_PATH , чтобы получить хорошие трассировки стека от компонентов ОС.

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

4
ответ дан 7 December 2019 в 03:20
поделиться

Один ответ: слишком много объединенных ResourceDictionaries (вещь WPF)

Подробности: чтобы увидеть дизайн во время разработки в Blend и VS, мы использовали объединить наш словарь ресурсов темы на большинстве страниц xaml. Это вызвало загрузку копии всех ресурсов для каждого элемента управления, дополнительную информацию можно прочитать здесь: [WPF Disciples] [1]

Итак, единственное место, где я их объединяю, это App.xaml.cs:

<Application.Resources>
  <ResourceDictionary>
    <ResourceDictionary.MergedDictionaries>
      <ResourceDictionary 
        Source="pack://application:,,,/Company.Themes;Component/AppTheme.xaml"/>
    </ResourceDictionary.MergedDictionaries>
  </ResourceDictionary>
</Application.Resources>

Results : (запуск приложения через некоторые страницы с автоматическим тестом графического интерфейса)

До:

  • После загрузки приложения: 63 МБ
  • После использования приложения: 177 МБ

После:

  • После приложения загрузка: 53 Мб
  • После использования приложения: 97 Мб

Я отправлю больше ответов, когда найду их! (Я подумал, что читателям будет проще рассматривать мои результаты в виде отдельных ответов, а не ответов на комментарии - хорошо?)

[1]: ref: http://groups.google.com/group/wpf-disciples/ web / wpf-and-xaml-coding-guidelines? pli = 1

0
ответ дан 7 December 2019 в 03:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: