【问题标题】:how to get memory usage and cpu usage by application?如何获取应用程序的内存使用情况和 CPU 使用情况?
【发布时间】:2012-04-03 02:56:48
【问题描述】:

我找到了这段代码来获取整体 CPU 使用率。这是否可以将其转换为按进程告诉 cpu 使用情况?是否有任何API可以让我们获得android的CPU或内存使用情况?

private float readUsage() {
    try {
        RandomAccessFile reader = new RandomAccessFile("/proc/stat", "r");
        String load = reader.readLine();

        String[] toks = load.split(" ");

        long idle1 = Long.parseLong(toks[5]);
        long cpu1 = Long.parseLong(toks[2]) + Long.parseLong(toks[3]) + Long.parseLong(toks[4])
              + Long.parseLong(toks[6]) + Long.parseLong(toks[7]) + Long.parseLong(toks[8]);

        try {
            Thread.sleep(360);
        } catch (Exception e) {}

        reader.seek(0);
        load = reader.readLine();
        reader.close();

        toks = load.split(" ");

        long idle2 = Long.parseLong(toks[5]);
        long cpu2 = Long.parseLong(toks[2]) + Long.parseLong(toks[3]) + Long.parseLong(toks[4])
            + Long.parseLong(toks[6]) + Long.parseLong(toks[7]) + Long.parseLong(toks[8]);

        return (float)(cpu2 - cpu1) / ((cpu2 + idle2) - (cpu1 + idle1));

    } catch (IOException ex) {
        ex.printStackTrace();
    }

    return 0;
}

【问题讨论】:

    标签: android memory process cpu-usage


    【解决方案1】:

    试试这个:

        private float getCpuPer() { //for single process
    
        float cpuPer = 0;
        try {
            String[] cmd = {"top", "-n", "1"};
            Process process = Runtime.getRuntime().exec(cmd);
            BufferedReader stdInput = new BufferedReader(new
                    InputStreamReader(process.getInputStream()));
    
            BufferedReader stdError = new BufferedReader(new
                    InputStreamReader(process.getErrorStream()));
    
            // read the output from the command
            //System.out.println("Here is the standard output of the command:\n");
            String s = null;
            while ((s = stdInput.readLine()) != null) {
                if (s.contains("your process name")) {
                    String [] arr = s.split(" ");
                    for (int i = 0; i < arr.length; i++) {
                        if (arr[i].contains("%")) {
                            s = arr[i].replace("%", "");
                            cpuPer = Float.parseFloat(s);
                            break;
                        }
                    }
                    //System.out.println(s);
                }
            }
    
            // read any errors from the attempted command
            //System.out.println("Here is the standard error of the command (if any):\n");
            //while ((s = stdError.readLine()) != null) {
                //System.out.println(s);
            //}
        } catch (IOException e) {
            e.printStackTrace();
        }
        return cpuPer;
    }
    

    【讨论】:

      【解决方案2】:
      Context context = this.getApplicationContext();
      ActivityManager mgr = (ActivityManager)context.getSystemService(ACTIVITY_SERVICE);
      List<RunningAppProcessInfo> processes = mgr.getRunningAppProcesses();
      Log.e("DEBUG", "Running processes:");
      for(Iterator i = processes.iterator(); i.hasNext(); )
      {
          RunningAppProcessInfo p = (RunningAppProcessInfo)i.next();
          Log.e("DEBUG", "  process name: "+p.processName);
          Log.e("DEBUG", "     pid: "+p.pid);                    
          int[] pids = new int[1];
          pids[0] = p.pid;
          android.os.Debug.MemoryInfo[] MI = mgr.getProcessMemoryInfo(pids);
          Log.e("memory","     dalvik private: " + MI[0].dalvikPrivateDirty);
          Log.e("memory","     dalvik shared: " + MI[0].dalvikSharedDirty);
          Log.e("memory","     dalvik pss: " + MI[0].dalvikPss);            
          Log.e("memory","     native private: " + MI[0].nativePrivateDirty);
          Log.e("memory","     native shared: " + MI[0].nativeSharedDirty);
          Log.e("memory","     native pss: " + MI[0].nativePss);            
          Log.e("memory","     other private: " + MI[0].otherPrivateDirty);
          Log.e("memory","     other shared: " + MI[0].otherSharedDirty);
          Log.e("memory","     other pss: " + MI[0].otherPss);
      
          Log.e("memory","     total private dirty memory (KB): " + MI[0].getTotalPrivateDirty());
          Log.e("memory","     total shared (KB): " + MI[0].getTotalSharedDirty());
          Log.e("memory","     total pss: " + MI[0].getTotalPss());            
      }
      
      • 在现代操作系统中,应用程序使用共享库。因此,使用了一些内存 通过多个应用程序,确定应用程序的内存使用情况变得复杂。

      • dalvikPrivateDirty 是 java 将释放的内存
        如果进程被杀死,虚拟机

      • nativePrivateDirty 对于本机代码是相同的 对于某些代码是相同的 其他代码(不知道还有什么)
      • otherPrivateDirty dalvikSharedDirty 是由 java虚拟机 但是这个不会被释放

      • 如果这个应用程序被杀死 dalvikPss – 估计有多少内存
        应用程序使用。这包括所有的私有内存,以及一个
        共享内存的一部分检查 pss >= private 原因
        只使用了一小部分共享内存是这样
        所有负责任的应用程序共享内存使用的合理性

      此值用于估计应用程序的内存负载。

      总数是 dalvik、native 和其他的总和。

      【讨论】:

      • Log.e("memory"," 总 pss: " + MI[0].getTotalPss());此行将以字节还是 KB 为单位返回内存?
      【解决方案3】:

      读取 /proc/[pid]/stat - [pid] 是您的目标进程的 pid

      然后寻找以下成员。

      • utime %lu
      • 时间 %lu

      man /proc@http://linux.die.net/man/5/proc

      【讨论】:

        【解决方案4】:

        在运行您的应用程序时,运行 Android-sdk\tools 文件夹中的 DDMS 工具。您将在哪里获得有关所有正在运行的进程的完整详细信息。如果您启用了调试 Android 设备,那么您甚至可以通过将设备连接到系统来进行调试。

        【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-04-20
        • 1970-01-01
        • 1970-01-01
        • 2013-07-19
        • 2013-04-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多