问题

最近开发中遇到个问题,系统在休眠唤醒后的一段时间,经常会出现系统卡顿不流畅的情况。正好赶上前段时间对设备做过OTA升级,自然会想到是否是OTA升级给系统引入了新的问题。

看了一些设备在系统卡顿时间的log,多个设备此时后台都在执行dex2oat的过程。只是巧合吗?dex2oat会不会影响系统性能使系统变得卡顿?带着这个问题简单了解一下dex2oat。

dex2oat简介

android应用使用java语言写的,java跑在java虚拟机上。java虚拟机的作用是屏蔽底层系统与芯片的差异,使得上层只专注于app的开发,不用关注底层的差异,适配转换的工作都交给java虚拟机帮你做了。

android早期使用dalvik虚拟机,目前采用ART虚拟机。dex2oat工具是对dex文件进行转化,转化成虚拟机执行效率更高的格式。针对Dalvik虚拟机转化为odex文件,针对ART虚拟机转化为ELF文件。下图为

java语言在android的运行流程:

dex2oat在优化时,会根据需要优化一定量的method。也就是说并不是优化的method都会被翻译成oat模式。根据优化的method的量的多少,可以分为如下的几种模式:

Android 运行时 (ART) 包含一个具备代码分析功能的即时 (JIT) 编译器,该编译器可以在 Android 应用运行时持续提高其性能。N版本当中强化了JIT模式。JIT模式是Just in time 的简称。意思是在运行的时候,根据method有使用频率来决定是否要对某一个方法进行优化。虚拟机会统计每一个方法被执行的次数。如果某一个方法执行的次数比较多,达到一定的阈值,就会将升级为hot method,并将其记录在一个profile当中。在系统空闲并且在充电的时候,只将这些方法进行优化。在运行的时候,也会对这些方法进行优化,以方便在运行的时候使用。

备注: 以上内容主要来自 https://blog.csdn.net/long375577908/article/details/78190422

dex2oat命令行

开启 JIT 详细日志记录

adb root adb shell stop adb shell setprop dalvik.vm.extra-opts -verbose:jit adb shell start

停用 JIT

adb root adb shell stop adb shell setprop dalvik.vm.usejit false adb shell start

基于配置文件强制编译特定软件包

adb shell cmd package compile -m speed-profile -f my-package

全面强制编译特定软件包

adb shell cmd package compile -m speed -f my-package

基于配置文件强制编译所有软件包

adb shell cmd package compile -m speed-profile -f -a

全面强制编译所有软件包

adb shell cmd package compile -m speed -f -a

备注:以上内容主要来自 https://blog.csdn.net/zhangbijun1230/article/details/80590208

dex2oat占用资源测试

手动发命令触发dex2oat,通过top命令发现dex2oat进程占用将近300%的cpu(cpu一共4个核,总资源400%)

从log中也能看到,dex2oat开启了4个线程,在4个核上都在跑

看到这里感觉得找到了真凶,dex2oat占用cpu资源太多,导致cpu资源紧张,系统卡顿。

但是还有一个重要的信息被遗漏了,从top命令的截图中看到,dex2oat进程的nice值为10,优先级很低。cpu空闲的时候,优先级高低影响不大,都能分到足够的cpu资源。一旦cpu紧张的时候,优先级低的进程cpu使用时间就会被大量抢占,把cpu让给优先级更高的进程。android上用户能感知的进程的优先级都比较高,nice值远低于10(nice值越大优先级越低),所以一个nice值为10的进程,cpu抢占能力很低,不是造成系统卡顿的主因。实测结果也是这样的,在系统繁忙的时候dex2oat进程cpu占用就被抢占很严重,降到10%以下了。

另外补充一些信息:

1. dex2oat会判断cpu的核数,几个核就创建几个线程,并发执行,这就是为什么系统空闲时cpu占用如此高的原因。

2. OTA升级系统重启后,dex2oat不是一下全部执行完,有一些策略,分批执行,比如cpu闲时执行等。

结论

dex2oat进程优先级低,不是造成系统卡顿的主因。

最终经过分析导致系统卡顿的真因是cpu被降频了,高通平台有个限制温度低于5摄氏度cpu被降频,高于10摄氏度解除降频。猜测可能是为了考虑低温保护电池所做的措施。

编译选项配置

通过在模块的makefile文件设定 LOCAL_DEX_PREOPT 选项为ture or false,来指定应用启用或停用预先优化功能。

启用预先优化功能,即在模块编译的时候就进行dex2oat的优化,生成apk的同时生成优化后的oat文件。增加了systemimage的大小,但节省了在系统在运行时进行dex2oat的资源开销,以空间换时间。

