什么原因导致‘内存抖动’

在程序需要对象的时候,在堆当中分配出来一块空间,使用完毕以后, GC 帮我们清理掉这片内存空间,如果频繁的一直持续上述操作,就会引起内存抖动。

安卓中内存抖动的影响

1.影响app响应速度。

2.app UI卡顿,甚至应用无响应。

为什么有这么大影响?

因为大部分垃圾回收处理器回收垃圾的时候,需要停止工作业务线程,再进行垃圾回收.

就算是居于cms垃圾回收处理器,也不能保证所有垃圾都能并发回收。

如果回收的时间越久,app的所有业务线程(包括UI线程)需要等待恢复的时间越久。

那么常见会出现内存抖动的地方在哪里?

1.Android的onDraw, onMeasure方法。

这里, 官方不建议在这创建对象,为什么?知道了吧,这里频繁会被底层调用,(可以去了解下安卓刷新机制),如果大量新丢下创建对象,频繁回收,就很容易内存抖动。如果是bitmap,他的内存是在native分配的,处理需要经过内核,使得等待时间更加长久。

2.处理io的地方

读写文件,内存流时候创建大量的byte[]对象会出现。

3.生产消费者模型的组件,这些频繁会产生大量的对象,比如日志,埋点组件等

4.复杂类型的json解析。

比如Gson。默认情况下,是通过反射生成新的实例。通过适配器使用对象池可以解决

推荐解决方案:

通过复用对象使用解决内存抖动,

比如享元设计模式,对象池方案。但对象池不能减少内存,需要对内存做限制,而且每种对象场景不一样,可能需要筛选。需要lru算法的数据结构等。可参考handler,glide对象池原理。

对象池原理很简单,就是创建对象使用完毕后存到内存里面,比如存到链表里面,下次使用对象的时候,优先在链表里面查,如果有就拿出来时候,如果没有就创建,这样就能避免大量对象创建

Android内存抖动相关推荐

  1. android 内存抖动_android内存泄漏怎么破?一招教你搞定!

    相信大部分童靴都有听说个名词:内存泄漏,究竟什么是内存泄漏,它具体有什么危害呢?且听我娓娓道来. 01 JVM/ART 首先为大家普及下,java运行时是有一套虚拟机机制存在的:JVM(Java虚拟机 ...

  2. 【Android 内存优化】内存抖动 ( 垃圾回收算法总结 | 分代收集算法补充 | 内存抖动排查 | 内存抖动操作 | 集合选择 )

    文章目录 一. 垃圾回收算法总结 二. 分代收集算法补充 三. 查看 Java 虚拟机 四. 获取 Android 应用可使用最大内存 五. 内存抖动标志 六. 排查内存抖动 七. 常见的造成内存抖动 ...

  3. Android App解决卡顿慢之内存抖动及内存泄漏(发现和定位)

    内存抖动是指在短时间内有大量的对象被创建或者被回收的现象,内存抖动出现原因主要是频繁(很重要)在循环里创建对象(导致大量对象在短时间内被创建,由于新对象是要占用内存空间的而且是频繁,如果一次或者两次在 ...

  4. Android之内存泄露、内存溢出、内存抖动分析

      内存 JAVA是在JVM所虚拟出的内存环境中运行的,内存分为三个区:堆.栈和方法区. 栈(stack):是简单的数据结构,程序运行时系统自动分配,使用完毕后自动释放.优点:速度快. 堆(heap) ...

  5. 【Android】为啥事件传递这么频繁却不会造成内存抖动

    学而不思则罔,思而不学则殆 [Android]为啥事件传递这么频繁却不会造成内存抖动 引言 测试 测试代码 测试一 两次手指按下起来 测试二 - 不同的页面测试 测试三 同一个应用杀进程测试 测试四 ...

  6. Android 性能优化 - 彻底解决内存抖动

    起源 内存抖动是由于短时间内有大量对象进出新生区导致的,它伴随着频繁的GC. gc会大量占用ui线程和cpu资源,会导致app整体卡顿 android profile 效果图如下图 Memory 中 ...

  7. Android 内存优化-内存抖动★

    1.内存抖动 内存抖动是Android性能优化中内存优化的一种情况.内存抖动主要是由于频繁的创建和销毁对象导致的. 在程序里,每创建一个对象,就会有一块内存分配给它.每分配一块内存,程序的可用内存就少 ...

  8. 深入Android内存泄露

    深入内存泄露 android应用层的内存泄露,其实就是java虚拟机的内存泄漏. (这里,暂不讨论C/C++本地内存的堆泄漏) 1.知识储备 1.Java内存模型 相关内存对象模型,参照博客精讲Jav ...

  9. 【Android 内存优化】Bitmap 硬盘缓存 ( Google 官方 Bitmap 示例 | DiskLruCache 开源库 | 代码示例 )

    文章目录 一.Google 官方 Bitmap 相关示例参考 二.磁盘缓存类 DiskLruCache 三.磁盘缓存初始化 四.存储数据到磁盘缓存中 五.从磁盘缓存中读取数据 六. Android 1 ...

最新文章

  1. .net mysql中文乱码解决办法
  2. PIE SDK影像快速拼接
  3. 打开excel发送错误报告
  4. opcua客户端实现断线重连_干货:通过OPC UA协议访问西门子1500数据
  5. 内联函数与普通函数、成员函数与静态函数的区别(知识整理)
  6. boost::externally_locked相关的测试程序
  7. 数据库的语言——SQL
  8. java判断类型_Java中类型判断的几种方式 - 码农小胖哥 - 博客园
  9. 导出jar插件_Fluttify输出的Flutter插件工程详解
  10. zbb20170228_spring_tdt
  11. 【转】并查集MST题集
  12. 刚看了一个视频,介绍了实体店十几种线上线下引流方法
  13. 阿里云云计算 31在线实验--弹性伸缩(AS)初体验
  14. 云计算与云原生 — ETCD 数据库完全解析
  15. 第三部份:glibc升级到glibc-2.30
  16. 微信公众号互助、开白群,小白报团取暖
  17. Linux的nc,局域网文件互传
  18. 小细节见实力,告诉你vivo Z3如何成为爆款千元机
  19. JQuery中 JSON 兼容性问题(针对ie8)
  20. Hadoop2.x与Hadoop3.x的默认端口变化

热门文章

  1. LeetCode题解 —— 三倍快乐 很难不爱
  2. 搜索引擎学习资源(作者:dongdonglang)
  3. 【C++】教你如何在中秋节给家人们画一个星空
  4. 线性表的实验——湖北理工学院
  5. Cannot resolve symbol ‘redis‘
  6. jdk8 list 反转_Valextra珠宝 晚宴包借拍清单,以及更新版2020春夏系列手袋list
  7. Linux 命令使用笔记【uptime】
  8. 在密铺的瓷砖背后,隐藏着令人毛骨悚然的幻影....
  9. cnblogs 美化主题
  10. Ubuntu 16.04 安装CUDA9.0后出现驱动不工作且nividia-smi无法链接到NVIDIA驱动的解决办法