У меня есть приложение OpenGL для Android, которое использует значительный объем памяти для настройки сложной сцены, и это явно вызывает значительную фрагментацию кучи. Несмотря на отсутствие утечек памяти, невозможно уничтожить и создать приложение без нехватки памяти из-за фрагментации. (Проблема определенно является фрагментацией, а не утечками)
Это вызывает серьезную проблему, поскольку Android имеет привычку уничтожать и создавать действия на одной и той же виртуальной машине / куче, что, очевидно, приводит к сбою активности.В качестве стратегии противодействия этому я использовал следующую технику:
@Override
protected void onStop() {
super.onStop();
if(isFinishing()) {
System.runFinalizersOnExit(true);
System.exit(0);
}
}
Это гарантирует, что когда действие завершается, оно вызывает полное завершение работы виртуальной машины и, следовательно, при следующем запуске действия она получает новую нефрагментированную кучу.
Примечание: я понимаю, что это не «способ Android», но, учитывая, что сборщик мусора не сжимает, невозможно постоянно повторно использовать кучу.
Этот метод действительно работает в целом, однако он не работает, когда действие уничтожается в режиме без завершения, а затем создается заново.
Есть ли у кого-нибудь хорошие предложения о том, как справиться с деградацией кучи?
Дополнительное примечание: уменьшение потребления памяти тоже не вариант. Действие на самом деле не использует так много памяти, но куча (и собственная куча), похоже, легко фрагментируется, вероятно, из-за некоторых больших блоков памяти