Intereting Posts
Сообщение об ошибке в Android Studio при попытке запуска и загрузки эмулятора в первый раз Ограничить запрос в CursorLoader Android 5.0 делает невыделенные флажки невидимыми, когда фон белый Android, как изменить ширину и высоту элемента OnActivityResult Никогда не называется Phonegap Cordova Пакет отказов Gradle не существует Плагин сканера штрих-кода Zxing для Android-телефона, не работающего на Nexus 7, который имеет только переднюю камеру Android In-App Billing v3: не получает подписей Как я могу использовать системные значки в приложении для Android? Android получить размер экрана устарел? FragmentStatePagerAdapter с ChildFragmentManager – FragmentManagerImpl.getFragment приводит к исключению NullPointerException Что такое намерение в Android? Как преобразовать длинное значение даты в формат mm / dd / yyyy Добавьте RawContact, чтобы он заполнил существующий контакт Android: RadioButton внутри вложенной компоновки под RadioGroup выпадает из группы

Android: как увеличить размер кучи во время выполнения?

У меня есть кэш изображений в моем приложении, который реализован с помощью SoftReferences. Dalvik запускает приложения с относительно небольшой кучей, а затем увеличивает его в случае спроса. Но я бы хотел, чтобы размер кучи был больше с самого начала. Это связано с тем, что, когда у меня уже есть некоторые изображения в кеше, и начинается действие (например) или другое пиковое потребление памяти, мой кеш очищается, чтобы обеспечить память для этого пикового спроса. В результате, после того, как пик пропал, у меня все еще есть 2-3 МБ свободного места, но мой кеш пуст!

Решение, которое я вижу для этой проблемы, заключается в предварительном распределении большего размера кучи, так что даже при пиковом потреблении в 2-3 МБ у него все еще есть пространство для комнат, поэтому мои SoftReferences не очищаются.

Я обнаружил, что VMRuntime.getRuntime().setMinimumHeapSize(BIGGER_SIZE) будет полезен. В частности, Google использует это в своих приложениях, как указано здесь . Однако класс VMRuntime отмечен устаревшим и считается удаленным из публичного API в будущей версии. Поэтому setMinimumHeapSize не является постоянным решением.

Как тогда я заставляю Dalvik выращивать кучу при запуске?

В настоящее время я использую действительно прямолинейный и дрянной метод, просто выделив большой массив и выпустив его. Это заставляет Далвик вырастить кучу, как я хочу. Тем не менее, я уверен, что должен быть более элегантный способ сделать это. Не могли бы вы мне это рассказать, пожалуйста?

Solutions Collecting From Web of "Android: как увеличить размер кучи во время выполнения?"

Вместо увеличения размера кучи вы можете сделать что-то лучше. Как вы сказали, вы поддерживаете кэш в своем приложении, которое реализовано с помощью SoftReferences. Лучше всего использовать LruCache, вы можете сделать что-то вроде этого:

 private LruCache<String, Bitmap> bitmapCache; final int memClass; int cacheSize; memClass = ((ActivityManager) context.getSystemService( Context.ACTIVITY_SERVICE)).getMemoryClass(); 

Вернуть приблизительный класс памяти для каждого приложения для текущего устройства. Это дает вам представление о том, как сильно ограничить память, которую вы должны наложить на свое приложение, чтобы обеспечить полную работоспособность всей системы. Возвращаемое значение находится в мегабайтах; Базовый класс памяти Android – 16 (что является прецедентом кучи Java для этих устройств); Некоторое устройство с большим объемом памяти может возвращать 24 или даже более высокие номера.

 cacheSize = 1024 * 1024 * memClass / 10; bitmapCache = new LruCache<String, Bitmap>(cacheSize) { @Override protected int sizeOf(String key, Bitmap value) { return value.getHeight() * value.getRowBytes(); } }; 

Он удалит растровые изображения из LruCache, если память превысит расположенную память до LruCache и загрузит в нее новое изображение.

Если кеш усально мал, как вы говорите, вы сами можете определить действительный размер вашего приложения и сохранить свой собственный кеш без SoftReferences.

Например, простой счетчик байтов: просто добавьте или переместите любой элемент, используемый в верхней части списка, добавьте его размер в счетчик, если он новый. Удалите снизу, если суммарные байты превышают лимит вашего лидера, уменьшая тем самым ваш счетчик. Может быть, класс LinkedHashMap полезен для этого: он может использоваться как кеш, как HashMap , но он имеет порядок, также как и список.

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

Вы не можете увеличить размер кучи динамически.

Вы можете попросить использовать больше, используя андроид: largeHeap = "true" в манифесте, но вы можете не получить больше размера кучи, чем обычно, поскольку это всего лишь запрос.

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

Вот несколько сообщений, которые я сделал об этом:

  • Как кэшировать растровые изображения в родной памяти

  • JNI, чтобы помочь избежать OOM при использовании больших изображений

И вот библиотека, которую я сделал для нее:

Я не думаю, что вы можете или должны влиять на память устройства на этом уровне. Пусть система сделает свое дело и не идет против этого. Нужно ли хранить такой большой кеш изображения с помощью SoftReferences, даже когда начинаются действия?

Вы хотите проверить, как это делается в полках: см. Строку 82 в http://code.google.com/p/shelves/source/browse/trunk/Shelves/src/org/curiouscreature/android/shelves/util/ImageUtilities .java? г = 26