因调试某个重大问题,怀疑到了内存,专门写了个測试脚本。记录一下。

撰写不易,转载请注明出处:http://blog.csdn.net/jscese/article/details/37928823

一.调试准备

首先须要开启android系统的adb功能。start adbd

PC端 adb connect IP ADDRESS

假设 出现adb 异常能够尝试 adb kill-serveradb start-server

二.adb shell指令

1.查看总体内存

连上adb之后 能够通过 adb shell procrank 来查看当前的内存情况!

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvanNjZXNl/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

  • VSS - Virtual Set Size 虚拟耗用内存(包括共享库占用的内存)
  • RSS - Resident Set Size 实际使用物理内存(包括共享库占用的内存)
  • PSS - Proportional Set Size 实际使用的物理内存(比例分配共享库占用的内存)
  • USS - Unique Set Size 进程独自占用的物理内存(不包括共享库占用的内存)

2.查看指定进程的内存情况

adb shell dumpsys meminfo (包名或者PID)

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvanNjZXNl/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">





3.占用内存最多的进程或线程

adb shell top

显示当前占用最高内存的10个进程,adb shell top -m 10

查看线程:adb shell top -t -m 10

三.shell 脚本

用于实时监控内存使用情况。而且保存log,我的shell script:

    #!/bin/bash
echo "Begain test memory">memeory_recode.txt
i=0
while true; do adb shell procrank |grep 'RAM:'| tee -a memeory_record.txt memoryinfo=$(tail memeory_record.txt -n 1)
#freememory=$memoryinfo | cut -d ' '-f 4 freememory=`echo "$memoryinfo"|awk -F ' ' '{print $4}'` free=${freememory%? } if [ $free -lt 8000 ];then
echo -e "\033[31mFree Memory is $free KB Less than 8M\033[0m"| tee -a memeory_recode.txt
adb shell top -m 10 -n 1 | tee -a memeory_recode.txt
else
echo "freememory == $free KB"
fi i=$(($i+1)) sleep 1 var=$(date)
echo "jscese display memory at $var the $i times"
echo
done

保存RAM信息的情况到 memeory_record.txt。而且解析freememory 的值,假设少于8000K就把占用内存最高的10个进程信息也保存进record。

四.build.prop中的Dalvik设置

dalvik.vm.heapstartsize=8m
dalvik.vm.heapgrowthlimit=96m
dalvik.vm.heapsize=256m
dalvik.vm.heaptargetutilization=0.75
dalvik.vm.heapminfree=512k
dalvik.vm.heapmaxfree=8m
dalvik.vm.lockprof.threshold=500
dalvik.vm.dexopt-flags=m=y

这几个属性代表了对dalvik的一些属性设置,能够在/dalvik/vm/alloc/HeapSource.cpp下找到原型:

struct HeapSource {
/* Target ideal heap utilization ratio; range 1..HEAP_UTILIZATION_MAX
*/
size_t targetUtilization; /* The starting heap size.
*/
size_t startSize; /* The largest that the heap source as a whole is allowed to grow.
*/
size_t maximumSize; /*
* The largest size we permit the heap to grow. This value allows
* the user to limit the heap growth below the maximum size. This
* is a work around until we can dynamically set the maximum size.
* This value can range between the starting size and the maximum
* size but should never be set below the current footprint of the
* heap.
*/
size_t growthLimit; /* The desired max size of the heap source as a whole.
*/
size_t idealSize; /* The maximum number of bytes allowed to be allocated from the
* active heap before a GC is forced. This is used to "shrink" the
* heap in lieu of actual compaction.
*/
size_t softLimit; /* Minimum number of free bytes. Used with the target utilization when
* setting the softLimit. Never allows less bytes than this to be free
* when the heap size is below the maximum size or growth limit.
*/
size_t minFree; /* Maximum number of free bytes. Used with the target utilization when
* setting the softLimit. Never allows more bytes than this to be free
* when the heap size is below the maximum size or growth limit.
*/
size_t maxFree; ... }

大体相应的意思例如以下:

1.heapstartsize——堆初始分配的大小,一个app启动的时候分配的内存大小

2.heapgrowthlimit——分配的一个堆最大的增长值,一个app最多分配的内存大小,超出的话应该会报outofmemory

3.heapsize——整个堆所能达到的最大值。也就是应用程序所能用的内存总和

4.heaptargetutilization——代表堆的利用率,实际使用与最大利用对照

5.heapminfree——堆大小的限制因素,在堆的大小没超过限定值的情况下 最小的空暇值

6.heapmaxfree——和最小相反,堆中最多能空暇的大小

7.lockprof.threshold——调试记录程序内部锁资源争夺的阈值,默认值是500

8.dexopt-flags——程序代码的校验与优化,下面来自百科:

dalvik.vm.dexopt-flags:
本參数控制Dalvik虚拟机的程序代码校验和优化。可填写的值有m、v和o。 m为标准选项。能够是m=y或m=n。若m=y则启用不安全代码的校验和托管代码的优化。兼容性和安全性最高,推荐使用。 v为校验选项,可与o并存。能够是v=a或v=n。若v=a则表示校验全部代码,v=n则关闭代码的校验。

 o为优化选项,可与v并存。能够是o=v或o=a。若o=v则表示优化以校验过的代码,o=a则表示优化全部代码。 比如: dalvik.vm.dexopt-flags=m=y dalvik.vm.dexopt-flags=v=n,o=v

