Анализ памяти в Android: dominator_tree не показывает все экземпляры некоторых объектов

Я использую Eclipse Memory Analyzer для тестирования поведения MainActivity в своем приложении для Android.

Я повернул свое устройство ровно 10 раз, поэтому я создал 11 экземпляров класса MainActivity.

Глядя на вкладку «Гистограмма» в Eclipse Memory Analyzer, я получаю это

Гистограмма

Весь список объектов (щелчок правой кнопкой мыши -> lList objects -> с входящими ссылками) дает мне список этих 11 объектов:

Список объектов с входящими ссылками

это должно быть правильно, поскольку у меня есть ровно 11 экземпляров класса MainActivity, как и ожидалось (при условии, что GC еще не выпустил эти действия).

Но если я ищу «MainActivity» на вкладке dominator_tree, я получаю только 4 экземпляра (я не уверен, что это экземпляр... возможно, он просто показывает активные ссылки в моем приложении, а не все объекты в куче):

Dominator_tree

Где остальные 6 экземпляров? Почему они не показаны на диаграмме dominator_tree?


person GVillani82    schedule 03.06.2015    source источник


Ответы (1)


Анализируя результаты, которые показаны в dominator_tree, я понял, что произошло:

Третий доминатор показывает только те объекты, которые имеют хотя бы один путь от корня GC к ним. Для отображения на этой диаграмме требуется по крайней мере одна ссылка (не имеет значения, является ли это слабой ссылкой, мягкой ссылкой, сильной ссылкой или фиктивной ссылкой).

Итак, 6 объектов, которые я вижу только на Histogram, не показаны на диаграмме dominator_tree, так как на них нет ссылок (они "плавают" в куче).

В частности, один объект (очевидно, текущий показанный Activity) показан на диаграмме dominator_tree, так как в моем приложении (в целях тестирования) я использовал PhantomReference для отслеживания активности GC над моими объектами.

Здесь показан один из объектов, полученных из диаграммы dominator_tree:

введите здесь описание изображения

которые показывают корень GC (pr), который является статической переменной, которая поддерживает PhantomReference для моей деятельности. На самом деле код внутри моей активности (в обратном вызове onCreate()):

if(savedInstanceState==null)
    pr = new PhantomReference(this, q); // q is the ReferenceQueue 

Также интересно отметить, что и без моего PhantomReference предпоследняя созданная активность всегда отображается на диаграмме dominator_tree, поскольку у нее есть актив Reference, который начинается с корня GC (собственный стек). Как вы можете видеть ниже:

введите здесь описание изображения

Похоже, что Android использует своего рода кеш для предыдущего экземпляра Activity.

Резюмируя: Диаграмма dominator_tree показывает только те объекты, которые имеют хотя бы один путь от корня GC к ним. В то время как гистограмма показывает все объекты в куче памяти.

person GVillani82    schedule 03.06.2015