Я пишу приложение для Android, использующее несколько 3D-моделей. Такая модель с текстурами может занимать много памяти. Я узнал, что производитель устанавливает ограничение на размер кучи, который может использовать приложение. Например, мой планшет Samsung Galaxy Tab 8.9 P7310 может занимать 64 МБ памяти.
Есть ли способ увеличить этот размер памяти, который может использовать приложение?
largeHeap=true
FTWПриложения, работающие на уровне API 11+, могут иметь
android:largeHeap="true"
в<application>
элементе манифеста запросить размер кучи больше обычного, иgetLargeMemoryClass()
onActivityManager
сообщит вам, насколько велика эта куча. Тем не мение:Это работает только на уровне API 11+ (например, Honeycomb и выше).
Нет гарантии, насколько большой будет большая куча.
Пользователь будет воспринимать ваш запрос большой кучи, потому что он
вынудит другие его приложения из ОЗУзавершать процессы других приложений, чтобы освободить системную ОЗУ для использования вашей большой кучейИз-за № 3 и того факта, что я ожидаю, что этим
android:largeHeap
будут злоупотреблять, поддержка этого может быть прекращена в будущем, или пользователь может быть предупрежден об этом во время установки (например, вам нужно будет запросить специальное разрешение для этого )В настоящее время эта функция немного документирована.
источник
inBitmap
наBitmapOptions
). Кроме того, удалите все ссылки на них, и в конечном итоге они будут собраны мусором.android:largeHeap
. Однако запрос большой кучи может нанести вред пользователю в целом, вынуждая другие процессы приложения завершаться раньше, чем это потребовалось бы в противном случае.вы не можете увеличивать размер кучи динамически.
вы можете запросить использование большего количества, используя
android:largeHeap="true"
в манифесте.Кроме того, вы можете использовать
native memory (NDK & JNI)
, чтобы фактически обойти ограничение размера кучи.вот несколько сообщений, которые я написал об этом:
Как кэшировать растровые изображения в собственную память
Операции с растровыми изображениями JNI, помогающие избежать OOM при использовании больших изображений
и вот библиотека, которую я для этого сделал:
источник
Используйте второй процесс. Объявить в
AndroidManifest
новомService
сОбмен между первым и вторым процессом закончился
BroadcastReceiver
источник
Это можно сделать двумя способами в зависимости от вашей ОС Android.
android:largeHeap="true"
тег приложения в манифесте Android, чтобы запросить больший размер кучи, но это не будет работать ни на каких устройствах, предшествующих Honeycomb.Перед настройкой HeapSize убедитесь, что вы ввели соответствующий размер, который не повлияет на работу других приложений или ОС. Перед настройкой просто проверьте, какой размер занимает ваше приложение, а затем установите размер только для выполнения вашей работы. Не используйте так много памяти, иначе это могут повлиять на работу другие приложения.
Ссылка: http://dwij.co.in/increase-heap-size-of-android-application
источник
Насколько я помню, вы могли использовать
VMRuntime
class в ранних версиях Android, но теперь больше не можете.Я не думаю, что разрешение разработчику выбирать размер кучи в мобильной среде можно считать таким безопасным. Я думаю, что проще найти способ изменить размер кучи на конкретном устройстве (не на стороне программирования), пытаясь изменить его из самого приложения.
источник
Увеличение Java Heap несправедливо пожирает дефицит мобильных ресурсов. Иногда достаточно просто дождаться сборки сборщика мусора, а затем возобновить работу после того, как пространство кучи уменьшится. Тогда используйте этот статический метод .
источник