【问题标题】:Is android leeking memory or something wrong in my test codeandroid leeking memory 或者我的测试代码中有什么问题
【发布时间】:2013-06-06 10:15:41
【问题描述】:

我有一个空活动。这个活动有一个简单的hello world。在 Eclipse 中使用 New|Android 应用程序创建。 我观察到的是,如果我转储此应用程序的 dalvik 私有内存,则每次重新加载活动(方向更改)时,我都会看到此进程的 dalvik 私有内存有所增加。下面是日志。这是正确的观察吗?请告诉我

06-06 15:38:38.139: D/hworld(5477): DalvikPM1956
06-06 15:38:41.599: D/hworld(5477): DalvikPM2120
06-06 15:38:43.989: D/hworld(5477): DalvikPM2240
06-06 15:38:45.959: D/hworld(5477): DalvikPM2364
06-06 15:38:47.769: D/hworld(5477): DalvikPM2488
06-06 15:38:49.999: D/hworld(5477): DalvikPM2612
06-06 15:38:51.989: D/hworld(5477): DalvikPM2736
06-06 15:38:54.019: D/hworld(5477): DalvikPM2852
06-06 15:38:55.789: D/hworld(5477): DalvikPM2976
06-06 15:38:57.779: D/hworld(5477): DalvikPM3088
06-06 15:39:04.389: D/hworld(5477): DalvikPM3236
06-06 15:39:09.389: D/hworld(5477): DalvikPM3364
06-06 15:39:10.389: D/hworld(5477): DalvikPM3484
06-06 15:39:11.789: D/hworld(5477): DalvikPM3604

代码

package com.ahw.android_hello_world;

import java.util.Iterator;
import java.util.List;

import android.os.Bundle;
import android.app.Activity;
import android.app.ActivityManager;
import android.app.ActivityManager.RunningAppProcessInfo;
import android.content.Context;
import android.util.Log;
import android.view.Menu;

public class MainActivity extends Activity {
    protected Iterator i;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Context context = getApplicationContext();
        ActivityManager manager = (ActivityManager)getSystemService(Context.ACTIVITY_SERVICE);
         List<RunningAppProcessInfo> list= manager.getRunningAppProcesses();

     for(i = list.iterator(); i.hasNext(); )
        {
            RunningAppProcessInfo p = (RunningAppProcessInfo)i.next();
            if(p.processName.compareTo("com.ahw.android_hello_world")==0){

                int[] pids = new int[1];
                pids[0] = p.pid;
                ActivityManager activityManager = (ActivityManager)
                        getSystemService(Context.ACTIVITY_SERVICE);

                android.os.Debug.MemoryInfo[] MI = activityManager.getProcessMemoryInfo(pids);

                Log.d("hworld","DalvikPM" + MI[0].dalvikPrivateDirty);
                break;

            }
        }
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

}

更新:::: 有点好奇,查看了高级任务管理器我的应用程序内存使用情况,令人震惊的是 6.8MB,仅通过改变方向就达到了 8mb 甚至更多。 一个 hello world 到底是为了什么而占用 8mb 空间?在移动设备上?

【问题讨论】:

  • 每个应用程序都有一定数量的内存,可以单独使用。 Java/Android 垃圾回收如果还有足够的空间基本上不需要清理,所以每次重新创建 Activity 时使用的内存都会增长。
  • 是吗。但这会导致内部分裂。如果系统中有 10 个进程没有消耗它们的配额并且 gc 没有被调用,那么一个新进程必须饿死或启动一个进程,如果这个内部碎片得到处理,这可能不需要......跨度>

标签: android memory-leaks


【解决方案1】:

如果您更改设备的方向,则 Activity 会再次重新加载,因此它会调用 onCreate 方法。其他进程没有被释放,所以每次调用 onCreate 时,都会执行一个新进程,这会增加内存。

【讨论】:

  • 是的。但是为什么进程的整体内存要增加呢?
  • 因为其他进程没有释放,你正在查看你的activity进程。
  • 你明白我的意思了吗?
  • 没有 tato469。但我碰巧按下主页按钮启动差异应用程序,然后回到我的应用程序。内存一直在增加...
  • 因为这个过程没有用主页按钮完成,它仍然在后台。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-01-23
  • 1970-01-01
  • 1970-01-01
  • 2021-12-25
  • 1970-01-01
  • 1970-01-01
  • 2011-07-28
相关资源
最近更新 更多