2017-02-11 4 views
0

У меня есть googled, но я не могу понять, как определить максимальную кучу, которую поставщик установил для java-кучи Android. Я знаю, как получить максимальную кучу и максимальную кучу, вы должны использовать для приложения с этой большой теме: Android heap size on different phones/devices and OS versionsКак определить максимальную кучу Android, которую поставщик установил в

Но когда я запускаю эти два метода и сравнить результаты, что Android-студия Memory Profiler дс-х у него есть наполовину ценность того, что говорит ActivityManager getMemoryClass. Поэтому я подозреваю, что поставщик установил его ниже этого значения. У меня есть LG G4, а getMemoryClass - 256 МБ, но я вижу, что GC происходит вокруг 128 МБ.

+0

Ум, сбор мусора не дожидается, пока вы не достигнете предела кучи. В конце концов, на устройстве есть другие приложения, конкурирующие за одну и ту же память. – CommonsWare

+0

Спасибо, я знаю, что для JVM Oracle у него была формула, которая, как казалось, указывала 90% от максимальной, когда она собиралась. Я вижу хороший пилообразный сигнал, но он никогда не выходит за пределы 128 МБ. Мое приложение действительно использует много изображений, которые должны выходить за пределы 128 МБ, когда я подчеркиваю, если я никогда этого не увижу. Однако я буду внимательно смотреть. –

+0

Я провела стресс-тест и, конечно же, на жестком лимите 128 МБ. Я пытаюсь настроить использование памяти на основе доступной кучи вместо того, чтобы иметь что-то из файла конфигурации. Если поставщик устанавливает предел, не основанный на двух методах, упомянутых в ссылке выше, я хотел бы знать программно, что это такое. –

ответ

1

Вы попробовали android:largeHeap в своем манифесте. Этот флаг указывает системе, что вашему приложению может понадобиться большая куча памяти, чем для обычного приложения. Однако система принимает окончательный вызов на основе общего объема памяти, доступного на устройстве. Google говорит, что документ -

андроида: largeHeap

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

Чтобы запросить доступный размер памяти во время выполнения, используйте методы getMemoryClass() или getLargeMemoryClass().

Так что для вашей цели, поскольку вам нужна большая куча, это определенно поможет. Теперь это, очевидно, не отвечает на вопрос, почему getMemoryClass возвращает 256 МБ, а сборка мусора происходит на 128 МБ (может быть, система хранит слишком широкий буфер). Я предлагаю вам напечатать возвращаемое значение другого метода на ActivityManager, которое равно getLargeMemoryClass. Это наряду с поворотом largeHeap может предоставить некоторые подсказки

+0

Я пробовал андроид: largeHeap, и это не привело к изменению предела памяти. Я слышал, что это всего лишь запрос и не должен быть удостоен этого устройства. также использовал getLargeMemoryClass, и он вернул 512 МБ или дважды getMemoryClass(). –

0

Хорошо. Я получил андроид: largeHeap = «true» для работы, что мне было нужно. Кажется, я должен был поместить следующие утверждения в мой класс основной деятельности. ActivityManager am = (ActivityManager) getSystemService (ACTIVITY_SERVICE); am.getLargeMemoryClass();

Смежные вопросы