当前位置: 首页 > 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/…...

conda相比python好处

Conda 作为 Python 的环境和包管理工具&#xff0c;相比原生 Python 生态&#xff08;如 pip 虚拟环境&#xff09;有许多独特优势&#xff0c;尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处&#xff1a; 一、一站式环境管理&#xff1a…...

C++_核心编程_多态案例二-制作饮品

#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为&#xff1a;煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例&#xff0c;提供抽象制作饮品基类&#xff0c;提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...

Xshell远程连接Kali(默认 | 私钥)Note版

前言:xshell远程连接&#xff0c;私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...

MongoDB学习和应用(高效的非关系型数据库)

一丶 MongoDB简介 对于社交类软件的功能&#xff0c;我们需要对它的功能特点进行分析&#xff1a; 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具&#xff1a; mysql&#xff1a;关系型数据库&am…...

CMake控制VS2022项目文件分组

我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...

CSS设置元素的宽度根据其内容自动调整

width: fit-content 是 CSS 中的一个属性值&#xff0c;用于设置元素的宽度根据其内容自动调整&#xff0c;确保宽度刚好容纳内容而不会超出。 效果对比 默认情况&#xff08;width: auto&#xff09;&#xff1a; 块级元素&#xff08;如 <div>&#xff09;会占满父容器…...

NXP S32K146 T-Box 携手 SD NAND(贴片式TF卡):驱动汽车智能革新的黄金组合

在汽车智能化的汹涌浪潮中&#xff0c;车辆不再仅仅是传统的交通工具&#xff0c;而是逐步演变为高度智能的移动终端。这一转变的核心支撑&#xff0c;来自于车内关键技术的深度融合与协同创新。车载远程信息处理盒&#xff08;T-Box&#xff09;方案&#xff1a;NXP S32K146 与…...

【VLNs篇】07:NavRL—在动态环境中学习安全飞行

项目内容论文标题NavRL: 在动态环境中学习安全飞行 (NavRL: Learning Safe Flight in Dynamic Environments)核心问题解决无人机在包含静态和动态障碍物的复杂环境中进行安全、高效自主导航的挑战&#xff0c;克服传统方法和现有强化学习方法的局限性。核心算法基于近端策略优化…...

LRU 缓存机制详解与实现(Java版) + 力扣解决

&#x1f4cc; LRU 缓存机制详解与实现&#xff08;Java版&#xff09; 一、&#x1f4d6; 问题背景 在日常开发中&#xff0c;我们经常会使用 缓存&#xff08;Cache&#xff09; 来提升性能。但由于内存有限&#xff0c;缓存不可能无限增长&#xff0c;于是需要策略决定&am…...

python爬虫——气象数据爬取

一、导入库与全局配置 python 运行 import json import datetime import time import requests from sqlalchemy import create_engine import csv import pandas as pd作用&#xff1a; 引入数据解析、网络请求、时间处理、数据库操作等所需库。requests&#xff1a;发送 …...