获取在 Android 中使用应用程序的总 RAM 大小

Posted

技术标签:

【中文标题】获取在 Android 中使用应用程序的总 RAM 大小【英文标题】:Get total RAM size that use Application in Android 【发布时间】: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 代码中做同样的事情?


最好的问候,维托兄弟。

【问题讨论】:

How to discover memory usage of my application in Android 的可能重复项 @AVD 我已经阅读了您选择为重复的帖子,但我找不到我的问题的答案! 我已经阅读了很多文章并搜索了互联网以找到答案,但我仍然找不到。所以,如果你能请帮忙! 请查看 SO 线程和博客 - ***.com/questions/3170691/… , android-developers.blogspot.com/2011/03/… @AVD 我想知道的不是堆大小,我想知道我的应用程序使用了多少 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。

以上是关于获取在 Android 中使用应用程序的总 RAM 大小的主要内容,如果未能解决你的问题,请参考以下文章

应用程序可以使用的最大 RAM 量是多少?

如何分析 Windows 和 Linux 上的应用程序以获取 CPU 和 RAM 使用值? [关闭]

C# - 以百分比形式获取 GPU 的总使用量

如何在 android 设备中获取当前可用的免费 RAM [重复]

如何在 Windows 上获取总磁盘大小?

Android 获取File类视频文件的总时长