Действия Android никогда не вызывают GC из-за нехватки памяти - PullRequest
1 голос
/ 19 января 2012

У меня есть два вида деятельности, оба имеют внутренний класс SurfaceView, который имеет внутренний класс Thread.Первый - это экран меню, а второй - экран гонки, в котором играют в игру.

Чтобы начать второе действие с первого, я делаю это:

Intent intent = new Intent();
intent.setClass(Menu.this, RaceActivity.class);
intent.putExtra("level", level.getNumber());
startActivityForResult(intent, 0);

Когда уровеньзакончено, из второго действия, которое я запускаю.

finish();

Это вызывает мой метод onDestroy.У меня сложилось впечатление, что этого будет достаточно, чтобы сделать второе занятие доступным для сбора мусора.Но когда я заканчиваю гонку и начинаю новую гонку несколько раз, я замечаю, что в конце концов потерплю крах.Используя инструмент Memory Analyzer Tool (MAT) в Eclipse, я обнаружил множество ссылок на мою вторую активность, а SurfaceView и Thread все еще удерживались.Поэтому я также решил очистить их с помощью метода уничтожения.

public void onDestroy() {
    super.onDestroy();
    mPanel.mThread.destroy(); //destroys surfaceholder in thread
    mPanel.mThread = null;
    mPanel = null;
}

Кажется, это уничтожило почти все.Но когда я вхожу в МАТ, я все еще вижу одну ссылку на 2-е действие (при выборе Путь к корням GC -> Исключить слабые ссылки)

Class Name                                  | Shallow Heap | Retained Heap
---------------------------------------------------------------------------
com.moz.by.RaceActivity @ 0x405b6108 Unknown|          280 |         8,008
---------------------------------------------------------------------------

Это название действия, которое я пытаюсь выполнить в GC.так что кажется, что он где-то держит ссылку на себя.Либо это, либо ключевое слово Unknown имеют здесь некоторое значение.

Меня смущает проблема, так как я не уверен, куда идти дальше, чтобы найти это.Интересно, смогу ли я найти то, что не так, эта деятельность, наконец, очистится!Я застрял на этом пару дней, поэтому я подумал, что подробно объясню мою проблему вам, хорошие люди.Кто-то может подсказать ошибку для начинающих, которую я допустил.

Спасибо за чтение.

PS Это мое первое приложение, извиняюсь, если я пропустил что-то базовое в своем рабочем процессе.Ниже приведена часть dominator_tree из MAT после того, как я начал и закончил несколько гонок.

Class Name                                                            | Shallow Heap | Retained Heap | Percentage
------------------------------------------------------------------------------------------------------------------
com.moz.by.RaceActivity @ 0x405989e8 Unknown                          |          280 |         4,464 |      0.15%
com.moz.by.RaceActivity @ 0x405b6108 Unknown                          |          280 |         8,008 |      0.26%
com.moz.by.RaceActivity @ 0x406532e8 Unknown                          |          280 |         4,024 |      0.13%
com.moz.by.RaceActivity @ 0x4077f290 Unknown                          |          280 |         5,440 |      0.18%
com.moz.by.RaceActivity$Panel @ 0x40513d40 Unknown                    |          432 |         1,496 |      0.05%
com.moz.by.RaceActivity$Panel @ 0x40527148 Unknown                    |          432 |         1,496 |      0.05%
com.moz.by.RaceActivity$Panel @ 0x40653878 Unknown                    |          432 |         1,496 |      0.05%
com.moz.by.RaceActivity$Panel @ 0x40788490 Unknown                    |          432 |         1,496 |      0.05%
com.moz.by.RaceActivity$TutorialThread @ 0x40569580  Thread-35        |          120 |           192 |      0.01%
com.moz.by.RaceActivity$TutorialThread @ 0x40642558  Thread-37 Unknown|          120 |           192 |      0.01%
com.moz.by.RaceActivity$TutorialThread @ 0x40683108  Thread-59 Unknown|          120 |           120 |      0.00%
com.moz.by.RaceActivity$TutorialThread @ 0x406a56f0  Thread-57        |          120 |           192 |      0.01%
com.moz.by.RaceActivity$TutorialThread @ 0x40706f20  Thread-51        |          120 |           192 |      0.01%
com.moz.by.RaceActivity$TutorialThread @ 0x40707fe8  Thread-45 Unknown|          120 |           192 |      0.01%
com.moz.by.RaceActivity$TutorialThread @ 0x4077fa10  Thread-53 Unknown|          120 |           192 |      0.01%
com.moz.by.RaceActivity$TutorialThread @ 0x40789da0  Thread-43        |          120 |           192 |      0.01%
------------------------------------------------------------------------------------------------------------------

EDIT:

Так что, похоже, последняя ссылка на RaceActivity -во внутреннем внутреннем классе TutorialThread, где он содержит ссылку на класс в переменной this $ 0.См. Ниже.

Type   |Name          |Value
-----------------------------------------------------------
ref    |this$0        |com.moz.by.RaceActivity @ 0x4053b080
ref    |mSurfaceHolder|null
ref    |mPanel        |null
boolean|mRun          |false
-----------------------------------------------------------

Я не уверен, почему это происходит, вот как я заканчиваю свою тему.

boolean retry = true;
mThread.setRunning(false);
while (retry) {
  try {
    mThread.join();
    retry = false;
  } catch (InterruptedException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
  }
}

Я думал, что это должно закончить тему, но это никогдаполучает GC из-за этой последней ссылки в странной переменной $ 0.Кто-нибудь знает, что это за переменная и как я могу ее очистить?

1 Ответ

2 голосов
/ 19 января 2012

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

Кстати, когда вы останавливаете тему, вы делаете это так?

Thread myThread = new Thread();

        try {
            myThread.join();
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        myThread = null;

Вы должны.

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