App内存优化

一、内存优化介绍

1.背景介绍

  • 内存是大问题但缺乏关注
  • 压实骆驼的最后一个稻草(堆栈溢出)

2.内存问题

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

二、优化工具选择

1.工具选择

Memory Profiler

  • 实时图标展示应用内存使用量

  • 识别内存泄露、抖动等

  • 提供捕获堆转储、强制GC以及跟踪内存分配的能力

    总结
  • 方便直观

  • 线下平时使用

Memory Analyzer

  • 强大的Java Heap 分析工具,查找内存泄露及内存占用
  • 生成整体报告、分析问题等
  • 线下深入使用

LeakCanary

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

三、Android 内存管理机制

一、Java 内存管理机制

Java 内存分配

  • 方法区:存储类信息,常量、静态变量等,如 public static final 的一些变量、常量。所有线程共享
  • 虚拟机栈:存储局部变量和操作数栈的(为Java方法服务的)
  • 本地方法栈:(为native 方法服务的)
  • 堆:几块内存块中最大的内存。所有线程共享,对象的内存分配实际上都是在堆上分配的。在虚拟机栈上分配的都是引用,会指向在堆中创建的真正的对象。是GC主要作用的一块区域。常说的内存泄露也是发送在堆上的。
  • 程序计数器:存储当前线程执行方法执行到第几行

Java 内存回收算法

标记-清除算法
  • 标记出所有需要回收的对象

  • 统一回收所有被标记的对象

    在这里插入图片描述
    缺点

  • 标记和清除效率不高

  • 产生大量不连续的内存碎片

复制算法
  • 将内存划分为大小相同的两块
  • 一块内存用完之后复制存活对象到另一块
  • 清理另一块内存
    在这里插入图片描述优缺点
  • 实现简单,运行高效(相比标记-清除算法)
  • 浪费一半空间,代价大
标记-整理算法
  • 标记过程与 “标记-清除” 算法一样
  • 存活对象王一端进行移动
  • 清理其余内存
    在这里插入图片描述
    优点
  • 避免标记-清除导致的内存碎片
  • 避免复制算法的空间浪费
分代收集算法
  • 结合多种收集算法优势
  • 新生代对象存活率低,使用复制算法
  • 老年代对象存活率高,使用标记-整理算法

二、Android内存管理机制

  • 内存弹性分配,分配值与最大值受具体设备影响
  • OOM场景:设备内存真正不足、可用内存不足(设备内存不足以分配给当前应用)

Dalvik 与 ART 区别

  • Dalvik 仅固定一种回收算法
  • Art 回收算法可以运行期选择回收算法(5.0之后都是Art)
  • Art 具备内存整理能力,减少内存空洞

Low Memory Killer 机制

针对所有进程来说的,当手机内存不足的情况下,Low Memory Killer 机制会针对所有进程进行一个回收,按照进程分配优先级顺序,找低优先进程进行回收。同时也会考虑回收收益。例如回收一个进程是30兆还是300兆

进程分类

  1. 前台进程
  2. 可见进程
  3. 服务进程
  4. 后台进程
  5. 空进程

四、内存抖动解决实战

内存抖动介绍

定义:内存频繁分配和回收导致内存不稳定
表现:频繁GC、内存曲线呈锯齿状
危害:导致卡顿、OOM

内存抖动导致OOM

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

内存抖动解决实战

使用Memory Profiler 初步排查

在这里插入图片描述

使用Memory Profiler 或Cpu Profiler 结合代码排查

在这里插入图片描述

内存抖动解决技巧

  • 找循环或者频繁调用的地方

五、内存泄露解决实战

内存泄露介绍

定义:内存中存在已经没有用的对象
表现:内存抖动、可用内存逐渐减少
危害;内存不足、GC频繁、OOM

内存泄露解决实战

Memory Analyzer

  • https://www.eclipse.org/mat/downloads.php
  • 转换命令:hprof-conv 原文件路径 转换后文件路径

总结

  1. 使用Memory Profiler 初步观察(可用内存逐渐减少时,可以断定有内存泄露)
  2. 通过Memory Analyzer 结合代码确认

六、全面理解MAT

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

Bitmap 内存模型

  • Api10 之前Bitmap 自身在Dalvik Heap 中,像素在native (有一个坏处,java 层内存回收后,native 层不知道)
  • Api10 之后像素也被放在Dalvik Heap 中
  • Api 26之后像素在Native(增加了java 向native 层的通知机制)

