3

只是为了测试我创建了两个活动

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

1

这里没有“内存泄漏”的证据。

内存泄漏是无法释放内存的情况。从您提供的几个数字中,无法得出这样的结论;该代码也不表明您正在创建内存泄漏。

然而,由 Android 决定何时物理删除不再可见的 Activity 对象;毕竟,有后退键,并且在返回旧 Activity 时将其保留在内存中会更有效。

Android 将 Activity 实例视为不同,因为它无法对其内部状态进行假设。Activity因此,您正在创建一个不断增长的访问对象历史列表。当 Android 从内存中删除一个旧的时,它会保存它Intent和任何 InstanceStateBundle信息。

数字不同的事实也归功于垃圾收集器的策略。毕竟,您的Activity对象并不是一路上创建的唯一对象。还创建了几个用户界面对象,并且垃圾收集器不需要总是因为它正在运行而释放所有内存。它还不如决定它已经释放了足够的内存并为下一轮留下了一些东西。

于 2013-05-02T08:21:12.863 回答
0

It is because when you run new activity previous is not destroyed and it keep using memory. You can return to it by pressing back key.

于 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 回答