Неожиданные дампы кучи для приложения 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);
}
}
Вопросы
- Почему числа кучи такие большие.?Также в качестве дополнительного примечания приложение потребляло 52 МБ оперативной памяти в системе.
- Где эти 209 экземпляров NinePatch? Я просто создал проект, выполнив "Создать новый проект" в Eclipse?
- Первая утечка, подозреваемая в ресурсах. Она постоянно появляется в моем анализе приложений. Это действительно подозреваемый?
- Что такое АртМетод? Это как-то связано со средой выполнения 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 МБ утечки памяти для меня.