Вопрос по android, bitmap – Растровые изображения в Android

29

У меня есть несколько вопросов относительно растровых объектов и памяти и их общей таксономии.

Что такое встроенная память или собственное растровое изображение?Чем битовая память отличается от памяти кучи?

Ваш Ответ

4   ответа
-1

android:largeheap="true" в вашем файле манифеста. Это решит вашу проблему.

Подумайте о батарее ваших пользователей ... Запрашивать большую кучу, чтобы покрыть некоторые ошибки в распределении памяти, явно можноэто будет решение. JuSchz
12

Устройства, ограничивающие до 16 МБ кучи Java (растровые изображения практически не ограничены).Устройства с ограничением до 16 МБ (куча java + собственное растровое хранилище)Устройства, ограничивающие до 24 МБ кучи Java (растровые изображения практически не ограничены).Устройства, ограничивающие до 24 МБ (куча java + собственное растровое хранилище)

24 МиБ, как правило, являются устройствами с высоким разрешением и могут быть обнаружены с помощью Runtime.getRuntime (). MaxMemory (). Там'Теперь также устройства емкостью 32 МБ, а некоторые из подключенных телефонов по умолчанию имеют 64 МБ. Раньше я несколько раз путала себя, пытаясь понять, что происходит. Я думаю, что все устройства считают битовые карты в пределе кучи. Но это'дико сложно сделать какие-либо обширные обобщения о флоте андроидов.

Это ОЧЕНЬ неприятная проблема на Android и очень запутанная. Это ограничение и оноповедение плохо документировано, сложно и крайне неинтуитивно. Они также различаются в зависимости от устройства и версии ОС и имеют несколько известных ошибок. Частично проблема заключается в том, что ограничения не точны - из-за фрагментации кучи вы попадете в OOM задолго до фактического ограничения и должны консервативно покинуть мегабайт или два буфера. Еще хуже яУ нас есть несколько устройств, на которых есть собственный segfault (100% ошибка в самом Android), который возникает до того, как вы получите исключение java OOM, что делает вдвойне важным никогда не достигать предела, так как вы можете 'даже не поймать родную аварию. Для более подробной информации о моих расследованиях, проверьтеэта почта, В том же посте я объясняю, как измерить использование по сравнению с лимитом и избежать сбоев.

Размер кучи Java является Runtime.getRuntime (). TotalMemory ().

Нет простого способа измерить размер встроенного хранилища растровых изображений. Общая собственная куча может быть измерена с помощью Debug.getNativeHeapAllocatedSize (), но только растровые изображения учитываются до предела (я думаю).

@Carl. Из того, что я могу сказать, эточистый хаос. Хотя в целом моды и рутированные телефоны имеют тенденцию увеличивать пределы кучи, как правило, до 64M. Решение о столь жестком ограничении размера кучи Java было отсталым до мозга костей и привело к ужасному взаимодействию с пользователем. Dave Dopson
Поскольку любой может выпустить свою собственную версию Android, кажется вполне вероятным, что могут существовать версии, реализующие различные политики ограничения кучи памяти, в том числе те, которые вы описали выше. CyanogenMod, например, позволяет пользователям самим устанавливать ограничение кучи, поэтому я неПонятно, почему не может быть выпуска ОС, который реализует политики в отношении ограничений, которые вы описываете. Я'Было бы интересно узнать, существуют ли какие-либо официальные руководящие принципы в этом отношении. Если нет, то мыподчиняются прихотям этих вариантов ОС. Carl
@Carl - я взял словарь из 180 тысяч слов в среднем на 10 символов (15 миллионов для хранения в виде строк Java) и уложил его в 400 тысяч. :) Проблема в том, что этоНа самом деле очень сложно уменьшить объем растровой памяти, поскольку любой проприетарный формат хранения будет несовместим с собственным кодом рендеринга. Это, и кажется очень глупым делать память искусственно дорогой на устройстве с половиной гигабайта физической памяти. А где нативный код можно выделить 1 + G без нареканий со стороны ОС. Это'Это просто способ наказать разработчиков Java. Dave Dopson
Это заставляет нас, как разработчиков, внимательно взглянуть на использование памяти. В настоящее время я разрабатываю приложение, которое имеет очень большой набор данных, которыйдолжен находятся полностью в куче (из-за интенсивного процесса поиска), и моя первоначальная реализация на основе массива String заняла 15 МБ кучи только для этих данных (каждая ссылка String в массиве занимает 32 байта данных). Почти достигнув предела в 24 МБ, который все еще накладывают многие современные устройства, я разработал собственную структуру данных, которая занимает всего 3,5 МБ для хранения точно такой же информации. Теперь мое приложение будет работать даже на устройстве с ограничением в 16 МБ. Carl
32

