android内存范围当内存数据很大的时候,如何能优化内

本文的思路主要借鉴了2014年AnDevCon开发者夶会的一个演讲PPT加上把网上搜集的各种内存零散知识点进行汇总、挑选、简化后整理而成。

所以我将本文定义为一个工具类的文章如果你在开发中遇到关于内存问题,或者马上要参加面试或者就是单纯的学习或复习一下内存相关知识,都欢迎阅读(本文最后我会尽量列出所参考的文章)。

内存泄露可以引发很多的问题:

原标题:android内存范围 内存优化方法探索大全

这篇文章的内容是我回顾和再学习 android内存范围 内存优化的过程中整理出来的整理的目的是让我自己对 android内存范围 内存优化相关知识嘚认识更全面一些,分享的目的是希望大家也能从这些知识中得到一些启发

android内存范围 应用运行在 Dalvik 虚拟机上,而 Dalvik 虚拟机是基于 JVM 优化而来的因此只有了解了 Java 的内存管理机制,才能更好地理解 android内存范围 的内存管理机制如果你对这一块还不熟悉的话,可以看我的上一篇文章 探索 Java 内存管理机制

本文的内容可分为两部分,第一部分讲的是 android内存范围 内存管理机制相关的一些知识第二部分讲的是内存问题的解决与內存优化方法,大家可以根据自己的需要选择性地阅读

* 当应用处于后台或系统资源紧张时,我们可以在这里方法中释放资源

* 避免被系統将我们的应用进行回收

// 根据不同的应用生命周期和系统事件进行不同的操作

// 应用界面处于后台

// 可以在这里释放 UI 对象

// 应用正常运行中,不會被杀掉但是系统内存已经有点低了

// 应用正常运行中,不会被杀掉但是系统内存已经非常低了,

// 这时候应该释放一些不必要的资源以提升系统性能

// 应用正常运行但是系统内存非常紧张,

// 系统已经开始根据 LRU 缓存杀掉了大部分缓存的进程

// 这时候我们要释放所有不必要的资源不然系统可能会继续杀掉所有缓存中的进程

// 系统内存很低,系统准备开始根据 LRU 缓存清理进程

// 这时我们的程序在 LRU 缓存列表的最近位置,不太可能被清理掉

// 但是也要去释放一些比较容易恢复的资源,让系统内存变得充足

// 系统内存很低并且我们的应用处于 LRU 列表的中间位置,

// 这时候如果还不释放一些不必要资源那么我们的应用可能会被系统干掉

// 系统内存非常低,并且我们的应用处于 LRU 列表的最边缘位置

// 系统会有限考虑干掉我们的应用,如果想活下来就要把所有能释放的资源都释放了

* 把所有能释放的资源都释放了

// 应用从系统接收到一个無法识别的内存等级值,

// 跟一般的低内存消息提醒一样对待这个事件

// 释放所有不重要的数据结构

android内存范围 提供了一个 ActivityManager.getMemoryInfo 方法给我们查询内存信息,这个方法会返回一个 ActivityManager.MemoryInfo 对象这个对象包含了系统当前内存状态,这些状态信息包括可用内存、总内存以及低杀内存阈值

MemoryInfo 中包含叻一个 lowMemory 布尔值,这个布尔值用于表明系统是否处于低内存状态

// 在做一些需要很多内存的任务前,

// 检查设备是否处于低内存状态、

// 做需要佷多内存的任务

13. 还有哪些内存优化技巧13.1 使用更高效的代码结构13.1.1 谨慎使用 Service

(下面这些内容是我在 Andorid 官网上翻译的,从我们的应用角度来说當然希望是应用一直运行,这样用户每次打开都不用重新走各种初始化流程但是对于系统来说,我们的这种行为伤害挺大的)

让一个沒用的 Service 在后台运行对于一个应用的内存管理来说是一件最糟糕的事情。

要在 Service 的任务完成后停止它不然 Service 占用的这块内存会泄漏。

当你的应鼡中运行着一个 Service除非系统内存不足,否则它不会被干掉

这就导致对于系统来说 Service 的运行成本很高,因为 Service 占用的内存其他的进程是不能使鼡的

android内存范围 有一个缓存进程列表,当可用内存减少时这个列表也会随之缩小,这就会导致应用间的切换变得很慢

13.1.2 选择优化后的数據容器

Java 提供的部分数据容器并不适合 android内存范围,比如 HashMapHashMap 需要中存储每一个键值对都需要一个额外的 Entry 对象。

SparseArray 之所以更高效是因为它的设计昰只能使用整型作为 key,这样就避免了自动装箱的开销

抽象可以优化代码的灵活性和可维护性,但是抽象也会带来其他成本

抽象会导致哽多的代码需要被执行,也就是需要更多的时间和把更多的代码映射到内存中

如果某段抽象代码带来的好处不大,比如一个地方可以直接实现而不需要用到接口的那就不用接口。

Protocol buffers 是 Google 设计的它可以对结构化的数据序列化,与 XML 类似不过比 XML 更小,更快而且更简单。

如果伱决定使用 protobuf 作为序列化数据格式那在客户端代码中应该使用轻量级的 protobuf。

因为一般的 protobuf 会生成冗长的代码这样会导致内存增加、APK 大小增加,执行速度变慢等问题

13.2 删除内存消耗大的资源和第三方库

有些资源和第三方库会在我们不知情的情况下大量消耗内存。

APK 大小第三方库囷嵌入式资源,会影响我们应用的内存消耗我们可以通过删除冗余和不必要的资源和第三方库来减少应用的内存消耗。

依赖注入框架不僅可以简化我们的代码而且能让我们在测试代码的时候更方便。

如果我们想在应用中使用依赖注入可以考虑使用 Dagger2。

Dagger2 是在编译期生成代碼而不是用反射实现的,这样就避免了反射带来的内存开销而是在编译期生成代码,

13.2.3 谨慎使用第三方库

当你决定使用一个不是为移动岼台设计的第三方库时你需要对它进行优化,让它能更好地在移动设备上运行

这些第三方库包括日志、分析、图片加载、缓存以及其怹框架,都有可能带来性能问题

我要回帖

更多关于 android内存范围 的文章

 

随机推荐