Ответ 1
Теперь у нас есть больше документации, посвященной использованию ОЗУ в Android, которая подробно рассказывает о том, что означают разные номера ОЗУ: Управление вашей памятью приложений. В частности, посмотрите на середину страницы здесь, где обсуждаются ключевые части дампа meminfo: Исследование использования вашей оперативной памяти.
Похоже, ваш вывод meminfo из довольно старой версии Android, прежде чем мы смогли идентифицировать многие из разных типов распределений. Чтобы сопоставить то, что вы видите в текущей документации, просто считайте, что "другое" - это все, что показывает современный дамп, помимо родного и далвикового секций. В вашей свалке, я считаю, что ваш раздел dalvik на самом деле представляет собой современную "Dalvik Heap" и "Dalvik Other".
Что касается родного и других разделов, все чаще после изменения кода Java, да, это, безусловно, может случиться. Ряд компонентов Android Java API находится поверх собственных распределений и может также вызывать другие распределения. Классическим примером этого было бы растровое изображение на Gingerbread и ранее, где данные для растрового изображения были родным распределением, а не были распределением массива в куче Java, как сегодня.
Ваши увеличенные другие распределения могут быть связаны с рядом вещей, которые вы увидите в последних версиях данных: курсоры памяти, области общей памяти из ashmem, устройства, выделяющие для вас вещи, такие как графические текстуры и т.д. Есть так много вещей, что трудно сказать, что может происходить, поэтому отчет более подробный в эти дни. (И даже там, у нас все еще есть ряд вещей, которые обрушиваются на неизвестные.)
Чтобы отладить это, вы, вероятно, захотите посмотреть на кучу Java для просочившихся объектов. Поскольку фактическое распределение объекта не находится в куче Java, это может быть сложно, конечно. Я предлагаю взять кучу кучи на ранней стадии вашего приложения, делать все, что вы делаете, что приводит к увеличению его объема памяти RAM, после этого берет кучу кучи и ищет, какие объекты подсчитываются. В ссылочной документации показано, как сравнивать дампы кучи с MAT.
Также, когда вы смотрите на свою кучу Java как общий анализ (за исключением случаев, когда выполняете различия), всегда следите за инструкциями по удалению zygote части кучи. Как упоминается в документации, каждый процесс имеет большое количество распределений от zygote, но они разделяются во всех процессах, что обычно не имеет отношения к анализу кучи. Я очень часто вижу заинтересованных людей, потому что они видят в своем приложении много очень больших растровых изображений, которые система, по-видимому, выделяет на них, и думают, что это главное, используя RAM в своем приложении, когда это не так, это просто общие распределения из зиготы.