码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • Android内存优化/内存泄漏排查


    记得刚入职的第一天领导给了个bug让我分析一下  视频播放30分钟后直接crash,看了日志发现是OOM,对于刚入职的我项目不熟悉,代码不熟悉直接排查OOM范围就比较广泛了,只能利用工具先分析

    关键异常截图:

     理解OOM的定义:

    常见的内存方面问题: 

    1. 内存抖动
    2. 内存泄漏
    3. 内存溢出

    关注内存方面3个重要点:

    1. 代码在jvm如何存在(栈帧)
    2. 某个对象在内存中到底占用多少内存
    3. 某个对象的生命周期;线程,application

     内存分析相关工具:(4种)

    1、adb shell dumpsys meminfo com.xxx.xxx

            刚开始手机profile跑不起来,用adb宏观的查看内存基本情况

            https://developer.android.com/studio/command-line/dumpsys

    2、LeakCanary分析    默认分析activity泄漏

    3、profile分析 ,不太好做对比 

            https://developer.android.com/studio/profile/memory-profiler#record-allocations

    4、MAT分析,MAT下载地址

            https://www.eclipse.org/mat/downloads.php

    AndroidStudio  Profiler heap dump方式

    注:AndroidStudio的heap dump文件不能直接用MAT打开,需要配置环境变量

            /Users/xxx/Library/Android/sdk/platform-tools

            使用如下:hprof-conv -z 原文件.hprof 目标文件.hprof

    MAT分析对象消耗内存大小

    Shallow Heap :一个对象内存的消耗大小,不包含对其他对象的引用;

    Retained Heap :是shallow Heap的总和,也就是该对象被GC之后所能回收的内存大小;

    https://www.iteye.com/blog/bjyzxxds-1532937

    关于lruCache 重写sizeof和未重写sizeof源码解释:

    /**
     * @param maxSize for caches that do not override {@link #sizeOf}, this is
     *     the maximum number of entries in the cache. For all other caches,
     *     this is the maximum sum of the sizes of the entries in this cache.
     */
    
    我的理解:重写和不重写sizeof 
    1. 不重写:是对最大数量的限制(最大10个,1个ByteArray1M)
    2. 重写:缓存中条目大小的最大总和

    原因分析:

    没有重写sizeof方法,那就是最大是10*1024 * 1024,每个ByteArray 1M  

    一个视频3.12G ,2小时43分钟 ,一分钟就是18M,20分钟就增加360M,

    本身打开APP大概500M,所以30分钟会oom crash,性能差点的手机25分钟左右OOM,性能好点的手机30分钟 (1G了crash)

    解决方案: 

    解决前VS解决后内存情况:

    利用MAT分析内存泄漏 代码案例如下:

     频繁进入退出activity heap dump不同时间段两份内存文件,转换后hprof-conv导入MAT,利用compare basket进行比较

  • 相关阅读:
    macos重装系统 启动U盘制作方法 - createinstallmedia 命令使用方法总结
    竞赛 基于大数据的社交平台数据爬虫舆情分析可视化系统
    微服务管家婆-Nacos Discovery
    微信小程序开发实战(常用的内置组件)
    基于springboot+layui仓库管理系统设计和实现
    卡尔曼滤波基本原理详解
    故障维修无忧服务:OLED透明拼接屏的专业技术支持与保修服务
    猿创征文|【Vue3】插槽(Slot)基础使用
    TreeSet集合概述和特点(有代码)
    java毕业设计论文题目SSM框架车库停车计费系统|停车场
  • 原文地址:https://blog.csdn.net/qq_33220645/article/details/126952718
  • 最新文章
  • 【JVM】编译执行与解释执行的区别是什么?JVM 使用哪种方式?
    用 Hashids 优雅解决 C 端自增 ID 暴露问题
    V8引擎 精品漫游指南--Ignition篇(上) 指令 栈帧 槽位 调用约定 内存布局 基础内容
    LLVM Pass快速入门(四):代码插桩
    milkup:桌面端 markdown AI续写和即时渲染
    基于项目工程构建SBOM(软件物料清单)的研究
    鸿蒙应用开发UI基础第二节:鸿蒙应用程序框架核心解析与实操
    .NET 中如何快速实现 List 集合去重?
    扣子Coze实战:从0到1打造抖音+小红书热点监控智能体
    浅谈数据访问层
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号