3

テストのために、2 つのアクティビティを作成しました

public class TestActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        getActionBar().setDisplayHomeAsUpEnabled(true);
        getActionBar().setDisplayShowHomeEnabled(true);

        setContentView(R.layout.activity_bpm);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case android.R.id.home:
                Intent intent = new Intent(TestActivity.this, TestActivity2.class);
                startActivity(intent);
                break;
            default:
                return super.onOptionsItemSelected(item);
        }

        return true;
    }
}

public class TestActivity2 extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        getActionBar().setDisplayHomeAsUpEnabled(true);
        getActionBar().setDisplayShowHomeEnabled(true);

        setContentView(R.layout.activity_about);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case android.R.id.home:
                Intent intent = new Intent(TestActivity2.this, TestActivity.class);
                startActivity(intent);
                break;
            default:
                return super.onOptionsItemSelected(item);
        }

        return true;
    }
}

次に、ホームボタンを頻繁に押してそれらを切り替えるだけで、LogCat に次のように表示されます。

05-02 15:55:36.211: D/dalvikvm(15615): GC_CONCURRENT freed 116K, 4% free 7548K/7812K, paused 4ms+2ms, total 20ms
05-02 15:55:40.301: D/dalvikvm(15615): GC_CONCURRENT freed 79K, 3% free 7853K/8080K, paused 2ms+2ms, total 24ms
05-02 15:55:43.611: D/dalvikvm(15615): GC_CONCURRENT freed 97K, 3% free 8189K/8432K, paused 1ms+10ms, total 53ms
05-02 15:55:50.171: D/dalvikvm(15615): GC_CONCURRENT freed 93K, 3% free 8492K/8732K, paused 5ms+9ms, total 44ms
05-02 15:55:53.021: D/dalvikvm(15615): GC_CONCURRENT freed 93K, 3% free 8788K/9028K, paused 2ms+5ms, total 35ms
05-02 15:55:54.861: D/dalvikvm(15615): GC_CONCURRENT freed 96K, 3% free 9116K/9360K, paused 2ms+9ms, total 48ms
05-02 15:55:57.061: D/dalvikvm(15615): GC_CONCURRENT freed 116K, 3% free 9504K/9768K, paused 2ms+7ms, total 45ms

使用メモリが増えていることがわかります。だから私は質問があります:これはどのように可能ですか??? 誰か手がかりがあれば説明してください。

4

4 に答える 4

0

これは、新しいアクティビティを実行しても以前のアクティビティが破棄されず、メモリを使用し続けるためです。戻るキーを押すと元に戻ります。

于 2013-05-02T08:08:04.897 に答える
0

ここにはメモリリークはないようです。コンカレント GC の実行は、すべての非アクティブなオブジェクトを収集しないことを決定する可能性があるため、メモリ リークの証拠ではありません。

を使用して GC を明示的に呼び出すことができますSystem.gc()。これにより、(通常) ガベージ コレクターが強制的に実行され、期限切れのすべてのオブジェクトが収集されます。

あなたの場合、メソッドを呼び出してみSystem.gc()onCreate()、アプリのメモリが増え続けるかどうかを確認してください。そうすれば、コードがメモリ リークしているかどうかを確実に知ることができます。

于 2013-05-02T08:16:33.330 に答える
0

TestActivity A と TestActivity2 B を呼び出すと、スタック内で初めて
A から B を開始すると、A --> B になります。B から A を開始すると、スタックは A --> B --> A になり、次に A になります。 --> B --> A --> B. スタックが成長していることがわかります。
数回行ったり来たりしてから戻るキーを押してみてください。ホーム画面に戻るまでにかなりの数の戻るキーを押す必要があります。

于 2013-05-02T08:18:42.787 に答える