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

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

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

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

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

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

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

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

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

7
задан chris 28 February 2012 в 17:59
поделиться