Стратегия фрагментации кучи Android? - PullRequest
7 голосов
/ 28 февраля 2012

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

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

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

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

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

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

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

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

1 Ответ

4 голосов
/ 28 февраля 2012

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

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

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

...