Android性能优化——内存优化

news2024/11/27 6:26:00

一、内存问题

  • 内存抖动,锯齿状,GC导致卡顿
  • 内存泄漏,可用内存减少,频繁GC 
  • 内存溢出,OOM,程序异常

二、内存分析工具

  • Memory Profiler
  • Memory Analyzer 
  • LeakCanary 

Memory Profiler

  • 实时图表展示应用内存使用量
  • 识别内存泄露、抖动等,(简单的识别)
  • 提供捕获堆转储、强制GC以及跟踪内存分配

        使用方法:Android studio下面的Profiler

左上角有个加号 选择想要跟踪的进程

右边有三种类型:CPU、MEMORY、ENERGY

点击MEMORY

        垃圾桶按钮:点击的话相当于一次GC
        第二个按钮:将内存信息转成一个文件,以文件的方式展示出来
        Record 按钮:记录点击之后在内存当中分配内存的情况  7.1及以下的版本的手机才有这个按钮
        减号和加号:放大缩小

总结:

  • 方便直观,对于整合内存情况来说,通过图表的方式来看到,同时可以知道分配内存的情况,也可以知道分配某一个对象具体的堆栈信息以及在哪里创建的
  • 线下平时使用,Android studio自带的工具在开发工程中使用

Memory Analyzer (MAT)

  • 强大的Java Heap分析工具,查找内存泄露及内存占用
  • 生成整体报告、分析问题等
  • 线下深入使用
  • 使用方式
    • https://www.eclipse.org/mat/downloads.php
    • 转换:hprof-conv 原文件路径 转换后文件路径

LeakCanary

  • 自动内存泄露检测
  • https://github.com/square/leakcanary
  • 线下集成

三、Java内存管理机制

http://t.csdn.cn/ZJUWo

四、Android内存管理机制

  • 内存弹性分配,分配值与最大值受具体设备影响
  • OOM场景:内存真正不足、可用内存不足(整个系统都没有内存导致我们的APP OOM)

Dalvik与Art区别

  • Dalvik仅固定一种回收算法,手机出厂之前、烧录之前已经确定好了,在运行期间无法改变
  • Art回收算法可运行期选择(5.0之后默认使用的虚拟机)在不同的情况下可以选择合适的垃圾回收算法
  • Art具备内存整理能力,减少内存空洞

案例:

        应用程序发生在前台,正在与用户进行交互,对于用户来说,这时候响应速度最重要,此时应该选择一直简单的回收算法--标记清除算法,直接简单粗暴的作为前台的垃圾回收算法

        如果用户将APP切换到了后台,采用标记整理算法,作为一种补充

Low Memory Killer机制

针对所有进程来说的,当手机内存不足时,这个机制会针对所有进程进行回收

Android系统将进程分为(优先级按照从高往低):

  • 前台进程
  • 可见进程
  • 服务进程
  • 后台进程
  • 空进程

Low Memory Killer机制会找低优先级进程优先进行回收,在回收时会考虑一个回收收益

五、内存抖动

定义:内存频繁分配和回收导致内存不稳定

表现:频繁GC、内存曲线呈锯齿状

危害:导致卡顿、严重时,会导致OOM

内存抖动导致OOM:

  • 频繁创建对象,导致内存不足及碎片(不连续)
  • 不连续的内存碎片无法被分配,导致OOM

实战:

  1. 首先通过Memory Profile 工具进行初步排查,为什么要选这个工具,它能很直观的以图表的方式告诉我们这个App 的内存使用情况,可以直观的看到这个App 在这段使用过程中是不是呈锯齿状,有没有内存抖动的表现
  2. 使用Memory Profiler 的跟踪内存分配的功能,同时结合代码进行排先确认哪个地方的内存抖动,然后再去修改它。或者结合CPU Profiler 结合代码排查

解决技巧
        找循环或者频繁调用的地方

六、内存泄漏

定义:内存中存在已经没有用的对象
表现:内存抖动,可用内存逐渐变少,可能代码写的有问题,不断的申请内存,系统频繁的GC,导致的内存抖动
危害:内存不足,频繁GC ,OOM 

解决实战:使用Memory Profiler初步观察,通过Memory Analyzer结合代码确认

        Memory Analyzer 强大的Java heap 工具,可以对Java内存进行深入分析,对于内存泄露来说,Memory profiler 只能进行一个简单的分析,并不能确认问题确认问题只能通过MAT 

七、ARTHook 优雅的检测不合理图片

Bitmap内存模型

  • AP110之前Bitmap自身在Dalvik Heap中,像素在Native
  • API10之后像素也被放在Dalvik Heap中
  • AP126之后像素在Native

