【问题标题】:Get total RAM size that use Application in Android获取在 Android 中使用应用程序的总 RAM 大小
【发布时间】:2012-01-19 06:00:51
【问题描述】:

我想从我的 Android 手机收集一些统计数据

当我启动我的应用程序时,我想知道以下内容:

  • 应用程序使用多少 RAM。
  • 我的手机有多少可用 RAM。
  • 我的手机有多少 RAM。

我必须做些什么来收集这些统计数据,也许写一些代码,或者也许 您使用一些提供此类信息或其他信息的应用程序 别的。我使用 MAT,但它对我没有帮助,也许我错过了一些东西。

我想收集这些统计数据的主要原因是可能应用 开始杀死其他应用程序以释放更多空间,如果可以的话 收集这些信息我会明白一切。


已编辑

例如,我的应用程序使用大小为 85 MB 的库 (helper.jar),我知道如果应用程序使用 .jar,它会加载到手机的 RAM ,现在我怎么能看到我的 RAM 从 2 增长到 2 + 85(.jar 的大小)。

如果我从 ADB 输入 adb shell cat /proc/meminfo 这个命令,我会看到一些关于内存的信息。

我如何从 JAVA 代码中做同样的事情?


最好的问候,维托兄弟。

【问题讨论】:

标签: java android memory memory-management ram


【解决方案1】:

试试这个。它会根据你的需要为你提供与你的应用程序和总内存相关的内存信息。

私有 void getProcessInfo(){ PackageManager pm = this.getPackageManager();

    MemoryInfo memoryInfo = new ActivityManager.MemoryInfo();
        activityManager.getMemoryInfo(memoryInfo);


    List<RunningAppProcessInfo> runningAppProcesses = activityManager.getRunningAppProcesses();



    Map<Integer, String> pidMap = new TreeMap<Integer, String>();
    for (RunningAppProcessInfo runningAppProcessInfo : runningAppProcesses)
    {

        pidMap.put(runningAppProcessInfo.pid, runningAppProcessInfo.processName);

    }

    Collection<Integer> keys = pidMap.keySet();

    for(int key : keys)
    {

        ModelProcessInfo item=new ModelProcessInfo();
        int pids[] = new int[1];
        pids[0] = key;
        android.os.Debug.MemoryInfo[] memoryInfoArray = activityManager.getProcessMemoryInfo(pids);
        for(android.os.Debug.MemoryInfo pidMemoryInfo: memoryInfoArray)
        {


           Log.i(TAG, String.format("** MEMINFO in pid %d [%s] **\n",pids[0],pidMap.get(pids[0])));
           Log.i(TAG, " pidMemoryInfo.getTotalPrivateDirty(%d): " + pidMemoryInfo.getTotalPrivateDirty() + "\n");
            Log.i(TAG, " pidMemoryInfo.getTotalPss(): " + pidMemoryInfo.getTotalPss() + "\n");
           Log.i(TAG, " pidMemoryInfo.getTotalSharedDirty(): " + pidMemoryInfo.getTotalSharedDirty() + "\n");
            //pss->RAM used by your process

        }
       // activityManager.killBackgroundProcesses(pidMap.get(pids[0]));

    }

}

【讨论】:

    【解决方案2】:

    如果您想知道您的应用程序可以使用多少 RAM,请查看 ActivityManager.getMemoryClass

    应用程序可以拥有的内存存在此限制,因此应用程序无法从其他应用程序窃取所有内存。基本上你的应用程序不应该能够杀死其他应用程序。至少只要您不在应用程序中使用“大堆大小”选项。

    每个应用程序的限制为 16(在 G1 上)到 48 MB。这在很大程度上取决于您设备的总 RAM,您的应用程序可以拥有多少内存。例如 48 MB 适用于 1GB RAM。

    获取应用程序当前内存使用情况的一种方法是查看 logcat。它会说类似

    GC_CONCURRENT freed 1109K, 12% free 10115K/11463K, paused 5ms+2ms
    

    意味着您的程序大约需要 11 MB 的 RAM。

    【讨论】:

    • 我使用的是 Nexus S,它有 320MB 的 RAM,在哪里可以看到?
    • 正如我所说:使用 getMemoryClass()。它返回一个整数,说明您的应用程序可以拥有多少 MB。所以它会返回一个介于 16 和 48 之间的值。
    • 但是如果我的手机有 320MB 内存,为什么它使用表格 16 到 48 ??
    • 还有一个关于 Android 内存管理的 Google I/O 讨论:link。那里有解释。
    • 它只能使用很少的 RAM,因此 Android 和其他应用程序不会因为您的应用程序消耗所有 RAM 而耗尽 RAM。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-14
    • 1970-01-01
    • 1970-01-01
    • 2011-12-11
    • 1970-01-01
    • 2020-08-21
    • 1970-01-01
    相关资源
    最近更新 更多