移动App性能测评与优化1.5.2 一个类的内存消耗
虚拟机在执行到这步时会做什么呢?
第一步是loadClass操作,将类信息从dex文件加载进内存:
1)读取.dex mmap中class对应的数据。
2)分配native-heap和dalvik-heap内存创建class对象。
3)分配dalvik-LinearAlloc存放class数据。
4)分配dalvik-aux-structure存放class数据。
第二步是new instance操作,创建对象实例:
1)执行.dex mmap中 clinit 和 init 的代码。
2)分配dalvik-heap创建class对象实例。
在这个过程中,可能还会分配dalvik-bitmap和jit-code-cache内存。如果class Foo引用了其他类型,那就还需要先按照同样的逻辑创建被引用的class。由此可见,在创建一个类实例的每一步都需要消耗内存。我们接下来大概计算一下new操作需要消耗的内存。
根据Dalvik虚拟机的代码,能够得知class根据类成员和函数的数目分配LinearAlloc和aux-structure的多少,以及class本身及函数需要的字节数。我们再根据一个应用中所有class的总量进行平均计算,得到以下一组数据。
第一步是loadClass操作,加载类信息:
.dex mmap(class def + class data): 载入一个类需要先读取259字节的mmap。
dalvik-LinearAlloc: 在LinearAlloc区域分配437字节,存放类静态数据。
dalvik-aux-structure: 在aux区域分配88字节,存放各种指针。
第二步是new instance操作,创建对象实例:
.dex mmap(code):为了执行类构造函数,还需要读取252字节的mmap。
dalvik-heap: 根据类的具体内容而变化。
可见在创建对象实例的操作中,Dalvik Other和.Dex Mmap部分就各需要约500字节的内存空间。但是考虑到4KB页面的问题,由于这些内存并不是连续分布的,所以可能需要分配多个4KB页面。当然由于很多类会在一起使用,使得实际的页面值不会那么多。
以我们举例的应用为例,总共有7042个类,启动后载入了1522个类,这时侯应用的.dex mmap内存消耗大约是5MB,平均后约为3.4KB。Dalvik Other的部分会少一些,但依然是远远超出需要使用的大小。
相关文章
- App.Config Transformation for projects which are not Web Projects in Visual Studio? app.debug.config
- Google Earth Engine APP(GEE)—设定中国区域的一个夜间灯光时序分析app
- uni-app - 在纯 JS 文件中调用自定义弹框组件 / 封装全局 API 调用弹框组件(解决小程序、APP 无法使用 document.body.appendChild 插入组件节点)适配全端
- uni-app - 文字上下循环滚动翻滚,类似中奖名单与公告栏信息公示等等,自定义组件封装,支持 DIY(适用于新闻动态、公告上下滚动列表、上下循环滚动,无限上下自动滚动列表)兼容小程序/H5/App
- uni-app - 文本展开 / 收起折叠功能,支持自定义样式(当文本内容超出规定行数后,展开收起折叠的功能)兼容 H5 / App / 小程序且易用更容易修改的插件组件源码,超详细的示例代码及注释
- uni-app - 面包屑导航组件,支持自定义分隔符,点击可跳转对应页面(全端兼容 H5 APP 小程序,组件代码干净整洁无BUG)
- uni-app - APP平台禁止页面滑动(无法上下滚动屏幕页面)
- uni-app - 使用 npm 安装第三方包
- 移动App性能测评与优化1.4 进阶:内存原理
- 移动App性能测评与优化1.4.1 从物理内存到应用
- CSDN产品公告第2期:博客支持视频、专栏文章拖拽排序、APP霸王课来袭……
- 关于JS APP
- 《Axure RP7网站和APP原型制作从入门到精通》一1.2 站点地图
- 《移动App测试的22条军规》—后记
- 《移动App测试的22条军规》——第23章,第12节测试微信App中高内存使用的功能
- iOS App开发成本高背后的解释
- Flutter SQLite 教程之笔记App 数据存储CRUD操作基于 Flutter Sqflite 插件
- uni-app基础笔记
- Flutter桌面开发 — Windows App打包以及使用Inno Setup生成.exe文件安装包
- app 的内存优化
- uni-app微信相关开发问题记录:微信分享报错"包名不对,请检查包名是否与开放平台填写一致"、Android微信支付只能调起一次的问题、App微信登录与公众号微信登录的unionid不一致
- 自制手机app的51蓝牙+WiFi+循迹+避障OLED显示速度小车
- 如何在HarmonyOS应用中集成App Linking服务
- App开放接口api安全性—Token签名sign的设计与实现
- APP内存占用测试
- The content of element type "web-app" must match "(icon?,display-name?,description?,distributable?,context-param*,filter*,filter-mapping*,listener*,servlet*,servlet- mapping*,session-config?,mime-map