出自:http://www.cnblogs.com/zdwillie/p/3287150.html

最后一部分是关于native heap,.dex,/dev/other的优化。​

Native Heap分析和优化

android的DDMS可以帮助查看c++ native heap的使用,但需要一定的配置,而且必须是root的手机。

在~/.android/ddms.cfg增加"native=true"。这样子ddms才会有native

heap的tab。

指向下面adb命令打开malloc的debug模式adb rootadb shell setprop

libc.debug.malloc 1adb shell stopadb shell start

打开standalone的DDMS(不是eclipse中那个,是独立的应用程序,sdk目录下有),然后在native

heap这个tab下,可以查看native heap的分配情况。

在很多手机上,即使执行了这些命令,还是看不到结果。原因是很多手机上并没有安装debug版本的malloc库(包括libc_malloc_debug_leak.so 和 libc_malloc_debug_qemu.so)。这篇经常被引用的文章

介绍了一种方法。是从供大家刷机用的CyanogenMod image中提取这两个文件,然后拷贝到自己的机器上。可以参考那片文章的具体步骤。

下面的问题是只能看到地址而不知道文件名和行号。至少有下面一些办法

使用ndk中的arm-linux-androideabi-gdb(android

ndk的gdb)来打开.so文件。这里的.so不能使apk中使用的,因为那个已经把symbol给strip了。而应该使用***\obj\local\armeabi\***.so,这个是带着symbol的。然后可以在gdb中使用info

symbol 0x000xxxxx来定位到地址对应的函数名。这里的0x000xxxxx是ddms中地址把前三位变成0。因为gdb

.so中使用.so的静态地址,而ddms中的地址经过动态链接,是内存的虚拟地址。但动态链接并不改变地址的后五位,所以这里后五位保持不变,前三位变成0,从而转换为so的静态地址。然后用info

line

xxx.cpp:xxx来定位具体行。这个方法比较繁琐,因为当时自己没找到好办法,就这么用的。

用ndk的arm-linux-androideabi-addr2line。后面跟so和0x000xxxxx。跟gdb差不多,会简单一些。

有人说设置PATH加上包含addr2line的目录,然后再设置ANDROID_PRODUCT_OUT可以在ddms中直接显示函数名和行号,但没有试过。

/other/dev分析和优化

自己用的是4.2版本的android。每次打开preference

setting,/other/dev的private dirty都会增加很多(10M作用),并且不会释放。

通过查看smaps,发现是/dev/pvrsrvkm导致的(4.3后设备名改为kgsl-3d0)。这个是显示相关的设备,按我的理解,大概是显存(如果没有独立显存,那是用于显示的内存)。通过网上查询,并不是只有我遇到这个问题。例如chrome也有这个问题。但还是不知道为何这个会增加。在一通乱试后,发现如果对activity设置android:hardwareAccelerated=false,就能解决。此时只增加shared

dirty,并且关掉activity,内存会被释放。后来再查,看到stackoverflow上这篇文章,才知道这是4.2的一个bug。4.3和4.1都没有问题。

.Dex mmaps优化

这个是java代码编译只会的.dex文件的大小。

开始自己使用eclipse编译出来的apk作性能分析,发现这个也有几M。但release版本的却不到1M。转念一想,原来是proguard的作用。proguard是android自带的混淆器,会对java的类名,函数名,变量名等重新命名,给一个非常短的名字。有两个作用,一个是使得反编译的代码不容易理解,另一个就是减少了dex文件的大小。经过这次内存分析,才发现其效果还是非常明显的。

因为proguard无法对res下的layout,xml文件做混淆,所以他们引用到的java类(例如一些view类)的名字是不能被改变的。所以一个小经验是让xml文件尽量少的引用java类,从而提高混淆的比例。

总结

关于android内存优化,自己就先做了这些。整体思路就是从宏观到微观,利用各种工具和网络资料,从内存占用量最多的模块下手,一步步的分析原因,解决问题。再细化下去,还有很多代码级别的优化,例如perf

tips

里介绍了很多经验,memory efficient

java也很值得参考。有时间再在这个级别做更多的优化。

