DDMS Heap - 1-байтовый массив (byte [], boolean [])
У меня возникают некоторые утечки памяти в приложении для Android. Я уже использовал MAT для анализа использования памяти. Но у меня есть один вопрос из перспективы DDMS в Eclipse, что означает 1-байтовый массив [byte [], boolean [])?
![enter image description here]()
Является ли это конкретным для моего приложения? Вы можете видеть, что это большая проблема с утечкой памяти, это всегда увеличивается в размере, а остальное будет увеличиваться и уменьшаться случайным образом. Я предполагаю, что GC не поймает этот тип. Может ли кто-нибудь объяснить, почему это происходит, с этой небольшой информацией?
Ответы
Ответ 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"
на основную активность в манифесте и решил проблему.
Хотя это не основная причина этой проблемы, но если вы столкнулись с этим, проверьте это перед чем-либо. Он потратил три или четыре часа на меня.