хотя пиксели растрового изображения размещаются в собственной куче, некоторые специальные приемы в Dalvik приводят к тому, что они учитываются в куче Java. Это сделано по двум причинам:

(1) Чтобы контролировать объем памяти, приложение выделяет это. Без учета приложение могло бы выделить огромный объем памяти (поскольку сам объект Bitmap очень мал, но может удерживать произвольно большой объем собственной памяти), выходя за пределы кучи 16 МБ или 24 МБ.

(2) Чтобы помочь определить, когда GC. Без учета вы можете размещать и отпускать ссылки, скажем, на 100 растровых объектов; GC не будетне могут быть запущены, потому что эти объекты крошечные, но на самом деле они могут представлять большое количество мегабайт фактических выделений, которые в настоящее время не собираются GCed своевременно. С учетом этих распределений по куче Java сборщик мусора будет работать так, как он полагает, что используется память.

Обратите внимание, что во многих отношениях это деталь реализации; весьма вероятно, что это может измениться в будущем, хотя это базовое поведение останется в той или иной форме, поскольку они оба являются важными характеристиками для управления распределением растровых изображений.

Вы правы в этом вопросе. Тем не менее, GC отстает, когда дело доходит до обработки переработанных растровых изображений. Я'мы обнаружили непредсказуемое поведение, если я не запустил ГХ вручную после повторного использования растрового изображения (включая тенденцию к следующему »нагрузка» вернуть копию переработанного растрового изображения вместо фактической загрузки его с диска) Dave Dopson
Первый комментарий неверен, все телефоны учитывают распределение битовых карт по отношению к пределу кучи Dalvik. Главное изменение, о котором следует знать, это то, что начиная с Android 3.0, распределение фактически выполняется в куче Dalvik, поэтому вам больше не придется сталкиваться с ситуациями, когда GC не будет работать так агрессивно, как следовало бы. hackbod
Даже на телефонах, которые считают растровые изображения по куче Java, собственный malloc может выделить WAY более 16 МБ. Dave Dopson
@ hackbod ...as of Android 3.0 the allocations are actually done in the Dalvik heap... Так,recycle() бесполезен? AFAIK вы можетеВсегда вызывайте GC по команде. S.D.
33

которая поддерживает объект Bitmap, выделяется с использованием собственного кода (malloc()), а не Javanew ключевое слово. Это означает, что память управляется непосредственно ОС, а не Dalvik.

Единственная реальная разница между родной кучей и далвикомКуча Далвикаs куча мусора, а родная нетт.

Для этих целей здесьне большая разница. Когда ваш растровый объект получает мусор, он 'Деструктор перезапустит связанную память в собственной куче.

Источник:

http://osdir.com/ml/AndroidDevelopers/2009-03/msg00023.htmlAndroid: Платформа / каркасы / базовый / график / Java / Android / график / Bitmap.javaAndroid: Платформа / каркасы / базы / ядро / JNI / Android / график / Bitmap.cpp
Вы знаете, была ли эта ошибка когда-либо исправлена? Я'м в настоящее время сталкиваюсь с той же проблемой на громовой гряде. Я'я перерабатываю растровые изображения, но ониНикогда не очищайте пространство в собственной куче, что вызывает ошибки. Brian Griffey
Ах! так вы говорите, что подсчет теперь гораздо более интуитивно понятен? Тот'отлично - за исключением всех нас, кто написал хакерский код, чтобы суммировать кучу андроида с родной кучей ... Dave Dopson
Просто для ясности, приведенный выше ответ верен для Android версии 2.x и ниже. Начиная с Android 3, экземпляры растрового изображения встречаются в куче. Это легко проверить: создание растрового изображения в android 2.x оставит размер кучи Java практически неизменным, а создание его в Adnroid 3.x добавит много байтов в кучу Java. Shivan Dragon

Похожие вопросы