android 内存分析 名词解释,Android内存分析和调优(下)相关推荐

  1. android中service名词解释,Android中Service(服务)详解

    A service is "bound" when an application component binds to it by calling 通过startService() ...

  2. JVM内存模型、原理、垃圾回收、调优

    JVM内存模型.原理.垃圾回收.调优,这Java语言的基础,作为Java从业人员是必须要掌握的,另外这也是面试经常会问到的知识. ----------------------------------- ...

  3. 川大667真题数据分析 | 利用Python和SPASS分析名词解释

    文章目录 名词解释结论 相关图表参考 名词解释结论 利用Python和SPASS对2009年-2020年真题(其中2018年到2019年的数据来源为学姐学长回忆版本)进行真题数据分析.希望能够对各位的 ...

  4. linux打印jvm内存堆栈_5款强大的JVM 性能调优监控工具

    原文链接:www.iteye.com/blog/josh-persistence-2161848 现实企业级Java应用开发.维护中,有时候我们会碰到下面这些问题: OutOfMemoryError, ...

  5. rdd数据存内存 数据量_大数据开发-Spark调优常用手段

    Spark调优 spark调优常见手段,在生产中常常会遇到各种各样的问题,有事前原因,有事中原因,也有不规范原因,spark调优总结下来可以从下面几个点来调优. 1. 分配更多的资源 分配更多的资源: ...

  6. android 实例源码解释,Android Handler 原理分析及实例代码

    Android Handler 原理分析 Handler一个让无数android开发者头疼的东西,希望我今天这边文章能为您彻底根治这个问题 今天就为大家详细剖析下Handler的原理 Handler使 ...

  7. 计算机辅助精子分析名词解释,计算机辅助的精子分析技术(CASA)

    补充资料:铸造工艺计算机辅助设计技术 2.1 铸造工艺CAD 在铸造工艺设计过程中,有许多繁琐的数学计算和大量的查表选择等工作,仅凭工艺设计人员的个人经验和手工操作,不但要花费很多时间,而且设计结果往 ...

  8. android蓝牙协议名词解释 OPP HFP HDP A2DP PAN

    各种蓝牙协议的全称: OPP:对象存储规范(Object Push Profile),最为常见的,文件的传输都是使用此协议. HFP:(Hands-free Profile),让蓝牙设备能够控制电话, ...

  9. app分析 名词解释 app购买量

    http://help.apple.com/itc/appanalytics/#/itc7bea1545f

最新文章

  1. java kafka 分区_Kafka 主题和分区
  2. cp命令复制目录 不覆盖
  3. 利用pyhton爬虫(案例4)--你想要的图片都在这
  4. 上半年产品原型设计Axure rp稿(持续更新)
  5. ssd训练自己数据集
  6. 查询某个条件在一个区间内的数据
  7. macos支持exfat吗_在Windows上使用VMware Workstation虚拟机安装macOS
  8. iOS开发,轻松获取根控制器当前控制器的正确方式
  9. 【操作系统/OS笔记15】死锁的系统模型,死锁的处理办法,银行家算法与死锁检验算法
  10. HTML→标签、div语义化、表单、input标签
  11. 两个向量的夹角公式_两向量夹角(求两个向量的夹角公式)
  12. Tango学习笔记(1)
  13. 青鸟BCNT-网络信息安全工程师
  14. 运维简历怎么写项目描述_简历中的项目描述
  15. 破解网易云js加密,爬虫获取网易云评论
  16. 云服务器代理平台安装教程
  17. Python ❀ 插入排序
  18. java毕业生设计学生考勤管理系统计算机源码+系统+mysql+调试部署+lw
  19. MySQL 如何定时备份数据库
  20. 长安大学计算机科学与技术(交通信息工程)课程专业课,长安大学交通信息工程及控制硕士研究生专业简介...

热门文章

  1. 你只会用 StringBuilder?试试 StringJoiner,真香!
  2. docker安装nacos步骤
  3. JEECG支付服务窗专题 - 平台与服务窗接口对接
  4. UI标签库专题十二:JEECG智能开发平台 ckeditor(ckeditor插件标签)
  5. UI标签库专题八:JEECG智能开发平台 Menu(左侧菜单生成标签)
  6. SpringBoot2.0基础案例分类总结,后续更新计划说明
  7. Linux进程实践(5) --守护进程
  8. 操作系统已经向SQL Server 返回了错误21
  9. java实现rabbitMQ延时队列详解以及spring-rabbit整合教程
  10. 源码编译安装httpd服务