Действия, не уничтоженные системой ранее из-за нехватки памяти на Galaxy Nexus - PullRequest
3 голосов
/ 07 февраля 2012

У меня есть проблема в некоторых устройствах, таких как Galaxy Nexus, где, если вы продолжаете открывать действия, вы попадаете из-за ошибки памяти.Я думал, что у меня есть некоторые утечки памяти, которые препятствуют тому, чтобы действия были собраны, но я не мог найти это.Итак, я написал это небольшое задание (исключительно для целей тестирования).

public class Test extends Activity {    
    private byte[] imageData = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            Button iv = new Button(this);
            imageData = new byte[1024 * 1024 * 2];
            iv.setText("Open");
            iv.setOnClickListener(new OnClickListener() {
                    @Override
                    public void onClick(View v) {
                            startActivity(new Intent(Test.this, Test.class));
                    }
            });
            setContentView(iv);
    }
}

Итак, в основном, оно выделяет 2 МБ памяти, и вы можете открыть другой экземпляр того же действия.На Galaxy S и Kindle Fire, если вы продолжаете открывать, использование памяти увеличивается до определенной точки, а затем начинает разрушать старые действия для новых действий.

Однако в Galaxy Nexus он просто увеличивается до 64 МБ и вылетает с ошибкой нехватки памяти.

Так что я не знаю об управлении памятью Android или это ошибка нанекоторые устройства?Если это ошибка, как я могу обойти ее?

Спасибо.

Ответы [ 2 ]

1 голос
/ 09 февраля 2012

Я спросил об этом Дайану Хэкборн (один из инженеров фреймворка Android), и вот совет, который она дала:

Точка, в которой старые действия уничтожаются, является произвольной число, основанное на общем количестве мероприятий по всему система. Это всегда было так. Опираясь на деятельность уничтожено, чтобы восстановить память, как это никогда не будет стабильным; Менеджер активности ничего не знает о количестве оперативной памяти в процесс или ограничение на его ОЗУ или объем ОЗУ новой деятельности собираюсь взять на самом деле есть идея, когда он должен попытаться уничтожить деятельность в каждом процессе.

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

В этом случае, возможно, было бы целесообразно освободить вашу память после вызова onStop() или onPause().

1 голос
/ 07 февраля 2012

Насколько я знаю, Android предоставляет определенную память каждому приложению, если вы попытаетесь запустить больше, вы получите ошибку VMBudgetOutOfMemory.В Nexus Series используется универсальная сборка ОС Android с минимальной настройкой, и от OEM-производителя полностью зависит, насколько они настраивают ОС и оборудование своего устройства (в вашем случае вместе с управлением памятью).Так что лучше самим управлять действиями, в противном случае Android справится с этим. Поведение будет полностью зависеть от конкретной спецификации устройства.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...