- Android: как работает Bitmap recycle ()?
- 5 ответов:
- When should I recycle a bitmap using LRUCache?
- Android: How does Bitmap recycle() work?
- 5 Answers 5
- Android: Bitmap recycle () как это работает?
- Русские Блоги
- trying to use a recycled bitmap android.graphics.Bitmap
- Интеллектуальная рекомендация
- Многослойная презентацияViewController Jap
- Распечатать список с конца до головы
- Типы данных и переменные
- Python Daily Practice (4) -идиомы заполняют музыку
Android: как работает Bitmap recycle ()?
допустим, я загрузил изображение в растровый объект, как
Теперь, что произойдет, если я загружу другое растровое изображение, как
что происходит с первой myBitmap? Получает ли он собранный мусор или мне нужно вручную собрать его перед загрузкой другого растрового изображения, например. myBitmap.recycle() ?
кроме того, есть ли лучший способ загрузить большие изображения и отображать их один за другим во время переработки на пути?
5 ответов:
первое растровое изображение не GC’Ed при декодировании второго. GC сделает это позже, когда решит. Если вы хотите освободить память как можно скорее, вы должны вызвать recycle () непосредственно перед декодированием второго растрового изображения.
Если вы хотите загрузить действительно большое изображение, вы должны пересчитать его. Вот пример странная проблема с памятью при загрузке изображения в растровый объект.
вам нужно будет вызвать myBitmap.recycle() перед загрузкой следующего изображения.
в зависимости от источника вашего myFile (например, если у вас нет контроля над исходным размером), при загрузке изображения вместо простой повторной выборки некоторого произвольного числа вы должны масштабировать изображение до размера дисплея.
Я кэширую displayWidth & displayHeight в статике, который я инициализировал в начале моей деятельности.
Я думаю, что проблема заключается в следующем: на предварительных версиях Honeycomb Android фактические необработанные растровые данные хранятся не в памяти виртуальной машины, а в собственной памяти. Это родная память и освобождается, когда соответствующий java ГХ бы.
, когда у вас заканчивается собственная память, Dalvik GC не запускается, поэтому возможно, что ваше приложение использует очень мало памяти java, поэтому Dalvik GC никогда не вызывается, но он использует тонны родной память для растровых изображений, которая в конечном итоге вызывает ошибку OOM.
по крайней мере это мое предположение. К счастью, в Honeycomb и позже все растровые данные хранятся в виртуальной машине, поэтому вам не нужно использовать recycle() на всех. Но для миллионов пользователей 2.3 (фрагментация трясет кулаком), вы должны использовать recycle() везде, где это возможно (а большая морока). Или в качестве альтернативы вы можете вызвать GC вместо этого.
после того, как растровое изображение было загружено в память , на самом деле он был сделан из двух частей данных. Первая часть включает некоторую информацию о растровом изображении, другая часть включает информацию о пикселях растрового изображения( оно составлено массивом байтов). Первая часть существует в используемой памяти Java, вторая часть существует в используемой памяти C++. Он может использовать память друг друга напрямую. Растровый.recycle() используется для освобождения памяти C++. Если вы только это сделаете, GC будет собирать часть java, а память C всегда используемый.
кроме того, до Android 3.0 (уровень API 11) резервные данные растрового изображения хранились в собственной памяти, которая не была выпущена предсказуемым образом, что потенциально может привести к кратковременному превышению ограничений памяти и сбою приложения.
Источник
When should I recycle a bitmap using LRUCache?
I’m using an LRUCache to cache bitmaps which are stored on the file system. I built the cache based on the examples here: http://developer.android.com/training/displaying-bitmaps/cache-bitmap.html
The problem is that I’m seeing OutOfMemory crashes frequently while using the app. I believe that when the LRUCache evicts an image to make room for another one, the memory is not being freed.
I added a call to Bitmap.recycle() when an image is evicted:
This fixes the crashes, however it also results in images sometimes not appearing in the app (just a black space where the image should be). Any time that occurs I see this message in my Logcat: Cannot generate texture from bitmap .
A quick google search reveals that this is happening because the image which is displaying has been recycled.
So what is happening here? Why are recycled images still in the LRUCache if I’m only recycling them after they’ve been removed? What is the alternative for implementing a cache? The Android docs clearly state that LRUCache is the way to go, but they do not mention the need to recycle bitmaps or how to do so.
RESOLVED: In case its useful to anyone else, the solution to this problem as suggested by the accepted answer is to NOT do what I did in the code example above (don’t recycle the bitmaps in the entryRemoved() call).
Instead, when you’re finished with an ImageView (such as onPause() in an activity, or when a view is recycled in an adapter) check if the bitmap is still in the cache (I added a isImageInCache() method to my cache class) and, if it’s not, then recycle the bitmap. Otherwise, leave it alone. This fixed my OutOfMemory exceptions and prevented recycling bitmaps which were still being used.
Источник
Android: How does Bitmap recycle() work?
Let’s say I have loaded an image in a bitmap object like
Now, what will happen if I load another bitmap like
What happens to the first myBitmap? Does it get Garbage Collected or do I have to manually garbage collect it before loading another bitmap, eg. myBitmap.recycle() ?
Also, is there a better way to load large images and display them one after another while recycling on the way?
5 Answers 5
The first bitmap is not garbage collected when you decode the second one. Garbage Collector will do it later whenever it decides. If you want to free memory ASAP you should call recycle() just before decoding the second bitmap.
If you want to load really big image you should resample it. Here’s an example: Strange out of memory issue while loading an image to a Bitmap object.
I think the problem is this: On pre-Honeycomb versions of Android, the actual raw bitmap data is not stored in VM memory but in native memory instead. This native memory is freed when the corresponding java Bitmap object is GC’d.
However, when you run out of native memory, the dalvik GC isn’t triggered, so it is possible that your app uses very little of the java memory, so the dalvik GC is never invoked, yet it uses tons of native memory for bitmaps which eventually causes an OOM error.
At least that’s my guess. Thankfully in Honeycomb and later, all bitmap data is stored in the VM so you shouldn’t have to use recycle() at all. But for the millions of 2.3 users (fragmentation shakes fist), you should use recycle() wherever possible (a massive hassle). Or alternatively you may be able to invoke the GC instead.
Источник
Android: Bitmap recycle () как это работает?
Допустим, я загрузил изображение в растровый объект, например
Теперь, что произойдет, если я загружу другое растровое изображение, например
Что происходит с первым myBitmap, он получает Garbage Collected или мне приходится вручную мусор собирать его перед загрузкой другого растрового изображения, например. myBitmap.recycle()
Также есть лучший способ загрузить большие изображения и отобразить их один за другим, перерабатывая по пути
Первое растровое изображение не является GC’ed, когда вы декодируете второй. GC будет делать это позже, когда он решит. Если вы хотите освободить память ASAP, вы должны вызвать recycle () непосредственно перед декодированием второго растрового изображения.
Если вы хотите загрузить действительно большое изображение, вы должны перепрограммировать его. Вот пример Странная проблема с памятью при загрузке изображения в объект Bitmap .
Вам нужно будет вызвать myBitmap.recycle () перед загрузкой следующего изображения.
В зависимости от источника вашего myFile (например, если у вас нет контроля над исходным размером), при загрузке изображения вместо просто повторной выборки произвольного числа вы должны масштабировать изображение до размера экрана.
Я кэширую displayWidth & displayHeight в статике, которую я инициализировал в начале моего действия.
Я думаю, что проблема заключается в следующем: в версиях Android, предшествующих Honeycomb, фактические необработанные растровые данные не сохраняются в памяти VM, а в исходной памяти. Эта собственная память освобождается, когда соответствующий объект битовой карты java является GC’d.
Однако , когда вы исчерпали собственную память, dalvik GC не запускается, поэтому вполне возможно, что ваше приложение использует очень мало из java-памяти, поэтому dalvik GC никогда не вызывается, но он использует тонны собственной памяти для битмапов Что в конечном итоге вызывает ошибку OOM.
По крайней мере, это моя догадка. К счастью, в Honeycomb и позже все растровые данные хранятся в виртуальной машине, поэтому вам не нужно вообще использовать recycle() . Но для миллионов 2.3 пользователей (фрагментация дрожит кулаком ), вы должны использовать recycle() где это возможно (массивная проблема). Или, альтернативно, вы можете использовать GC вместо этого.
Как только растровое изображение было загружено в память, на самом деле это было сделано с помощью двух частей данных. Первая часть включает в себя некоторую информацию о растровом изображении, а другая часть включает информацию о пикселях растрового изображения (он подбирается массивом байтов). Первая часть изъята в используемой Java-памяти, вторая часть – в C ++. Он может напрямую использовать память друг друга. Bitmap.recycle () используется для освобождения памяти C ++. Если вы это сделаете, GC будет собирать часть java и всегда использовать память C.
Тимммм был прав.
Кроме того, до Android 3.0 (уровень API 11) данные резервного копирования растрового изображения были сохранены в собственной памяти, которая не была выпущена предсказуемым образом, что потенциально может привести к кратковременному превышению пределов памяти и сбоя.
Источник
Русские Блоги
trying to use a recycled bitmap android.graphics.Bitmap
Ненормальный: пытаясь использовать переработанный растровый цвет Android.Graphics.Bitmap
Также: пытаться использовать растровое изображение уже переработано
При нормальных обстоятельствах мы выполняем мульти-масштабирование, перевод и т. Д. Для растрового изображения, затем Createbitmap, затем обрабатывает предыдущее растровое изображение.
Ненормальная фундаментальная проблема заключается в функции «Bitmap.createbitmap» здесь:
Сосредоточиться The new bitmap may be the same object as source «Созданное растровое изображение может быть одинаковым объектом, код в том, почему« »показывает все:
Если вы не измените новое растровое изображение, он также такой же, как одинаково, матрица также такая же, то битовое изображение, которое вы хотите перейти непосредственно после того, как источник напрямую возвращается. Если CreatebitMap напрямую рециркулирует рециркуляцию, Тогда вы можете использовать его?
Основное суждение «! Oldbitmap.equals (Newbitmap», затем перерабатывать. Или перед Createbitmap, это оценивается, что Oldbitmap является матричным процессом.
Интеллектуальная рекомендация
Многослойная презентацияViewController Jap
. Недавно, проект использует многоэтажные прыжки [A presentViewController: B animated: YES] [B presentViewController: C animated: YES] . Проблема в том, где: как это идет прямо к? Я не нашел ме.
Распечатать список с конца до головы
В случае, когда таблица цепи не может изменять дисплей, данные хранения стека могут рассматриваться с рекурсивным методом. Разрешить модификацию структуры ссылки.
Типы данных и переменные
тип данных Компьютерная программа может обрабатывать различные значения. Однако компьютеры могут обрабатывать гораздо больше, чем числовые значения. Они также могут обрабатывать различные данные, таки.
Python Daily Practice (4) -идиомы заполняют музыку
оглавление 1. Одно место 2. Случайное расположение 3. Добавьте баллы для оценки 4. Получение файла 5. Установите уровень сложности. 6. Срок завершения 7. Выберите заполнение пропусков. 1. Одно место Н.
Источник