当前位置: 首页 > news >正文

Android性能优化——内存优化

一、内存问题

  • 内存抖动,锯齿状,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

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

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

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

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

            

相关文章:

Android性能优化——内存优化

一、内存问题 内存抖动,锯齿状,GC导致卡顿内存泄漏,可用内存减少,频繁GC 内存溢出,OOM,程序异常 二、内存分析工具 Memory ProfilerMemory Analyzer LeakCanary Memory Profiler 实时图表展示应用内存使…...

Android Studio实现图形验证码

源代码 源代码MainActivity 效果图32行需要修改,不修改会报错:需要常量表达式,我的代码已修改 点击后 MainActivity import static com.example.graphicverificationcode.RxCaptcha.TYPE.NUMBER;import android.annotation.SuppressLint; …...

JAVA面试数据库篇

目录 一.优化 1.MYSQL中,如何定位慢查询? 2.SQL语句执行慢,如何分析呢? 3.索引 了解过索引吗?(什么是索引) 索引的底层数据结构了解过吗? B树和B树的区别是什么呢? 什么是聚…...

Android高手进阶教程(三)之----Android 中自定义View的应用.

大家好我们今天的教程是在Android 教程中自定义View 的学习&#xff0c;对于初学着来说&#xff0c;他们习惯了Android 传统的页面布局方式&#xff0c;如下代码: <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"htt…...

第一百一十三回 dart中的getter/setter方法

文章目录 概念介绍使用方法示例代码使用扩展 我们在上一章回中介绍了 flutter_screenutil包相关的内容&#xff0c;本章回中将介绍 dart中的setter/getter方法.闲话休提&#xff0c;让我们一起Talk Flutter吧。 概念介绍 我们在这里介绍的setter/getter方法属于编程语言中的…...

搭建Docker环境

目录 一、docker环境搭建 1、卸载旧版本docker 2、安装依赖和设置仓库 3、安装docker 4、启动并加入开机启动 5、验证是否安装成功 二、利用docker搭建nginx 1、拉取镜像 2、启动容器&#xff0c;部署nginx 一、docker环境搭建 1、卸载旧版本docker yum remove docke…...

微服务08-多级缓存

1.什么是多级缓存 传统的缓存策略一般是请求到达Tomcat后,先查询Redis,如果未命中则查询数据库,如图: 存在下面的问题: •请求要经过Tomcat处理,Tomcat的性能成为整个系统的瓶颈 •Redis缓存失效时,会对数据库产生冲击 多级缓存就是充分利用请求处理的每个环节,分…...

Intel汇编和ATT汇编的区别?

一、前缀不同 在 Intel 语法中&#xff0c;没有寄存器前缀或立即前缀。 然而&#xff0c;在 AT&T 中&#xff0c;寄存器的前缀是“%”&#xff0c;而 immed 的前缀是“$”。 Intel 语法十六进制或二进制即时数据分别带有“h”和“b”后缀。 此外&#xff0c;如果第一个十六…...

MongoDB 备份与恢复

1.1 MongoDB的常用命令 mongoexport / mongoimport mongodump / mongorestore 有以上两组命令在备份与恢复中进行使用。 1.1.1 导出工具mongoexport Mongodb中的mongoexport工具可以把一个collection导出成JSON格式或CSV格式的文件。可以通过参数指定导出的数据项&#xff0c…...

探讨uniapp的网络通信问题

uni-app 中有很多原生的 API&#xff0c;其中我们经常会用到的肯定有&#xff1a;uni.request(OBJECT) method 有效值 注意&#xff1a;method有效值必须大写&#xff0c;每个平台支持的method有效值不同&#xff0c;详细见下表。 success 返回参数说明 data 数据说明 最终…...

【左神算法刷题班】第18节:汉诺塔问题、岛屿问题、最大路径和问题

