Intereting Posts
Телефоны Samsung выпускают много сообщений журнала на logcat Android PCM Bytes Передача объектов из объектов между действиями Установка целевого почтового адреса в Firebase Invites Что такое Android Dependencies? Удалите его из пути сборки, возникает ClassNotFoundException Android-приложение, которое работает в режиме онлайн и офлайн? Как удалить отступ / маркер макета по умолчанию Смутно о togglesoftinput функции GCMNetworkManager не запускает PeriodicTask после перезагрузки TextView.setTextSize ведет себя ненормально – Как установить размер текста текстового вида динамически для разных экранов Android Parcelable – RetailerOrderActivity.java возвращает null Разрешение значений ресурсов в пользовательском правиле lint R не может быть разрешено переменной (новый проект Android) OnNavigationItemSelected в ActionBar вызывается при запуске, как его избежать? Как определить, какой внутренний анонимный класс указан именем класса?

Стратегия фрагментации кучи Android?

У меня есть приложение Android OpenGL, которое использует значительный объем памяти для создания сложной сцены, и это явно вызывает значительную фрагментацию кучи. Несмотря на отсутствие утечек памяти, невозможно уничтожить и создать приложение без его нехватки памяти из-за фрагментации. (Фрагментация – определенно проблема, а не утечка)

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

@Override protected void onStop() { super.onStop(); if(isFinishing()) { System.runFinalizersOnExit(true); System.exit(0); } } 

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

Примечание. Я понимаю, что это не «способ Android», но при условии, что сборщик мусора не уплотняется, невозможно постоянно повторно использовать кучу.

Этот techinque действительно работает вообще, однако он не работает, когда активность уничтожается в режиме без отделки и затем воссоздается.

Кто-нибудь получил какие-либо хорошие предложения о том, как справиться с деградации кучи?

Дальнейшее примечание: сокращение потребления памяти также не является вариантом. Активность фактически не использует столько памяти, но куча (и нативная куча), похоже, легко фрагментируется, возможно, из-за большого количества кусков памяти

Solutions Collecting From Web of "Стратегия фрагментации кучи Android?"

Фрагментация почти всегда является следствием плохой условной схемы распределения. Большие объекты часто создаются и уничтожаются. В сочетании с более мелкими объектами может сохраняться (или, по меньшей мере, другое время жизни) – отверстия в куче.

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

@edit: еще более конкретный вопрос: если куча после перезагрузки приложения еще не пуста, так что же остается в куче? Вы подтвердили, что это не проблема утечки памяти, но это то, что кажется. Так как вы используете OpenGL – возможно, некоторые родные обертки сохранились, потому что исходные ресурсы OpenGL не были правильно удалены?