手机网站绑定域名是什么,成都网络公司有哪些,学校网站类型,装饰装潢设计目录 目录一、什么是内存抖动#xff1f;1.1 Android里的内存抖动1.2 如何直观查看这种现象1.3 内存抖动带来的风险 二、如何避免内存抖动 目录
一、什么是内存抖动#xff1f;
在程序里#xff0c;每创建一个对象#xff0c;就会有一块内存分配给它#xff0c;每分配一… 目录 目录一、什么是内存抖动1.1 Android里的内存抖动1.2 如何直观查看这种现象1.3 内存抖动带来的风险 二、如何避免内存抖动 目录
一、什么是内存抖动
在程序里每创建一个对象就会有一块内存分配给它每分配一块内存程序的可用内存也就少了一块当程序占用的内存达到一定临界程度GC也就是垃圾回收器(Garbage Collection)就会出动来回收这一部分不再使用的内存。
1.1 Android里的内存抖动
Android 里的view.ondraw()方法在每次需要重绘的时候都会被调用这就意味着如果在ondraw()里写了创建对象的代码那么在界面频繁刷新的时候也就会频繁的创建出一大批只被使用一次的对象这就会导致内存的迅速攀升然后很快可能就会触发GC的回收动作也就是被创造的对象被GC回收掉垃圾内存太多了就被清理掉这是java的工作机制这不是问题。
问题在于频繁创建这些对象会导致内存不断地攀升在刚回收了之后又迅速涨起来紧接着就是又一次的回收往复下来就会导致一种循环一种在短时间内反复的发生内存增长和回收的循环这种循环往复的状态就像是水波纹的颤动一样专业称呼叫作Memory Churnandroid 的官方文档就把他翻译成了 内存抖动
1.2 如何直观查看这种现象
可以通过Android Studio的 Memory Profiler来直观的观察这种现象。 可以看到 下面的一溜白色垃圾桶。说明在大量的执行gc操作
1.3 内存抖动带来的风险
内存的回收虽然很快时间成本很低但终究是有时间成本的一两次的回收不容易被用户察觉但是多次回收行为在短时间内集中爆发就会导致概率很大的界面卡顿的风险
所以要避免在ondraw()里创建对象。同理不只是ondraw()在次数较大的循环里创建对象同样会导致内存抖动。 ondraw()里创建的对象通常是和绘制相关的对象这些对象通常包含下层native对象的引用这就会导致ondraw()里创建对象所导致的内存回收的耗时会更高界面更卡顿。
内存抖动可能会导致内存溢出而内存溢出的直接结果就是软件崩溃。 二、如何避免内存抖动 注意自定义View的onDraw()方法会被频繁调用所以在这里面不应该频繁的创建对象。当需要大量使用Bitmap的时候试着把它们缓存在数组中实现复用。减少对象的创建和销毁尽量避免在循环或频繁调用的地方创建和销毁对象可以通过对象池、复用对象等方式减少对象的创建和销毁次数。使用合适的数据结构选择合适的数据结构可以减少内存抖动例如使用ArrayList替代LinkedList避免频繁的内存分配和释放。避免在循环中进行大量的字符串拼接操作字符串拼接操作会创建大量的临时对象容易引起内存抖动可以使用StringBuilder或StringBuffer来优化。使用线程池合理使用线程池可以减少线程的创建和销毁避免频繁的内存分配和释放。 Tips: 内存抖动和内存泄漏是两个不同的问题。内存抖动是指内存分配和释放频繁发生导致内存使用不稳定影响应用性能。而内存泄漏是指应用程序中的内存无法被正确释放导致内存占用不断增加最终导致应用程序崩溃或性能下降。 内存抖动可能会导致内存泄漏因为频繁的内存分配和释放会增加内存管理的负担可能会导致内存管理出现问题从而引发内存泄漏。因此避免内存抖动也可以间接地减少内存泄漏的风险。
参考链接 Android 性能优化 - 彻底解决内存抖动 Android内存抖动主要原因分析6个优化小技巧