第18节 题目1&#xff1a;汉诺塔问题&#xff08;变体&#xff09; 体系学习班18节有讲暴力递归的汉诺塔原题。 给定一个数组arr&#xff0c;长度为N&#xff0c;arr中的值只有1&#xff0c;2&#xff0c;3三种 arr[i] 1&#xff0c;代表汉诺塔问题中&#xff0c;从上往下第…...

网络安全体系架构介绍

网络安全体系是一项复杂的系统工程&#xff0c;需要把安全组织体系、安全技术体系和安全管理体系等手段进行有机融合&#xff0c;构建一体化的整体安全屏障。针对网络安全防护&#xff0c;美国曾提出多个网络安全体系模型和架构&#xff0c;其中比较经典的包括PDRR模型、P2DR模…...

JSP实训项目设计报告—MVC简易购物商城

JSP实训项目设计报告—MVC简易购物商城 文章目录 JSP实训项目设计报告—MVC简易购物商城设计目的设计要求设计思路系统要求单点登录模块商品展示模块购物车展示模块 概要设计Model层View层Controller层 详细设计Model层View层登录界面系统主界面 Controller层 系统运行效果项目…...

41、可靠传输——停等ARQ

前面两节内容我们学习了传输层的基本概况的一些知识&#xff0c;包括传输层在TCP/IP协议栈中负责的任务、传输层的两大协议&#xff0c;以及端口号、套接字等一些基本的概念。从这一节开始&#xff0c;我们将开启两大协议中TCP协议的学习。 但是&#xff0c;经过之前的学习&am…...

RK3568 cmake编译

一.简介 CMake是开源、跨平台的构建工具&#xff0c;可以让我们通过编写简单的配置文件去生成本地的Makefile&#xff0c;这个配置文件是独立于运行平台和编译器的&#xff0c;这样就不用亲自去编写Makefile了&#xff0c;而且配置文件可以直接拿到其它平台上使用&#xff0c;…...

详细安装配置django

安装配置使用Django。 1&#xff0c;下载安装 django pip install django 2.创建设置项目 先进入要放置项目的文件夹下 2.1&#xff0c; 创建项目 django-admin startproject Api_project 2.2&#xff0c; 创建app命令 cd Api_project dir看一下是否有 manage.py 文件…...

HTTP之cookie基础学习

目录 Cookie 什么是Cookie Cookie分类 Cookie版本 Cookie工作原理 Cookie详解 创建cookie cookie编码 cookie过期时间选项 Cookie流程 Cookie使用 会话管理 个性化信息 记录用户的行为 Cookie属性 domain选项 path选项 secure选项 cookie…...

观察者模式和发布订阅模式

观察者模式与发布订阅模式的区别&#xff1a; 1、观察者模式中只有观察者和被观察者&#xff0c;发布订阅模式中有发布者、订阅者、调度中心 2、观察者模式是被观察者发生变化时自己通知观察者&#xff0c;发布订阅模式是通过调度中心来进行分布订阅操作 发布订阅模式 class …...

利用ViewModel和LiveData进行数据管理

利用ViewModel和LiveData进行数据管理 1. 引言 在当今移动应用开发的世界中&#xff0c;数据管理是一个至关重要的方面。随着应用的复杂性不断增加&#xff0c;需要有效地管理和维护应用中的数据。无论是从服务器获取数据、本地数据库存储还是用户界面的状态&#xff0c;数据…...

前后端分离------后端创建笔记(05)用户列表查询接口(下)

本文章转载于【SpringBootVue】全网最简单但实用的前后端分离项目实战笔记 - 前端_大菜007的博客-CSDN博客 仅用于学习和讨论&#xff0c;如有侵权请联系 源码&#xff1a;https://gitee.com/green_vegetables/x-admin-project.git 素材&#xff1a;https://pan.baidu.com/s/…...

机器学习与深度学习在地球物理勘探中的应用:基于电阻率数据预测极化率模型

1. 项目概述与核心价值在花岗岩这类地质条件复杂的地区搞勘探&#xff0c;最头疼的就是地下情况“看不清”。传统的电阻率&#xff08;ERT&#xff09;和激发极化&#xff08;IP&#xff09;联合反演&#xff0c;就像用一把刻度模糊的尺子去量一块表面坑洼不平的石头——面对高…...