注意,这个參数仅仅会影响到安装APK之后或初次使用APK时生成dex文件时有效。若整个系统(包含应用程序)为odex化,则无意义。

Android——内存调试的更多相关文章

  1. Android内存调试命令

    adb shell dumpsys meminfo 包名 比如: adb shell dumpsys meminfo cn.com.test

  2. Android内存泄露调试

    Android 内存泄漏调试 一.概述 如果我们编写的代码当中有太多的对内存使用不当的地方,难免会使得我们的设备运行缓慢,甚至是死机.为了能够使得 Android 应用程序安全且快速的运行, Andr ...

  3. Android内存性能优化(内部资料总结)

    eoe上看到的一个很好的文章 摘抄了下来留着自己看看 刚入门的童鞋肯能都会有一个疑问,Java不是有虚拟机了么,内存会自动化管理,我们就不必要手动的释放资源了,反正系统会给我们完成.其实Java中没有 ...

  4. Android内存性能优化(内部资料总结) eoe转载

    刚入门的童鞋肯能都会有一个疑问,Java不是有虚拟机了么,内存会自动化管理,我们就不必要手动的释放资源了,反正系统会给我们完成.其实Java中没有指针的概念,但是指针的使用方式依然存在,一味的依赖系统 ...

  5. Android编程: 调试方法

    学习知识:Android的调试方法 ====调试方法==== 前提: IDE环境为Android Studio,熟悉LogCat,知道如何查看日志信息 工具: Android DDMS调试工具,一般点 ...

  6. android 内存优化以及性能优化相关问题

    最近做一个android 的应用程序 总是出现内存高 和cpu高的问题困扰了好多天. 下面为自己从网上总结的和自己找到的问题. 1. WebView  控件: 使用了 WebView 控件一定要注意清 ...

  7. 深入理解Android内存管理原理(六)

    一般来说,程序使用内存的方式遵循先向操作系统申请一块内存,使用内存,使用完毕之后释放内存归还给操作系统.然而在传统的C/C++等要求显式释放内存的编程语言中,记得在合适的时候释放内存是一个很有难度的工 ...

  8. Android 内存管理分析(四)

    尊重原创作者,转载请注明出处: http://blog.csdn.net/gemmem/article/details/8920039 最近在网上看了不少Android内存管理方面的博文,但是文章大多 ...

  9. Android内存性能优化(内部资料总结) 转

    刚入门的童鞋肯能都会有一个疑问,Java不是有虚拟机了么,内存会自动化管理,我们就不必要手动的释放资源了,反正系统会给我们完成.其实Java中没有指针的概念,但是指针的使用方式依然存在,一味的依赖系统 ...

随机推荐

  1. ceph操作相关命令整合

    ceph基本操作: /etc/init.d/ceph -a start/stop //即在所有节点上执行 单个操作: start/stop ceph-osd id={id} start/stop ce ...

  2. Codeforces Round #316 (Div. 2B) 570B Simple Game 贪心

    题目:Click here #include <bits/stdc++.h> using namespace std; typedef long long ll; const int IN ...

  3. aspx.cs上传文件

    aspx.cs文件 using System; using System.Collections.Generic; using System.Linq; using System.Web; using ...

  4. PHP面向对象基础实例

    <?phpclass marine{ public $blood = 50; //剩余的血 public $kills = 0; //杀敌数量 static $all_num = 0;//兵的数 ...

  5. Ural 1313 - Some Words about Sport

    Ural doctors worry about the health of their youth very much. Special investigations showed that a l ...

  6. Chapter 2.策略模式

    首先贴一段代码: package xiao; import java.util.Scanner; class CashSuper{    private int num;    private dou ...

  7. Python字典处理技巧

    从字典中取值(不想由于搜索的键不存在而异常) 解决方法: 使用字典的get方法 (get方法只读取字典的值而不会去修改字典) d={'key':'value'} print d.get('key',' ...

  8. Debian为程序添加一个开始菜单,debian添加sublime开始菜单.

    下了一个 '绿色' 的程序,想要加到开始菜单里面. 怎么做呢? 我这里以sublime2做例 去http://www.sublimetext.com/2 下载了linux 64位, 解压放到了下面的文 ...

  9. java小练习--获取abc字符串在整个字符串中出现的次数

    在下面一行字符串中获取abc字符串在整个字符串中出现的次数. "wabcerabctyabcuiabcabcqq" 思路:使用indexOf和substring(); 源码如下: ...

  10. 【Linux驱动器】Linux-2.6.20.4内核移植

    最近一段时间以来一直学习TQ2440内核开发板移植.嫁接驱动器. 真诚地相信这方面的知识有很大的困难,.但有一种观点认为,从看,难度越大,的提升空间的能力更大! ! 1.解压源代码 从Internet ...