Как увеличить размер кучи приложения для Android?

Я пишу приложение для Android, которое использует несколько 3D-моделей. Такая модель с текстурами может занимать много памяти. Я обнаружил, что производитель устанавливает ограничение на размер кучи, которую может использовать приложение. Например мой планшет Samsung Galaxy Tab 8.9 P7310 может занимать 64 МБ памяти.

Есть ли способ увеличить этот объем памяти, который может использовать приложение?

7 ответов

Решение

Вы можете использовать android:largeHeap="true", чтобы запросить больший размер кучи, но это не будет работать на любых устройствах до Honeycomb. На устройствах до 2.3 вы можете использовать класс VMRuntime, но это не будет работать на Gingerbread и выше.

Единственный способ получить максимально возможное ограничение - это выполнять задачи с интенсивным использованием памяти через NDK, так как NDK не накладывает ограничений на объем памяти, как SDK.

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

Есть ли способ увеличить этот объем памяти, который может использовать приложение?

Приложения, работающие на уровне API 11+, могут иметь android:largeHeap="true" на <application> элемент в манифесте для запроса размера кучи больше, чем обычно, и getLargeMemoryClass() на ActivityManager скажу вам, насколько большая эта куча. Тем не мение:

  1. Это работает только на уровне API 11+ (например, Honeycomb и выше)

  2. Нет никакой гарантии, насколько большой будет куча

  3. Пользователь будет воспринимать ваш запрос большой кучи, потому что он заставит другие приложения из ОЗУ завершить процессы других приложений, чтобы освободить системную память для использования вашей большой кучей

  4. Из-за № 3 и того, что я ожидаю, что android:largeHeap будет нарушен, поддержка этого может быть прекращена в будущем, или пользователь может быть предупрежден об этом во время установки (например, вам нужно будет запросить специальное разрешение на это)

  5. В настоящее время эта функция слегка документирована

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

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

также вы можете использовать native memory (NDK & JNI) Таким образом, вы фактически обойдете ограничение размера кучи.

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

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

Используйте второй процесс. Объявить в AndroidManifest новый Service с

android:process=":second"

Обмен между первым и вторым процессами закончился BroadcastReceiver

Это можно сделать двумя способами в зависимости от вашей ОС Android.

  1. Ты можешь использовать android:largeHeap="true" в теге приложения Android манифеста, чтобы запросить больший размер кучи, но это не будет работать ни на каких предварительно сотовых устройствах.
  2. На устройствах до 2.3 вы можете использовать класс VMRuntime, но это не будет работать на Gingerbread и выше. Ниже описано, как это сделать.
VMRuntime.getRuntime().setMinimumHeapSize(BIGGER_SIZE);

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

Ссылка: http://dwij.co.in/increase-heap-size-of-android-application

Из того, что я помню, вы могли бы использовать VMRuntime класс в ранних версиях Android, но теперь вы просто не можете больше.

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

Есть еще один альтернативный вариант, который используется для настройки параметров памяти. Все, что вам нужно сделать, это добавить / заменить существующую строку в файле gradle.properties

org.gradle.jvmargs=-Xmx1024m

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

Другие вопросы по тегам