Неожиданные дампы кучи для приложения Hello World для Android

Я изучаю использование памяти с помощью MAT в Eclipse. Хотя я столкнулся со странной проблемой. Оставив в стороне тяжелые приложения, я начал с самого доброго приложения "Hello World". Это то, что я получаю в виде Heap Stats на Nexus 5, во время выполнения ART, Lollipop 5.0.1.

ID: 1
Размер кучи: 25,429 МБ
Выделено: 15,257 МБ
Бесплатно: 10.172 МБ
% Используется: 60%
# Объекты: 43487

Мой дамп кучи дает мне 3 подозреваемых утечки памяти: обзор

"Не могу опубликовать круговую диаграмму из-за низкой репутации".

Проблема Подозреваемый 1

Класс "android.content.res.Resources", загруженный "", занимает 10 166 936 (38,00%) байт. Память накапливается в одном экземпляре "android.util.LongSparseArray[]", загруженном "".

Ключевые слова android.util.LongSparseArray[] android.content.res.Resources

Проблема Подозреваемый 2

209 экземпляров "android.graphics.NinePatch", загруженных "", занимают 5 679 088 (21,22%) байтов. На эти экземпляры ссылаются из одного экземпляра "java.lang.Object[]", загруженного "" Ключевые слова java.lang.Object[] android.graphics.NinePatch

Проблема Подозреваемый 3

8 экземпляров "java.lang.reflect.ArtMethod[]", загруженных "", занимают 3 630 376 (13,57%) байтов. Крупнейшие экземпляры: •java.lang.reflect.ArtMethod[62114] @ 0x70b19178 - 1 888 776 (7,06%) байтов. •java.lang.reflect.ArtMethod[21798] @ 0x706f5a78 - 782 800 (2,93%) байтов. •java.lang.reflect.ArtMethod[24079] @ 0x70a9db88 - 546 976 (2,04%) байт. Ключевые слова java.lang.reflect.ArtMethod []

Это все с помощью простого кода:

import android.app.Activity;
import android.os.Bundle;

public class MainActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
}

}

Вопросы

  1. Почему числа кучи такие большие.?Также в качестве дополнительного примечания приложение потребляло 52 МБ оперативной памяти в системе.
  2. Где эти 209 экземпляров NinePatch? Я просто создал проект, выполнив "Создать новый проект" в Eclipse?
  3. Первая утечка, подозреваемая в ресурсах. Она постоянно появляется в моем анализе приложений. Это действительно подозреваемый?
  4. Что такое АртМетод? Это как-то связано со средой выполнения ART?

2 ответа

В Lollipop по умолчанию исполняется ART, т.е. Android Run Time. который используется вместо Dalvik Runtime используется в более старых версиях Android. В Kitkat Google выпустил экспериментальную версию ART, чтобы получить отзывы пользователей. В dalvik используется JIT(Just in time compilation), то есть, когда вы открываете приложение, в код объекта преобразуется только код dex. Но в ART на момент установки только код dex преобразуется в объектный код (то есть AOT перед компиляцией времени). Размер этого объектного кода больше по сравнению с dex-кодом, поэтому ART требует больше оперативной памяти, чем Dalvik, поскольку его приложение AOT работает в ART быстрее, чем Dalvik.

Вчера я тоже столкнулся с этой проблемой. В вашем журнале ключевое слово "NinePatch". В моем случае причиной была "поддельная" тень - крошечная картинка с альфа-каналом, которая вызывает утечку ресурсов. Это стоит около 60 МБ утечки памяти для меня.

Другие вопросы по тегам