Подтвердить что ты не робот

DDMS Heap - 1-байтовый массив (byte [], boolean [])

У меня возникают некоторые утечки памяти в приложении для Android. Я уже использовал MAT для анализа использования памяти. Но у меня есть один вопрос из перспективы DDMS в Eclipse, что означает 1-байтовый массив [byte [], boolean [])?

enter image description here

Является ли это конкретным для моего приложения? Вы можете видеть, что это большая проблема с утечкой памяти, это всегда увеличивается в размере, а остальное будет увеличиваться и уменьшаться случайным образом. Я предполагаю, что GC не поймает этот тип. Может ли кто-нибудь объяснить, почему это происходит, с этой небольшой информацией?

4b9b3361

Ответ 1

A byte и a boolean - каждый 1 байт. Если у вас есть массив из тех, у вас есть "1-байтовый массив".

A ByteBuffer, например, должен внутренне удерживать один из них.

У вас есть в общей сложности 614 из них, где самый маленький из них - byte[24] (или boolean[24]), самый большой - 3 МБ. Все они вместе используют 104 МБ.

GC избавится от них, если они больше не ссылаются.

Например, когда вы помещаете

private static byte myArray[] = new byte[3 * 1024 * 1024];

в одном из ваших классов и никогда не устанавливайте его обратно на нуль (myArray = null), тогда это невозможно собрать мусором, потому что другой объект имеет ссылку на него. Объектом будет сам класс (как в String.class). Объект класса не может быть мусором, поскольку классы никогда не выгружаются. (на них ссылаются их ClassLoader, которые могут быть связаны/загружены другим ClassLoader, и вы не можете создавать объекты и использовать классы без них - им нужно остаться, и им нужно сохранить ссылку на их классы)

Обычно это не так просто, но часто начинайте с static где-то.

Внутри MAT (после принудительного GC) посмотрите на цепочку ссылок для объектов, которые больше не предназначены для того, чтобы оставаться в живых и идентифицировать один объект, который содержит ссылку. Установите этот код в null в свой код, и ваша утечка исчезнет. Более подробно здесь объясняется:

http://android-developers.blogspot.de/2011/03/memory-analysis-for-android.html

Ответ 2

Один байтовый массив - это обозначение для любой структуры данных, которая организована как один массив байтов. В вашем случае и с этим размером я бы поставил в растровое изображение или в Drawble.

Наиболее распространенными причинами утечек памяти являются статический объект, который не правильно управляется и содержит ссылки на:

  • Контекст
  • Вид (который ссылается на контекст (и, возможно, также на растровое изображение)
  • Thread (которые не собираются GC)
  • Обработчик (который ссылается на контекст)

Большинство из них могут быть решены, гарантируя, что вы установите для объекта значение null, когда оно не требуется.

С уважением.

Ответ 3

Я столкнулся с этой проблемой сегодня, и почти я проверил каждый бит кода, но ничего не нашел.

То, что я сделал, - это запустить приложение из intelij, а затем нажать кнопку "домой" и снова открыть приложение. Каждый раз, когда куча приложения была удвоена.

Наконец, я обнаруживаю, что когда я запускаю приложение из ADB и нажимаю кнопку "домой" и снова открываю приложение, он не возвращает старую активность, а просто запускает новую. Когда я нажимаю конец, он начинает перебирать все из них. Это похоже на то, что они рассматриваются как два разных намерения. Поэтому я положил android:launchMode="singleTop" на основную активность в манифесте и решил проблему.

Хотя это не основная причина этой проблемы, но если вы столкнулись с этим, проверьте это перед чем-либо. Он потратил три или четыре часа на меня.