获取Bitmap占用内存

  • getByteCount 运行时直接获取Bitmap的内存大小
  • 宽 x 高 x 一像素占用内存,如果在资源目录下还要*压缩比例,在res目录下

常规方式:

        背景:图片对内存优化至关重要,图片宽高大于控件宽高

        实现:继承ImageView,覆写实现计算大小

        总结:侵入性强,不通用

Epic方式:

  • Epic是一个虚拟机层面、以Java Method为粒度的运行时Hook框架
  • 支持Android4.0一9.0
  • https://github.com/tiann/epic
  • 使用:
    • compile 'me.weishu:epic:0.3.6'
    • 继承xC_ MethodHook ,实现相应逻辑
    • 注入Hook :DexposedBridge.findAndHookMethod

ARTHook

        挂钩,将额外的代码钩住原有方法,修改执行逻辑

        使用场景:运行时插桩,性能分析

        优点:无侵入性、通用性强、

        缺点:兼容问题大,开元方案不能带到线上环境

            

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/875714.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

10分钟极速入门dash应用开发

大家好我是费老师,几天前我发布了由我开源维护的dash通用网页组件库fac的0.2.x全新版本,为大家介绍了其具有的诸多实用特性功能,也吸引了很多对基于dash的Python全栈应用开发感兴趣的朋友,为了方便更多对dash应用开发不甚了解的朋…

stable diffusion 电商应用技术(插图部分重绘)

1.下载inpaint anything插件 2.下载识别模型 3.使用全景分割 4.分割模版,获取蒙版 5.发送到图生图重绘制 6.固定姿势 7.clip反推提示词 8.生成重绘衣服

msvcr110.dll缺失的解决方法分享,多种方法教你修复msvcr110.dll

我们在使用电脑的时候会遇到各种各样的问题,特别是dll文件缺失的这一块更是经常可以看到的,如你在使用电脑的时候,突然弹出一个电脑缺失了msvcr110.dll文件,一些程序无法运行,这时候我们就要针对于这方面来进行一些解决…

【C++】vector容器

0.前言 1.vector构造函数 #include <iostream> using namespace std; #include <vector>void printVector(vector<int>& v) //此处&代表 引用 &#xff1b;若取地址&#xff0c;则是 数据类型* 变量名 {for (vector<int>::iterator it v.begi…

PLUS操作流程、应用与实践,多源不同分辨率数据的处理、ArcGIS的应用、PLUS模型的应用、InVEST模型的应用

PLUS模型是由中国地质大学&#xff08;武汉&#xff09;地理与信息工程学院高性能空间计算智能实验室开发&#xff0c;是一个基于栅格数据的可用于斑块尺度土地利用/土地覆盖(LULC)变化模拟的元胞自动机(CA)模型。PLUS模型集成了基于土地扩张分析的规则挖掘方法和基于多类型随机…

从LeakCanary看Fragment生命周期监控

前文中我们已经了解到LeakCanary中Service生命销毁的监听方式&#xff0c;那么Fragment的生命周期监听又是怎么实现的呢&#xff1f; Activity生命周期监听&#xff0c;在Application里面有ActivityLifecycleCallbacks&#xff0c;那么Fragment是否相似呢&#xff1f;我们的第…

Docker 本地镜像发布到私有仓库

1. 本地镜像发布到私有库流程 2. 是什么 1 官方Docker Hub地址&#xff1a;https://hub.docker.com/&#xff0c;中国大陆访问太慢了且准备被阿里云取代的趋势&#xff0c;不太主流。 2 Dockerhub、阿里云这样的公共镜像仓库可能不太方便&#xff0c;涉及机密的公司不可能提供镜…

使用 NLP 进行文本摘要

一、说明 文本摘要是为较长的文本文档生成简短、流畅且最重要的是准确摘要的过程。自动文本摘要背后的主要思想是能够从整个集合中找到最重要信息的一小部分&#xff0c;并以人类可读的格式呈现。随着在线文本数据的增长&#xff0c;自动文本摘要方法可能会非常有用&#xff0c…

激活函数总结(八):基于Gate mechanism机制的激活函数补充(GLU、SwiGLU、GTU、Bilinear、ReGLU、GEGLU)

激活函数总结&#xff08;八&#xff09;&#xff1a;基于Gate mechanism机制的激活函数补充 1 引言2 激活函数2.1 GLU激活函数2.2 SwiGLU激活函数2.3 GTU激活函数2.4 Bilinear激活函数2.5 ReGLU激活函数2.6 GEGLU激活函数 3. 总结 1 引言 在前面的文章中已经介绍了介绍了一系…