Redis沙盒体验:在浏览器中零门槛掌握NoSQL核心技能

Redis沙盒体验&#xff1a;在浏览器中零门槛掌握NoSQL核心技能 【免费下载链接】try.redis A demonstration of the Redis database. 项目地址: https://gitcode.com/gh_mirrors/tr/try.redis 当你第一次听说Redis时&#xff0c;是否被那些晦涩的技术术语吓退&#xff1…...

Vue3 图片标框功能实现方案

基于 Vue3 组合式 API 的图片标框&#xff08;画框、标注、选框&#xff09;完整实现&#xff0c;核心逻辑封装在 GetBoxes 组件里&#xff0c;复制就能用 一、功能说明 ✅ 在图片上鼠标拖拽画矩形框 ✅ 实时显示框坐标&#xff08;x, y, width, height&#xff09; ✅ 支持多…...

Vulnhub-DC-1

1.信息收集 使用工具nmap扫描主机端口 这是Drupal是使用PHP语言编写的开源内容管理框架&#xff08;CMF&#xff09;&#xff0c;它由内容管理系统&#xff08;CMS&#xff09;和PHP开发框架&#xff08;Framework&#xff09;共同构成 Web指纹扫描 发现是&#xff1a;drupal…...

PlayAI语音合成质量到底如何?12款竞品横向对比+5项MOS/LSD/STOI硬指标揭榜

更多请点击&#xff1a; https://kaifayun.com 第一章&#xff1a;PlayAI语音合成质量评测报告 PlayAI 是一款面向开发者与内容创作者的实时语音合成&#xff08;TTS&#xff09;服务&#xff0c;支持多语种、多音色及情感可控输出。本报告基于客观可复现的评测流程&#xff0…...

FairyGUI Unity鼠标悬停与点击对象获取原理与实战

1. 这不是“加个OnMouseEnter就能用”的事&#xff1a;FairyGUI在Unity中处理鼠标交互的真实困境很多人第一次在Unity里集成FairyGUI&#xff0c;想实现“鼠标悬停显示提示”或“点击高亮当前按钮”&#xff0c;下意识就去翻Unity的MonoBehaviour文档&#xff0c;找OnMouseEnte…...

GIS工程应用记录(AI辅助编程)

问题的问题&#xff1a;语境坍缩“从各个角度提出问题&#xff0c;AI做出对应积极答复和修改&#xff0c;结果没有什么变化。”这&#xff0c;就是元问题最核心的症状。你尝试了所有你已知的“高级”协作手段&#xff0c;但就像重拳打在棉花上&#xff0c;AI永远在积极回应&…...

OmenSuperHub:基于WMI BIOS控制的高性能笔记本硬件管理方案

OmenSuperHub&#xff1a;基于WMI BIOS控制的高性能笔记本硬件管理方案 【免费下载链接】OmenSuperHub Control Omen laptop performance, fan speeds, and keyboard lighting, and unlock power limits. 项目地址: https://gitcode.com/gh_mirrors/om/OmenSuperHub 在惠…...

终极歌词同步神器LRCGET:5分钟为你的音乐库添加完美歌词

终极歌词同步神器LRCGET&#xff1a;5分钟为你的音乐库添加完美歌词 【免费下载链接】lrcget Utility for mass-downloading LRC synced lyrics for your offline music library. 项目地址: https://gitcode.com/gh_mirrors/lr/lrcget 你是否厌倦了在听歌时手动搜索歌词…...

DeepSeek代码风格检查避坑指南(内部审计报告首次披露:37个被忽略的合规红线)

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;DeepSeek代码风格检查的合规性本质与审计背景 DeepSeek代码风格检查并非单纯的技术偏好约束&#xff0c;而是嵌入研发治理链条中的合规性控制节点。其本质是将编程实践与组织级安全策略、行业监管要求&…...