获取Bitmap 占用内存

  • getByteCount
  • 宽 x 高 x 一像素占用内存

常规检测不合理图片方式

背景:图片对内存优化至关重要、图片宽高大于控件宽高
实现:继承ImageView ,覆写实现计算大小
缺点:侵入性强、不通用

ARTHook 实战

介绍

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

  • 运行时插桩
  • 性能分析

Epic

  • Epic 是一个虚拟机层面、以Java Method 为粒度的运行时Hook 框架
  • 支持Android 4.0- 9.0
  • https://github.com/tiann/epic
使用
  1. compile ‘me.weishu:epic:0.3.6’
  2. 继承XC_MethodHook ,实现相应逻辑
  3. 注入Hook:DexposedBridge.findAandHookMethod
优点

无侵入性
通用性强
兼容问题大,开源方案不能带到线上环境

线上内存监控方案

常规方案

方案一

  • 设定场景线上Dump : Debug.dumpHprofData()
    (假设线上app 以使用单个程序最大占用内存的80%时,进行下线上内存Dump )
    在这里插入图片描述

方案一总结

  • Dump 文件太大(Dump 文件大小跟程序使用时长有关),和对象数正相关,可裁剪
  • 上传失败率高,分析困难
  • 配合一定策略,有一定效果

**

方案二

  1. LeakCanary 带到线上
  2. 预设泄露怀疑点
  3. 发现泄露回传

方案二总结

  • 不适合所有情况,必须预设怀疑点
  • 分析比较耗时、也容易OOM

LeakCanary原理

  • 监控生命周期,onDestroy 添加RefWatcher 检测
  • 二次确认断定发生内存泄露
  • 分析泄露,找引用链
  • 由监控组件 + 分析组件组成

LeakCanary 定制

  • 预设怀疑点 —> 自动找怀疑点
  • 分析泄露链路慢 ----> 分析Retain size(占用内存) 大的对象
  • 分析OOM ----> 对象裁剪,不全部加载到内存

线上监控完整方案

  • 待机内存、重点模块内存、OOM率
  • 整体及重点模块GC次数、GC 时间
  • 增强的LeakCanary 自动化内存泄露分析

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

jvs智能bi新增:数据集添加sql自定义节点、添加websocket任务进度动态展示等等

智能bi更新功能 新增: 1.数据集添加sql自定义输入节点,支持mysql Oracle数据源; 用户可以从这些数据源中获取数据,并通过SQL语句对数据进行自定义处理和分析。可以帮助用户更加灵活地处理和分析数据,满足各种个性化的需求。 2.…

识别低效io引起的free buffer waits

产生事发时间段的awr报告 Top 5 wait events 这里重点关注: 1.free buffer waits 2.enq_HW-contention 3.enq:tx-row lock contention enq:HW-contention属于水位线的争用,已经透过alter table allocate extent,提前分配空间,这里不做讨论 …

spring boot+sharding jdbc实现读写分离

shigen日更文章的博客写手,擅长Java、python、vue、shell等编程语言和各种应用程序、脚本的开发。记录成长,分享认知,留住感动。 在shigen之前的文章中,写到了Springboot mybatis plus实现读写分离,没有sharding-jdbc的…

怎么修改按SHIFT键关闭Caps Lock功能?

win11 Step 1> 设置-> 时间和语言Step 2> 输入Step 3> 高级键盘设置Step 4> 语言栏选项 -> 高级设置-> 按CAPS LOCK键 Step 1> 设置-> 时间和语言 Step 2> 输入 Step 3> 高级键盘设置 Step 4> 语言栏选项 -> 高级设置-> 按CAPS LOCK…

同调群的维度 和 同调群的秩

同调群的维度是指同调群中非零元素的最小阶数。与线性代数中对向量空间的维度的理解类似。对同调群,k维同调群的维度是k。 同调群的秩是指同调群中的自由部分的维度。同调群通常包含自由部分和挠部分。同调群的秩是指同调群中自由部分的维度。对同调群,…

python+django教师下乡支教岗位分配管理系统pycharm毕业设计项目推荐

本课题使用Python语言进行开发。代码层面的操作主要在PyCharm中进行,将系统所使用到的表以及数据存储到MySQL数据库中,方便对数据进行操作本课题基于WEB的开发平台 1.运行环境:python3.7/python3.8。 2.IDE环境:pycharmmysql5.7; …

