Анализ памяти Android - разные результаты сохраненной памяти

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

Я взял образец класса, где я сравнил все значения. Почти все числа равны, кроме Retained memory.

Например. Числа для нераспределенной памяти в этих инструментах:

  • Открытие HPROF в Eclipse Memory Analyzer: 984
  • Анализатор памяти Eclipse слева Информация: 456
  • Открытие HPROF в Android Studio: 470
  • Чтение HPROF с Perflib от Google: 568

Почему такая большая разница между этими инструментами? Был ли у кого-нибудь из вас подобный опыт?

Кадры Android Studio: введите здесь описание изображения

Если я изучу детали в Android Studio класса CommunicationManager, я получу следующее представление и увижу, что Shadow$_klass имеет то же значение (568), что и Perflib. Глянь сюда:

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

Журнал консоли PerfLib:

Вывод perflib показывает число, которое возвращает ClassObj, когда я вызываю «getTotalRetainedSize()».

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

Анализатор памяти Eclipse: введите здесь описание изображения

Но с левой стороны в Eclipse Memory Analyzer я вижу следующее: введите здесь описание изображения


person Highriser    schedule 19.09.2017    source источник


Ответы (1)


Я знаю, как я могу перейти от Perflib к значениям из Android Studio. Тем не менее я не знаю, что делает Eclipse Analyzer.

Как получить значения из Android Studio:

  1. Получить ClassObj(s)
  2. Проверьте жесткие ссылки этого ClassObj и возьмите все жесткие ссылки, которые относятся к тому же классу, что и ClassObj. Возьмите этот экземпляр и вычислите TotalRetainedSize и суммируйте их, если их больше.
  3. Если жесткой ссылки нет, в качестве сохраненного размера используйте Мелкий размер.

Код:

for(int i = 0; i < listOfClassObj.size(); i++){
   ClassObj clazz = listOfClassObj.get(i);
   ArrayList<Instance> list = clazz.getHardReferences();

   long retainedValue = 0;

   if(list.size() > 0){
       for(int x = 0; x < list.size(); x++){
           Instance inst = list.get(x);
           String instanceStr = inst.toString();
           if(instanceStr.substring(0, instanceStr.indexOf("@")).contentEquals(clazz.getClassName())){
               retainedValue += inst.getTotalRetainedSize();
           }
       }
   }else{
       retainedValue  = clazz.getShallowSize();
   }
}
person Highriser    schedule 19.09.2017