dex2oat过程对系统性能的影响相关推荐

  1. 硬件环境对系统性能的影响

    前言 在本章之前的所有部分都是介绍的整个系统中的软件环境对系统性能的影响,这一节我们将从系统硬件环境来分析对数据库系统的影响,并从数据库服务器主机的角度来做一些针对性的优化建议. 任何一个系统的硬件环 ...

  2. I O对计算机系统性能的影响,DASD操作对计算机系统性能的影响

    DASD操作对计算机系统性能的影响 在对其过程模型化的基础上,本文分析了DASD I/O操作对计算机系统性能产生的影响及其形 (本文共8页) 阅读全文>> BIOS设置对系统性能的影响非常 ...

  3. 经颅电刺激对生理和病理衰老过程中情景记忆的影响

    与个人相关的以往事件的记忆(情景记忆)对日常生活至关重要.这种陈述性长时记忆的衰退是健康老龄化的一个共同特征,轻度认知障碍(mild cognitive impairment, MCI)和阿尔茨海默病 ...

  4. 百趣代谢组学文献解读-膜脂代谢对桃果实冷藏过程中冷害的影响

    文章标题:Membrane lipid metabolism influences chilling injury during cold storageof peach fruit 发表期刊:Foo ...

  5. 团体过程:社会团体的影响

    团队的规则主要是划分团队的内外,团队本身有各种特征和特点.有效利用团队的特征和特点是重点. 团队 社会懈怠和去个体化 团队决策 团队中的领导 冲突和合作 1.团队 团队包含三个或三个以上彼此互动.彼此 ...

  6. 百趣代谢组学分享,膜脂代谢对桃果实冷藏过程中冷害的影响

    文章标题:Membrane lipid metabolism influences chilling injury during cold storageof peach fruit 发表期刊:Foo ...

  7. 串联滞后校正对系统的影响_什么是相位超前校正、滞后校正、滞后超前校正,对系统性能的影响...

    展开全部 超前校正的目的是改善系统的动态性能,实现在系统静态性能不受损的前提下,提高系统的动态性能.通32313133353236313431303231363533e4b893e5b19e31333 ...

  8. CSI笔记【5】:Widar2.0: Passive Human Tracking with a Single Wi-Fi Link论文阅读

    CSI笔记[5]:Widar2.0: Passive Human Tracking with a Single Wi-Fi Link论文笔记 前言 Abstract 1 INTRODUCTION 2 ...

  9. Perf -- Linux下的系统性能调优工具,第 2 部分

    https://www.ibm.com/developerworks/cn/linux/l-cn-perf2/ Perf -- Linux下的系统性能调优工具,第 2 部分 刘 明, 软件工程师, 上 ...

  10. PID原理的详细分析及调节过程

    本文系转载汇总,仅供学习参考实用,转载链接见结尾 正文开始:这篇文章分为三个部分: PID原理普及 常用四轴的两种PID算法讲解(单环PID.串级PID) 如何做到垂直起飞.四轴飞行时为何会飘.如何做 ...

最新文章

  1. css初始化样式文件_前端必备技能 webpack 4. webpack处理CSS资源
  2. 网易有道的产品总监王焱:如何利用数据分析推动产品设计
  3. stm32驱动ssd1306配置_STM32 OLED 屏幕 驱动芯片SSD1306 IIC代码
  4. Android 数据解析——Gson与json
  5. yum php 降级 5.3,CentOS 5.3 通过yum升级php的方法
  6. Runtime error 216 at xxx 故障解决一例
  7. Javascript综合应用小案例
  8. 插画与UI组合素材APP模板|一切简单而美好
  9. 如何用python做一个时钟_Python使用turtle库制作一个时钟
  10. 多处理器系统下的伪共享(false sharing)问题
  11. 数据结构与算法(java)
  12. 智能电话机器人源码安装 部署好后,人工智能电话机器人,不仅仅是打电话而已!
  13. Android 宽高比控件
  14. POI 设置Word表格边框、表格文字水平居中
  15. 《基于 DirectX11 的 3D 图形程序设计案例教程》学习一 HelloWorld
  16. python基础语法学习一
  17. 广西事业单位职称免计算机,2020广西事业单位职业能力倾向测试知识:为什么没有计算器?...
  18. java 调用odi_[转]ODI定时任务
  19. html怎么引用网页链接,网页中各种链接引用方法小结
  20. AS3中常用到的公式 {转}

热门文章

  1. 日本“性爱机器人”上线1小时被抢空
  2. 【JS学习笔记】2.JavaScript变量
  3. 厦大计算机学硕考研难度,一个班半数考研 厦大录取仅两成 读研是鸡肋还是围城...
  4. 用c语言编写计算器计划报告书,用c语言编写计算器计划报告书.docx
  5. SFDC中的DEBUG
  6. MATLAB app designer 如何设置背景图片
  7. 【每日新闻】​阿里钉钉布局医疗行业生态,未来医院成医疗行业“香饽饽” | 工信部信软司:持续推进云计算和区块链等领域标准研制工作...
  8. C#对.CSV格式的文件--逗号分隔值文件 的读写操作及上传ftp服务器操作方法总结
  9. 计算机硬件的维护知识,计算机硬件维护的知识
  10. 文件下载中使用inputStream流获取文件大小