Тестирование утечек памяти в приложениях Android

Недавно я узнал, сколько памяти может быть потрачено впустую из-за утечки контекста и как проверить такие утечки с помощью дампа памяти после изменения ориентации экрана.Необходимо создать экземпляр нового действия, а исходное - уничтожить и собрать. Однако, если я не теряю память и не вижу ее, действие, указанное ниже, похоже, не собирается, если оно запускает другое действие и уничтожает себя:

public class Foo extends Activity {
    private Button button;

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        button = new Button(this);
        button.setOnClickListener(new OnClickListener() {
            public void onClick(View view) {
                startActivity(new Intent(Foo.this, Bar.class));
                finish();
            }
        });

        setContentView(button);
    }

    protected void onDestroy() {
        super.onDestroy();

        button.setOnClickListener(null);

        Log.e("you're it", "isFinishing() == " + isFinishing());
    }
}

public class Bar extends Activity {
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        TextView textView = new TextView(this);
        textView.setText("hello, world");

        setContentView(textView);
    }
}

Вот информация о дампе памяти, полученная после нажатия кнопка для запуска Bar и запроса на сборку мусора несколько раз:

Class Name                                               | Shallow Heap | Retained Heap
----------------------------------------------------------------------------------------
com.test.testProject.Foo @ 0x4135b188                    |          184 |         2,208
 mOuterContext android.app.ContextImpl @ 0x4135b390      |           96 |           392
   java.lang.Thread @ 0x40996460  main Thread|           80 |         1,416
  mContext android.media.AudioManager @ 0x4135b480       |           48 |           176
----------------------------------------------------------------------------------------

Основываясь на this , я подумал, что добавление дополнительного финиша между действиями сделает первое подходящим для сбора и позволит мне проверить на наличие утечек дополнительный способ, разумно ли это? У меня утечка памяти? Есть ли какая-то причина, по которой Android хочет сохранить эту уничтоженную активность?

6
задан Community 23 May 2017 в 12:10
поделиться