【多视重建】从Zero-123到One-2-3-45:多视角生成

文章目录 摘要一、引言二、相关工作三、Zero-1-to-33.1.学习如何控制照相机的视角3.2.视角作为条件的扩散3.3三维重构3.4 数据集 四、One-2-3-454.1 Zero123: 视角条件的 2D Diffusion4.2 NeRF优化&#xff1a;将多视图预测提升到三维图像4.3 基于不完美多视图的 神经表面重建*…

Linux下在qtcreator中创建qt程序

目录 1、新建项目 2、单工程项目创建 3、多工程项目创建 4、添加子工程&#xff08;基于多工程目录结构&#xff09; 5、 .pro文件 1、新建项目 切换到“编辑”界面&#xff0c;点击菜单栏中的“文件”-“新建文件或项目” 2、单工程项目创建 只有一个工程的项目&#…

【自用】终端设备(ESP32-S3)连接云服务器 HomeAssistant + MQTT 物联网平台

总览 1.流程概述 2.开始搭建&#xff01; 3. 一、流程概述 0.总体流程 二、开始搭建 1.下载 MQTTX 客户端&#xff08; 在PC上 &#xff09; https://mqttx.app/zh/downloads 2.新建 MQTTX 连接 0.点击左侧的加号&#xff0c;开始新建连接。 一共需要填写几个参数&#…

合并图形并共享同一个图例的三种方法

简介 小编在科研中&#xff0c;需要将多个图形进行合并&#xff0c;并共享同一个图例。此时应该如何实现&#xff1f;关于图形合并的相关推文写了很多了&#xff1a;R可视乎&#xff5c;合并多幅图形、cowplot包&#xff0c;ggplot2图形排版R包。 但是对于今天这个问题&#x…

SpringBoot-Hello World

SpringBootWeb快速入门 创建Springboot工程&#xff0c;并勾选web开发相关依赖定义HelloController类&#xff0c;添加方法hello&#xff0c;并添加相关注释运行测试 创建新的SpringBoot项目 几个注意的点&#xff1a; Name&#xff1a;基本上不用管&#xff0c;会根据下面的Ar…

智能电动机保护控制器的应用与分析

安科瑞 华楠 分析了智能电动机保护器相比热继电器的优点&#xff0c;指出了在我公司成功应用的原因&#xff0c;提出了应用过程中需要注意的地方。 公司新建一车间中&#xff0c;当工程设计到电动机保护这一部分时&#xff0c;设计者出于对热继电器保护性能的不满意&#xff0c…

【数据库基础】Mysql下载安装及配置

下载 下载地址&#xff1a;https://downloads.mysql.com/archives/community/ 当前最新版本为 8.0版本&#xff0c;可以在Product Version中选择指定版本&#xff0c;在Operating System中选择安装平台&#xff0c;如下 安装 MySQL安装文件分两种 .msi和.zip [外链图片转存失…

红帽8.2版本CSA题库:第八题配置 autofs自动挂载

红帽8.2版本CSA题库&#xff1a;第八题配置 autofs自动挂载 yum -y install autofs &#xff03;安装&#xff41;&#xff55;&#xff54;&#xff4f;&#xff46;&#xff53; vim /etc/auto.master &#xff03;在…

Spring Boot业务代码中使用@Transactional事务失效踩坑点总结

1.概述 接着之前我们对Spring AOP以及基于AOP实现事务控制的上文&#xff0c;今天我们来看看平时在项目业务开发中使用声明式事务Transactional的失效场景&#xff0c;并分析其失效原因&#xff0c;从而帮助开发人员尽量避免踩坑。 我们知道 Spring 声明式事务功能提供了极其…

圆满收官丨“2023年度第一季万博智云云迁移架构师训练营”结营了

“2023年度第一季万博智云云迁移架构师训练营”于今日圆满落幕。百余名来自全国各地30企业的工程师报名参加学习&#xff0c;其中60工程师在忙碌工作中抽空参与考试&#xff0c;近40名工程师通过万博智云云迁移架构师OCCE认证。 为了帮助工程师们掌握云迁移基础知识&#xff0c…

基于UDS on CAN的bootloader

UDS (Unified Diagnostic Services)&#xff1a;汽车诊断标准协议 Tester(诊断方)<--------------------------------------->ECU(汽车电控单元&#xff09; 2.UDS的硬件实现&#xff1a;CAN总线和诊断接口 3.UDS的软件实现&#xff1a;协议栈(Core)和应用程序 UDS协议…