【腾讯优测干货分享】如何降低App的待机内存(五)——优化dex相关内存及本章总结

本文来自于腾讯优测公众号(wxutest),未经作者同意,请勿转载,原文地址:http://mp.weixin.qq.com/s/01Abwe0p1h3WLh28Tzg_Dw

1.5案例:优化dex相关内存

在上一节我们提到,随着代码功能的增加,代码复杂度也在不断地变大,这时候我们往往会发现Dalvik Other和dex mmap这两部分消耗的内存也在不断的增加。在之前的例子里,我们知道这两部分的内存已经接近总内存的一半。在Dalvik Heap已经充分优化的情况下,我们有必要继续对这部分内存进行研究如何优化。

我们已经知道Dalvik Other存放的是类的数据结构及关系,而dex mmap是类函数的代码和常量。通常情况下,想要减少这部分的内存,需要从代码出发,精简无用代码,或者将功能插件化。但如果我们深入理解了系统,也能够找到一些其他的方法来降低这部分的内存消耗。

1.5.1 从class对象说起

在MAT的对象实例列表中,我们往往能很多Class条目,如图1-16所示:

图1-16 MAT中似乎不消耗内存的Class类

这些对象是各种类型的元数据。从MAT的信息看来,它们只是保存了各个类的静态成员,所以对于没有静态成员的类型,shallow heap的值为0,并不消耗内存。但实际上,这只是class消耗内存的冰山一角。我们从下面的例子开始:

这段代码是一个数学处理库提供的函数,代码十分简单,只是新建了两个对象,但将这段代码在一个空应用中执行后,我们能够观察到以下的内存增长:

  • Dalvik heap增长约1.8M
  • Dalvik other增长约60K
  • .dex mmap增长约300K

Dalvik Heap的增长是我们能预期的。通常来说,能够从代码的逻辑中分析出执行这段代码总共需要分配多少内存,也能够在MAT中看到new对象消耗的内存。当应用使用完new的对象后,就会将heap内存释放,但dalvik other和.dex mmap部分是不会释放的。接下来我们首先分析一下这两部分为什么消耗了这么多内存。

1.5.2 一个类的内存消耗

首先,如果我们在代码中要使用一个类,例如以下代码:

Foo f = new Foo();

虚拟机在执行到这步时会做什么呢?

第一步是loadClass操作,将类信息从dex文件加载进内存:

1)读取.dex mmap中class对应的数据。
2)分配native-heap和dalvik-heap内存创建class对象。
3)分配dalvik-LinearAlloc存

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值