zoukankan      html  css  js  c++  java
  • APP——内存测试——参考01

    前言:

    1.该内容为APP应用客户端的性能测试,未涉及后台,所以并非针对API或数据接口

    2.测试的目标项:资源消耗、内存泄露、电量功耗、响应时间

    3.客户端的性能指标:内存、CPU、流量

    4.本系列主要是讲述 如何获取安卓APP应用的性能指标,并简单分析,定位问题

    一、查看 内存 指标:

     执行命令:adb   shell   ps   -A    |findstr    com.wawj.app.t

    C:Usersdel>adb shell ps -A |findstr com.wawj.app.t

    u0_a165          19335            557             5582292                     264620              0               0            S com.wawj.app.t

    u0_a165          19531            557             4574096                     88564                 0              0            S com.wawj.app.t:pushcore

    u0_a165           23819          19335           4878692                    207928              0                0            S com.wawj.app.t

    C:Usersdel>


    得到的进程(PID):19335

    查询内存信息:

    可通过两种方式获取:

    a.通过 “ dumpsys meminfo  包名/pid ” 命令获取,输入:dumpsys meminfo 30017

    adb shell dumpsys meminfo 19335        或者       adb shell dumpsys meminfo com.wawj.app.t

     

     

     

    Pss Total :实际使用的物理内存

    private dirty:私有驻留内存

    Heap Size:    占用总内存(Heap  堆)(扩展:进程内存空间是虚拟内存,区分于物理内存,进程无法直接操作物理内存RAM。

                          必要时,操作系统对其进行映射,使进程能应用到物理内存)

    Heap Alloc:   分配内存

    Heap Free:   空闲内存

    native process和java process占据内存的大小(扩展:c++申请的内存为native process,java申请的内存:java process)

    内存大小:  native process:13004

                        dalvik process:10448

    注:因为Android系统对dalvik的vm heapsize作了硬性限制,当java进程申请的java空间超过阈值时,就会抛出OOM异常(这个阈值可以是48M、24M、16M等,视机型而定)

            查看单个应用最大内存限制,输入命令:adb    shell    getprop    |findstr    heapgrowthlimit。dalvik process 超过就会抛OOM异常

    执行命令:adb    shell     getprop     |findstr     heapgrowthlimit

    =================================================================================================

    可直接通过:procrank 。

    手机中的sh是经过精简过的,有些手机可能没有 procrank 命令,可以使用genymotion模拟器,或是自己安装procrank命令。

    (我也没这个命令,没有装好,这部分内容未操作,为网络直接获取)

    VSS- Virtual Set Size 虚拟耗用内存(包含共享库占用的内存)——是单个进程全部可访问的地址空间

    RSS- Resident Set Size 实际使用物理内存(包含共享库占用的内存)——单个进程实际占用的内存大小,不是精确描述

    PSS- Proportional Set Size 实际使用的物理内存(比例分配共享库占用的内存)——对于系统中的整体内存使用是一个很好的描述

    USS- Unique Set Size 进程独自占用的物理内存(不包含共享库占用的内存)——单个进程的全部私有内存大小,亦即全部被该进程独占的内存大小。

    一般来说内存占用大小有如下规律:VSS >= RSS >= PSS >= USS。

    USS 是针对某个进程开始有可疑内存泄露的情况,进行检测的最佳数字


    ====================================================================================================

    代码获取内存数据:

    java调用Adb shell dumpsys meminfo再用字符串截取方式获取内存,可对其数据进行返回打印,实现监控。

    传入参数为:应用包名,这个不可变。

    package com.hss.performanceTest;
    /**
     * from hss
     * data:2017/9/8
     * project:getMemory
     */
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
     
    public class getMemory {
     
        public static String GetMemory(String packageName) throws IOException, InterruptedException {
     
            String str3=null;
              Runtime runtime = Runtime.getRuntime();
              Process proc = runtime.exec("adb shell dumpsys meminfo "+packageName);
              try {
     
                  if (proc.waitFor() != 0) {
                      System.err.println("exit value = " + proc.exitValue());
                  }
                  BufferedReader in = new BufferedReader(new InputStreamReader(
                          proc.getInputStream()));
                  StringBuffer stringBuffer = new StringBuffer();
                  String line = null;
                  while ((line = in.readLine()) != null) {
                      stringBuffer.append(line+" ");
     
                  }
                  String str1=stringBuffer.toString();
                  String str2=str1.substring(str1.indexOf("Objects")-60,str1.indexOf("Objects"));     
                  str3=str2.substring(0,10);
                  str3.trim();
              } catch (InterruptedException e) {
                  System.err.println(e);
              }finally{
                  try {
                      proc.destroy();
                  } catch (Exception e2) {
                  }
              }
            return str3 ;
        }
        public static void main(String args[]) {
            
            System.out.println("开始运行...");
            try {
                String resurt = getMemory.GetMemory("com.hundsun.stockwinner.sxzq");
                System.out.println("山西证券的内存:"+resurt);
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }             
        } 
        
    }

    运行截图:

    参考网址:https://blog.csdn.net/heshushun/article/details/77893817

  • 相关阅读:
    python2 与python3 区别的总结 持续更新中......
    基础数据类型初识(三)字典
    基础数据类型初识(二)列表,元组
    基本数据类型初识(一)数字,字符串
    python基础知识(理论)
    进程池 和 管道 , 进程之间的 信息共享
    并发编程
    进程 和 多进程
    计算机系统的发展史
    网络编程 黏包
  • 原文地址:https://www.cnblogs.com/xiaobaibailongma/p/13173727.html
Copyright © 2011-2022 走看看