多线程(初阶八:计时器Timer)

目录 一、标准库中的计时器 1、计时器的概念 2、计时器的简单介绍 二、模拟实现一个计时器 1、思路 (1)计数器中要存放任务的数据结构 (2)存放优先级队列中的类型:自定义任务类MyTimerTask (3&…

用python找到音乐数据的位置,并实现音乐下载

嗨喽~大家好呀,这里是魔王呐 ❤ ~! python更多源码/资料/解答/教程等 点击此处跳转文末名片免费获取 需求分析: 有什么需求要实现? 这些需求可以用什么技术实现? 找到音乐数据的位置, 分析 不同音乐的链接有何规律?https://lx-sycdn.kuwo.cn/b784688662c82db8…

RocketMq环境搭建

目录 MQ作用 RocketMQ背景 MQ对比 RocketMQ环境搭建 搭建dashboard可视化界面 MQ作用 异步解耦削峰 RocketMQ背景 ​ RocketMQ是阿里巴巴开源的一个消息中间件,在阿里内部历经了双十一等很多高并发场景的考验,能够处理亿万级别的消息。2016年开源…

Win10无法删除文件需要管理员权限的解决方法

在Win10电脑中,用户想要删除不需要的文件,却收到了需要管理员权限才能删除,导致用户自己无法将文件删除掉。下面小编给大家带来Win10系统删除文件需要权限的解决方法,解决后用户在Win10电脑上就能删除任意文件了。 Win10无法删除文…

TCP协议实现一对一聊天

服务端代码: import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; import java.util.Scanner;/*** 发送消息线程*/ class Send e…

香港优才计划申请获批后,才发现原来香港年薪100w并不难!

香港优才计划申请获批后,才发现原来香港年薪100w并不难! 在香港工作的话,给我个人的感觉就是工作和生活是分开的,无论是同事还是上司。比如员工在休假的时候从来不会突然来个电话让你忙个工作或者加个班,也不会八卦你的…

Python 日志(略讲)

日志操作 日志输出: # 输出日志信息 logging.debug("调试级别日志") logging.info("信息级别日志") logging.warning("警告级别日志") logging.error("错误级别日志") logging.critical("严重级别日志")级别设置…

MySQL授权密码

mysql> crate databases school charcter set utf8; Query OK, 1 row affected, 1 warning (0.00 sec) 2.在school数据库中创建Student和Score表 mysql> use school Database changed mysql> create table student-> -> (id int(10) primary key auto_incremen…

springcloud智慧工地管理平台源码(工程全生命周期管理)

智慧工地采用全新的工程全生命周期管理理念,以物联网技术为核心,利用传感网络、远程视频监控、物联网、云计算等新型技术,依托移动和固定宽带网络,围绕施工过程管理,建造互联协同、智能生产、科学管理的信息化生态圈&a…

使用Java API操作HDFS

文章目录 一、了解HDFS Java API(一)HDFS Java API概述1、配置(Configuration)2、文件系统(FileSystem)3、路径(Path)4、输入输出流(FSDataInputStream 和 FSDataOutputS…

智能优化算法应用:基于黑寡妇算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用:基于黑寡妇算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于黑寡妇算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.黑寡妇算法4.实验参数设定5.算法结果6.参考文献7.…

将java jar包构建成docker镜像

(1)准备jar包、准备jdk镜像、创建Dockerfile文件 jar包、Dockerfile文件在同一目录,如下 Dockerfile文件内容如下 FROM jdk1.8:1.0 MAINTAINER vinegar93 "vinegar93163.com" COPY test-0.0.1.jar /home ENTRYPOINT ["java&…

高分屏、屏幕有缩放比情况下Winform窗体变形问题解决方案

高分屏、屏幕有缩放比情况下Winform窗体变形问题解决方案 环境问题描述解决方案永久方案:修改注册表(亲测有效,个人推荐) 环境 电脑:联想拯救者Y9000P 主屏分辨率:2560x1600 缩放:150% 操作系统…

【人工智能Ⅰ】实验7:K-means聚类实验

实验7 K-means聚类实验 一、实验目的 学习K-means算法基本原理,实现Iris数据聚类。 二、实验内容 应用K-means算法对iris数据集进行聚类。 三、实验结果及分析 0:输出数据集的基本信息 参考代码在main函数中首先打印了数据、特征名字、目标值、目标…