精华内容
下载资源
问答
  • 2021-01-26 13:29:50

    1.查看内存adb shell dumpsys meminfo

    查看某apk的内存

    adb shell dumpsys meminfo 包名

    或者adb shell dumpsys meminfo pid

    比如:查看com.duowan.mobile

    adb shell dumpsys meminfo com.duowan.mobile

    另外还有一个命令adb shell procrank

    说到内存,不得不说下内存的各个参数:

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

    RSS - Resident Set Size实际使用物理内存(包含共享库占用的内存)是单个进程实际占用的内存大小,对于单个共享库,尽管无论多少个进程使用,实际该共享库只会被装入内存一次。

    PSS - Proportional Set Size实际使用的物理内存(比例分配共享库占用的内存)。

    USS - Unique Set Size进程独自占用的物理内存(不包含共享库占用的内存)USS是一个非常非常有用的数字,因为它揭示了运行一个特定进程的真实的内存增量大小。如果进程被终止,USS就是实际被返还给系统的内存大小。USS是针对某个进程开始有可疑内存泄露的情况,进行检测的最佳数字。怀疑某个程序有内存泄露可以查看这个值是否一直有增加。

    一般情况:VSS>= RSS >= PSS >= USS。

    我们经常说的内存占用一般指的是PSS实际使用的物理内存.

    2.查看cpuadb shell top -m 10 -s cpu   //按照cpu排序,显示前10个

    或者adb shell dumpsys cpuinfo

    3.查看电池电量adb shell dumpsys battery

    4.查看某apk的流量:

    首先先查出该apk的uid,ps一下找到应用的pid;

    然后拿到pid后,查看uid,直接查看/proc/$pid/status这个文件下,存储了uid;

    最后通过uid查看/proc/uid_stat/$uid/tcp_rcv 和/proc/uid_stat/$uid/tcp_snd,这两个文件一个是请求耗费的流量,一个是接受的数据流量。

    如果想算速率,可以这么计算:先拿这两个参数,然后间隔10s,再拿这两个参数,两次参数之差再除以10s,就是这10s的平均速率。

    更多相关内容
  • adb shell dumpsys activity | grep mFocusedActivity可以查看当前正在展示的activity的信息,后边那个grep好像是linux的,我就用了前半部分,展示了好多信息,不过稍微往上滑一点就能看到ACTIVITY MANAGER ...

    adb shell dumpsys activity | grep mFocusedActivity

    可以查看当前正在展示的activity的信息,后边那个grep好像是linux的,我就用了前半部分,展示了好多信息,不过稍微往上滑一点就能看到

    ACTIVITY MANAGER ACTIVITIES (dumpsys activity activities)

    Display #0 (activities from top to bottom):

    Stack #1:

    Task id #1504

    TaskRecord{58cb3ac #1504 A=com.magellangps.SmartGPS U=0 sz=2}

    Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10000000 cmp=com.xxx.SmartGPS/.StartupActivity }

    Hist #1: ActivityRecord{b5bc1bd u0 com.xxx.SmartGPS/.NavigationActivity t1504}

    Intent { flg=0x14000000 cmp=com.xxx.SmartGPS/.NavigationActivity }

    ProcessRecord{b8d5b25 18169:com.xxx.SmartGPS/u0a346}

    Hist #0: ActivityRecord{1039b10 u0 com.xxx.SmartGPS/.MainActivity t1504}

    Intent { flg=0x10000000 cmp=com.xxx.SmartGPS/.MainActivity (has extras) }

    ProcessRecord{b8d5b25 18169:com.xxx.SmartGPS/u0a346}

    Running activities (most recent first):

    TaskRecord{58cb3ac #1504 A=com.xxx.SmartGPS U=0 sz=2}

    Run #1: ActivityRecord{b5bc1bd u0 com.xxx.SmartGPS/.NavigationActivity t1504}

    Run #0: ActivityRecord{1039b10 u0 com.xxx.SmartGPS/.MainActivity t1504}

    mResumedActivity: ActivityRecord{b5bc1bd u0 com.xxx.SmartGPS/.NavigationActivity t1504}

    adb在sdk的platform-tools目录下

    adb如果没有配置环境变量的话,自己切换cmd下的目录到对应的目录即可

    adb shell dumpsys meminfo com.magellangps.SmartGPS

    adb shell dumpsys meminfo com.charlie.demo0108

    通过adb shell dumpsys meminfo 来查看内存使用状况

    在没有打开应用的情况下,该命令返回的数据是这样的:

    ad05dcc9d2e0

    dumpsys未打开应用

    打开这个应用的MainActivity,再通过命令查看:

    ad05dcc9d2e0

    image.png

    内存泄露的一个例子

    如下代码:

    import java.util.ArrayList;

    public class ManagerTest {

    public static ManagerTest managerTest;

    public static ManagerTest getInstance() {

    if(managerTest==null) {

    managerTest=new ManagerTest();

    }

    return managerTest;

    }

    ArrayList listeners=new ArrayList();

    public void registerListener(TestListener listener) {

    listeners.add(listener);

    }

    public interface TestListener{

    abstract void nothing();

    }

    }

    然后在activity使用了如下的代码,就内存泄露了,这个activity就一直存在了。

    //内存泄露测试

    ManagerTest.getInstance().registerListener(new TestListener() {

    @Override

    public void nothing() {

    }

    });

    解决办法就是在页面销毁的时候取消注册这个listener。所以这个listener得写到外边弄个变量保存。

    另外一种如果不好取消注册的,可以如下图,把这个注册的listener置为空也可以好像不行

    TestListener listener=new TestListener() {

    @Override

    public void nothing() {

    }

    };

    @Override

    protected void onDestroy() {

    listener=null;

    super.onDestroy();

    }

    总结一下,上边的也就是匿名内部类了吧,那个TestListener()接口,这玩意基本都会引起内存泄露的

    获取连接到的设备信息

    adb devices

    C:\Users\xxx>adb shell "pm list packages" find samsung

    package:com.samsung.android.app.galaxyfinder

    打印设备/模拟器上的所有软件包

    adb shell "pm list packages"

    过滤名字

    C:\Users\charlie.song>adb shell "pm list packages" -e samsung

    package:com.sec.android.widgetapp.samsungapps

    package:com.samsung.android.app.galaxyfinder

    package:com.samsung.clipboardsaveservice

    package:com.samsung.android.provider.shootingmodeprovider

    eclipse 内存分析工具

    切换到DDMS页面,左上角如图,点击按钮,会提示保存,当前的内存信息到一个文件[没有插件是这样的]

    你得从设备下边点击一下你要分析的app的包名,然后上边按钮才是可用状态

    ad05dcc9d2e0

    image.png

    我是弄的插件,点击完按钮会直接弹出下边的框框,finish即可

    ad05dcc9d2e0

    image.png

    完事就会弹出一个下边的页面,选择histogram,顶部的菜单或者下边那个都行

    然后你会看到几十条,最后一行会告诉你有比如4000条这里就显示了30条。所以过滤条件就很有必要了。

    输入你怀疑内存泄露的类的名字,回车过滤,下图为过滤的结果

    ad05dcc9d2e0

    image.png

    然后如下图,找到关联的

    ad05dcc9d2e0

    image.png

    然后发现太多了,继续过滤掉,选最后一个,

    ad05dcc9d2e0

    image.png

    然后就会少 很多拉,我这里过滤完就剩下一个context被引用了,会提示你哪个类的

    ad05dcc9d2e0

    image.png

    然后找到这个类里的context,看是哪里传进来的,自然就知道是哪里的问题,然后就想办法是放掉呗。

    context被一个静态变量给持有了

    有个wifi的页面,最后查出来是这样的,刚开始完全不知道哪里有问题

    ad05dcc9d2e0

    image.png

    搜了下wifimanager的类

    private static AsyncChannel sAsyncChannel;

    //init方法里初始化的,可以看到

    sAsyncChannel = new AsyncChannel();

    sConnected = new CountDownLatch(1);

    sHandlerThread.start();

    Handler handler = new ServiceHandler(sHandlerThread.getLooper());

    sAsyncChannel.connect(mContext, handler, messenger);

    //进入到connect方法,其实可以吵到context被保存在了AsyncChannel类里了

    /** Context for source */

    private Context mSrcContext;

    //一个静态变量持有了这个context,所以这个context的页面也就内存泄露拉

    所以最后修改的地方就是获取wifimanager的时候,用application的上下文

    protected WifiManager getWifiManager()

    {

    return (WifiManager) MainApplication.getAppContext().getSystemService(Context.WIFI_SERVICE);

    }

    kotlin的写法

    最近看了个帖子,kotlin的写法

    在一个activity里调用下边的方法,然后关闭页面,然后发现没有内存泄露一说

    private fun testR(){

    thread {

    Thread.sleep(15000)

    }

    }

    另一种,引用了activity里的一个变量,结果就不一样,会内存泄露的。

    var aa=1

    private fun testR(){

    thread {

    aa=2

    Thread.sleep(15000)

    }

    }

    展开全文
  • adb查看内存占用

    千次阅读 2018-04-25 11:13:14
    1. 在IDE中查看Log信息当程序运行垃圾回收的时候,会打印一条Log信息,其格式如下:D/dalvikvm: <GC_Reason> <Amount_freed>, <Heap_stats>, <External_memory_...
    1. 在IDE中查看Log信息
    当程序运行垃圾回收的时候,会打印一条Log信息,其格式如下:
    D/dalvikvm: <GC_Reason> <Amount_freed>, <Heap_stats>, <External_memory_stats>, <Pause_time>

    GC_Reason表示导致垃圾回收的原因以及当前的回收类型,包括以下几类:
        GC_CONCURRENT:当堆中对象数量达到一定是触发的垃圾收集
        GC_FOR_MALLOC:在内存已满的情况下分配内存,此时系统会暂停程序并回收内存
        GC_HPROF_DUMP_HEAP:创建FPFOR文件来分析Heap时所造成的垃圾收集
        GC_EXPLICIT: 程序调用了垃圾收集函数System.gc

        GC_EXTERNAL_ALLOC: 出现在API 10及以下,为外部分配内存(native memory or NIO buffer)所造成的垃圾回收,高版本全部分配在Dalvik Heap中。

    Amount_freed 表示此次回收的内存

    Heap_stats 表示空闲内存百分比和存活对象大小/堆的总大小

    External_memory_stats 表示API 10及以下的外部分配内存,已分配内存/导致垃圾回收的界限

    Pause_time 暂停时间,一个表示开始回收垃圾的时间,另一个表示回收结束的暂停时间

    D/dalvikvm( 9050): GC_CONCURRENT freed 2049K, 65% free 3571K/9991K, external 4703K/5261K, paused 2ms+2ms
    注意这条信息中的 “ 3571K/9991K” 值,这代表着程序使用的heap大小。


    2.使用DDMS
    Eclipse中的DDMS提供了一个观察内存使用情况的GUI,当我们不断点击Cause GC时,就会看到当前程序的Heap,使用比较方便,具体用法可以Google一下。


    3.使用adb dumpsys 命令
    adb是一个非常强大的工具,使用adb查看应用程序内存使用情况可按如下格式在命令行里查看内存使用情况:
    adb shell dumpsys meminfo <package_name>
    其中,package_name 也可以换成程序的pid,pid可以通过 adb shell top | grep app_name 来查找,下图是某个程序的内存使用情况:

    重点关注如下几个字段:
    (1) Native/Dalvik 的 Heap 信息
    具体在上面的第一行和第二行,它分别给出的是JNI层和Java层的内存分配情况,如果发现这个值一直增长,则代表程序可能出现了内存泄漏。

    (2) Total 的 PSS 信息
    这个值就是你的应用真正占据的内存大小,通过这个信息,你可以轻松判别手机中哪些程序占内存比较大了。


    4. 使用adb shell procrank
    手机中的sh是经过精简过的,有些手机可能没有 procrank 命令,可以使用genymotion模拟器,或是自己安装procrank命令。使用procrank时,命令行的输出入下图:

    可以看到,在linux下表示内存的耗用情况有四种不同的表现形式:
     VSS - Virtual Set Size 虚拟耗用内存(包含共享库占用的内存)
     RSS - Resident Set Size 实际使用物理内存(包含共享库占用的内存)
     PSS - Proportional Set Size 实际使用的物理内存(比例分配共享库占用的内存)
     USS - Unique Set Size 进程独自占用的物理内存(不包含共享库占用的内存)


    VSS:VSS表示一个进程可访问的全部内存地址空间的大小。这个大小包括了进程已经申请但尚未使用的内存空间。在实际中很少用这种方式来表示进程占用内存的情况,用它来表示单个进程的内存使用情况是不准确的。
    RSS:表示一个进程在RAM中实际使用的空间地址大小,包括了全部共享库占用的内存,这种表示进程占用内存的情况也是不准确的。
    PSS:表示一个进程在RAM中实际使用的空间地址大小,它按比例包含了共享库占用的内存。假如有3个进程使用同一个共享库,那么每个进程的PSS就包括了1/3大小的共享库内存。这种方式表示进程的内存使用情况较准确,但当只有一个进程使用共享库时,其情况和RSS一模一样。
    USS:表示一个进程本身占用的内存空间大小,不包含其它任何成分,这是表示进程内存大小的最好方式!
    可以看到:VSS>=RSS>=PSS>=USS


    5.其它常用命令命令:
    adb shell kill PIDNumber  死你想杀死的后台进程来模拟某种 bug 的复现条件。
    adb shell ps  查看当前终端中的进程信息

    那么如何在代码中判断当前的硬件系统有多少的 RAM 呢?在 Framework  ProcessList.java 中有如下代码可用:
    ProcessList() {  
       MemInfoReader minfo = new MemInfoReader();  
       minfo.readMemInfo();  
       mTotalMemMb = minfo.getTotalSize()/(1024*1024);  
    }  

    查看进程占用cpu的情况:adb shell top -n 1 -d 0.5 | grep proc_ id



    或者

    展开全文
  • 1. procrank //查看所有进程的内存占比,可以查看TOTAL 2. procrank | grep 包名 //查看特定进程内存占比 结果如下: procrank  PID Vss Rss Pss Uss cmdline  2260 1462560K 24324K 21570K 20932K ...
  • android adb查看手机内存使用情况

    千次阅读 2020-08-05 17:25:51
    1.查看设备节点内存adb shell df 2.查看磁盘内存和运行内存adb shell free 3.查看内存详细数据adb shell cat /proc/meminfo

    1.查看设备节点内存adb shell df

    2.查看磁盘内存和运行内存:adb shell free

    3.查看内存详细数据adb shell cat /proc/meminfo

    MemTotal: 所有可用RAM大小(即物理内存减去一些预留位和内核的二进制代码大小)
     
    MemFree: LowFree与HighFree的总和,被系统留着未使用的内存
     
    Buffers: 用来给文件做缓冲大小
     
    Cached: 被高速缓冲存储器(cache memory)用的内存的大小(等于 diskcache minus SwapCache ).
     
    SwapCached:被高速缓冲存储器(cache memory)用的交换空间的大小,已经被交换出来的内存,但仍然被存放在swapfile                    中。用来在需要的时候很快的被替换而不需要再次打开I/O端口。
     
    Active: 在活跃使用中的缓冲或高速缓冲存储器页面文件的大小,除非非常必要否则不会被移作他用.
     
    Inactive: 在不经常使用中的缓冲或高速缓冲存储器页面文件的大小,可能被用于其他途径.
     
    HighTotal:
     
    HighFree: 该区域不是直接映射到内核空间。内核必须使用不同的手法使用该段内存。
     
    LowTotal:
     
    LowFree: 低位可以达到高位内存一样的作用,而且它还能够被内核用来记录一些自己的数据结构。Among many
     
         other things, it is where everything from the Slab is allocated. Bad things happen when you’re out      of lowmem.
     
    SwapTotal: 交换空间的总大小
     
    SwapFree: 未被使用交换空间的大小
     
    Dirty: 等待被写回到磁盘的内存大小。
     
    Writeback: 正在被写回到磁盘的内存大小。
     
    AnonPages:未映射页的内存大小
     
    Mapped: 设备和文件等映射的大小。
     
    Slab: 内核数据结构缓存的大小,可以减少申请和释放内存带来的消耗。
     
    SReclaimable:可收回Slab的大小
     
    SUnreclaim:不可收回Slab的大小(SUnreclaim+SReclaimable=Slab)
     
    PageTables:管理内存分页页面的索引表的大小。
     
    NFS_Unstable:不稳定页表的大小
     
    VmallocTotal: 可以vmalloc虚拟内存大小
     
    VmallocUsed: 已经被使用的虚拟内存大小。
     
    VmallocChunk: largest contigious block of vmalloc area which is free

     

    展开全文
  • meminfo: basic memory status-adb shell cat proc/meminfo -- 内存系统信息-adb shell cat proc/pid/maps -- 指定进程内存地址映射-adb shell cat proc/pid/smaps -- 指定进程内存详细使用信息 procrank info: all...
  • -adb shell cat proc/meminfo – 内存系统信息 -adb shell cat proc/pid/maps – 指定进程内存地址映射 -adb shell cat proc/pid/smaps – 指定进程内存详细使用信息 ?procrank info: all process memory status -...
  • Android adb查看CPU和内存使用

    千次阅读 2021-12-03 15:46:29
    查看CPU使用率 adb shell top //显示当前系统下,按使用率排名的内存和Cpu使用率 显示参数的含义 参数含义: PID : progress identification,应用程序ID S : 进程的状态,其中S表示休眠,R表示正在运行,Z表示...
  • android使用adb查看应用内存大小

    千次阅读 2021-04-29 15:10:09
    一个月不发布新文章了,因为手里有点事情耽误了写作,侧面也可以反应我很懒,特别特别懒那种,现在跟大家分享一个技巧,可以查看手机应用的内存占比。 命令: adb shell dumpsys meminfo -a 包名(比如...
  • adb命令查看设备内存

    万次阅读 2020-03-20 17:50:53
    adb shellprocrank , 看ram 大概905M 也就是1G内存 VSS - Virtual Set Size 虚拟耗用内存(包含共享库占用的内存) RSS - Resident Set Size 实际使用物理内存(包含共享库占用的内存) PSS - Proportional Set ...
  • = USSVSS - Virtual Set Size 虚拟耗用内存(包含共享库占用的内存)是单个进程全部可访问的地址空间RSS - Resident Set Size 实际使用物理内存(包含共享库占用的内存)是单个进程实际占用的内存大小,对于单个共享库,...
  • adb命令查看Android中内存使用情况

    千次阅读 2017-11-14 11:21:33
    1、使用adb dumpsys命令adb是一个非常强大的工具,使用adb查看程序内存使用情况可按如下格式在命令行里查看内存使用情况: adb shell dumpsys meminfo <package_name> 其中package_name可以换成程序的pid,pid可以...
  • adb使用查看应用内存使用情况

    千次阅读 2018-11-13 10:45:29
    网址:...配置adb:  创建环境变量Android(C:\Users\MAQINJUAN\AppData\Local\Android\sdk\platform-tools;)  把Android写入Path环境变量中 申请最大内存使用: AndroidManifest.xml文件中appl...
  • 使用adb命令查看手机cpu/内存等信息

    万次阅读 2020-07-07 11:14:53
    使用adb命令查看手机cpu/内存等信息 前提 本地电脑Windows已安装ADB工具、夜神模拟器 连接手机 这里用的夜神模拟器连接的 使用adb命令连接手机:adb connect 127.0.0.1:62001 显示已连接成功了 进入Android底层...
  • adb脚本,android批处理,用于批量处理android相关操作,用于批量自动化处理。用于批量测试,用于批量群控基础
  • 2022-03-04 Android adb查看DDR 容量大小

    千次阅读 2022-03-04 17:15:35
    一、方法一:adb shell procrank 二、方法二:adb shell cat /proc/meminfo 三、上面是机子DDR是4G的容量 四、参考文章 查看Android内存的8中方法 - lipeil - 博客园
  • 1. 打开DOS窗口,进入adb.exe所在的文件目录 1) 打开DOS窗口输入:win + r 2) 进入adb所在文件目录:cdC:\Program Files (x86)\Baofeng\PhoneAssistant(之前装adb没装好,这里用的暴风简助手的adb) ...3. 查看...
  • Android 获取手机总内存和可用内存信息,博客附adb方式 https://blog.csdn.net/qq_31939617/article/details/80272759
  • 1.通过adb shell dumpsys meminfo packageName来查看内存使用状况在没有打开应用的情况下,该命令返回的数据是这样的:2.打开这个应用的MainActivity,再通过命令查看:可以看到打印出来很多的信息,而对于我们查看...
  • adb命令--之查看内存占用大小

    千次阅读 2015-07-13 17:05:00
    adb 命令查看内存使用情况
  • 前言先让我们看一下这条代码的效果: watch -n 1 -d adb shell...adb shell dumpsys meminfo com.libin.factory这个命令相信大家都不陌生,就是查看内存信息,那这会你应该明白我们的效果通过什么来实现的了吧,那就是w
  • 如何在adb查看Android手机运行内存RAM 是1G还是2G呢?谢谢
  • The adb command provides a way to gain useful information about a number of thesystems configuration areas.To determine the physical memory (RAM) :for HP-UX 10xexample:echo physmem/D | adb /stand/vmu....
  • Android adb指令查看CPU和内存使用率

    万次阅读 2018-05-28 18:33:44
    查看CPU使用率 adb shell top -m 5 -s cpu -m:显示的数量 -s:行排序 显示的参数的含义 参数含义: PID : progress identification,应用程序ID S : 进程的状态,其中S表示休眠,R表示正在运行,Z表示僵死...
  • adb查找内存泄漏

    2021-10-27 16:32:07
    adb查找内存泄露
  • adb shell toptop命令提供了实时的对系统处理器的...内存使用和执行时间对任务进行排序.top 用法>adb shell top -hUsage: top [ -m max_procs ] [ -n iterations ] [ -d delay ] [ -s sort_column ] [-t ] [ -h...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 33,931
精华内容 13,572
关键字:

adb查看内存