应用内存onLowMemory onTrimMemory优化
1.应用内存onLowMemory& onTrimMemory优化
onLowMemory& onTrimMemory简介:
OnLowMemory是Android提供的API,在系统内存不足,所有后台程序(优先级为background的进程,不是指后台运行的进程)都被杀死时,系统会调用OnLowMemory。
OnTrimMemory是Android 4.0之后提供的API,系统会根据不同的内存状态来回调。根据不同的内存状态,来响应不同的内存释放策略。
1.1 onLowMemory& onTrimMemory优化,需要释放什么资源?
在内存紧张的时候,会回调OnLowMemory/OnTrimMemory,需要在回调方法中编写释放资源的代码。
可以在资源紧张的时候,释放UI 使用的资源资:Bitmap、数组、控件资源。
1.2 OnLowMemory
OnLowMemory是Android提供的API,在系统内存不足,所有后台程序(优先级为background的进程,不是指后台运行的进程)都被杀死时,系统会调用OnLowMemory。系统提供的回调有:
Application.onLowMemory()
Activity.OnLowMemory()
Fragement.OnLowMemory()
Service.OnLowMemory()
ContentProvider.OnLowMemory()
除了上述系统提供的API,还可以自己实现ComponentCallbacks,通过API注册,这样也能得到OnLowMemory回调。例如:
public static class MyCallback implements ComponentCallbacks {
@Override
public void onConfigurationChanged(Configuration arg) {
}
@Override
public void onLowMemory() {
//do release operation
}
}
然后,通过Context.registerComponentCallbacks ()在合适的时候注册回调就可以了。通过这种自定义的方法,可以在很多地方注册回调,而不需要局限于系统提供的组件。
onLowMemory 当后台程序已经终止资源还匮乏时会调用这个方法。好的应用程序一般会在这个方法里面释放一些不必要的资源来应付当后台程序已经终止,前台应用程序内存还不够时的情况。
1.3 OnTrimMemory
OnTrimMemory是Android 4.0之后提供的API,系统会根据不同的内存状态来回调。系统提供的回调有:
Application.onTrimMemory()
Activity.onTrimMemory()
Fragement.OnTrimMemory()
Service.onTrimMemory()
ContentProvider.OnTrimMemory()
OnTrimMemory的参数是一个int数值,代表不同的内存状态:
TRIM_MEMORY_COMPLETE:内存不足,并且该进程在后台进程列表最后一个,马上就要被清理
TRIM_MEMORY_MODERATE:内存不足,并且该进程在后台进程列表的中部。
TRIM_MEMORY_BACKGROUND:内存不足,并且该进程是后台进程。
TRIM_MEMORY_UI_HIDDEN:内存不足,并且该进程的UI已经不可见了。
以上4个是4.0增加
TRIM_MEMORY_RUNNING_CRITICAL:内存不足(后台进程不足3个),并且该进程优先级比较高,需要清理内存
TRIM_MEMORY_RUNNING_LOW:内存不足(后台进程不足5个),并且该进程优先级比较高,需要清理内存
TRIM_MEMORY_RUNNING_MODERATE:内存不足(后台进程超过5个),并且该进程优先级比较高,需要清理内存
以上3个是4.1增加
系统也提供了一个ComponentCallbacks2,通过Context.registerComponentCallbacks()注册后,就会被系统回调到。
1.4 OnLowMemory和OnTrimMemory的比较
1,OnLowMemory被回调时,已经没有后台进程;而onTrimMemory被回调时,还有后台进程。
2,OnLowMemory是在最后一个后台进程被杀时调用,一般情况是low memory killer 杀进程后触发;而OnTrimMemory的触发更频繁,每次计算进程优先级时,只要满足条件,都会触发。
3,通过一键清理后,OnLowMemory不会被触发,而OnTrimMemory会被触发一次。
使用举例:
1 @Override 2 public void onTrimMemory(int level) { 3 Log.e(TAG, " onTrimMemory ... level:" + level); 6 } 7 8 @Override 9 public void onLowMemory() { 11 Log.e(TAG, " onLowMemory ... "); 13 }
2.系统回调优化
2.1 回调原理:
在Application、 Activity、Fragement、Service、ContentProvider中都可以重写回调方法,对OnLowMemory/OnTrimMemory进行回调,在回调方法中实现资源释放的实现。
以Activity为例,在Activity源码中能够看到对于onTrimMemory的定义,因此在回调的时候重写方法即可。
public void onTrimMemory(int level) { if (DEBUG_LIFECYCLE) Slog.v(TAG, "onTrimMemory " + this + ": " + level); mCalled = true; mFragments.dispatchTrimMemory(level); }
2.2 释放资源:
在onTrimMemory释放资源,释放图片、数组、缓存等资源。
@Override public void onTrimMemory(int level) { // TODO Auto-generated method stub DLog.d(" onTrimMemory ... level:" + level);switch(level){ case TRIM_MEMORY_UI_HIDDEN: //释放资源 /*编写释放资源代码*/ }break; } super.onTrimMemory(level); }
下面是释放Bitmap的示例代码片段:
// 先判断是否已经回收 if(bitmap != null && !bitmap.isRecycled()){ // 回收并且置为null bitmap.recycle(); bitmap = null; } System.gc();
list占用方法:
list.clear();然后在置空。
3.实现ComponentCallbacks
OnLowMemory除了上述系统提供的API,还可以自己实现ComponentCallbacks,通过API注册,这样也能得到OnLowMemory回调。例如:
public static class ViewComponentCallbacks implements ComponentCallbacks { @Override public void onConfigurationChanged(Configuration arg) { }@Override public void onLowMemory() { //do release operation } }
注册自定义的回调类:
ViewComponentCallbacks callBacks =new ViewComponentCallbacks(); this.registerComponentCallbacks( callBacks );
回调之后,即可进行重写:
@Override public void onLowMemory() { // TODO Auto-generated method stub //释放资源的方法 super.onLowMemory(); }
应用内存onLowMemory onTrimMemory优化相关推荐
- Android 应用内存优化 之 onLowMemory onTrimMemory
OnLowMemory: 是Android提供的API,在系统内存不足,所有后台程序(优先级为background的进程,不是指后台运行的进程)都被杀死时,系统会调用OnLowMemory. OnTr ...
- Android 系统性能优化(41)---Android代码内存优化建议-OnTrimMemory优化
Android代码内存优化建议-OnTrimMemory优化 OnTrimMemory 回调是 Android 4.0 之后提供的一个API,这个 API 是提供给开发者的,它的主要作用是提示开发者在 ...
- 实践App内存优化:如何有序地做内存分析与优化
由于项目里之前线上版本出现过一定比例的OOM,虽然比例并不大,但是还是暴露了一定的问题,所以打算对我们App分为几个步骤进行内存分析和优化,当然内存的优化是个长期的过程,不是一两个版本的事,每个版本都 ...
- Android 内存管理之优化建议
OOM(OutOfMemory)转:http://hukai.me/android-performance-oom/ 前面我们提到过使用getMemoryClass()的方法可以得到Dalvik He ...
- Android内存管理-OnTrimMemory
Application中有两个与内存管理相关的方法:onLowMemory()和 onTrimMemory(int level),源码如下 1 @CallSuper 2 public void onL ...
- 关于mysql内存管理_MYSQL内存管理及优化
MYSQL内存管理及优化 内存是影响数据库性能的主要资源,也是mysql性能优化的一个重要方面: 内存优化的原则 将尽量多的内存分配给mysql做缓存,但是要给操作系统和其他程序的运行预留足够的内存, ...
- 【Linux 内核 内存管理】优化内存屏障 ③ ( 编译器屏障 | 禁止 / 开启内核抢占 与 方法保护临界区 | preempt_disable 禁止内核抢占源码 | 开启内核抢占源码 )
文章目录 一.禁止 / 开启内核抢占 与 方法保护临界区 二.编译器优化屏障 三.preempt_disable 禁止内核抢占 源码 四.preempt_enable 开启内核抢占 源码 一.禁止 / ...
- java内存模型和内存结构_Java内存模型和优化
java内存模型和内存结构 总览 许多多线程代码开发人员都熟悉这样的想法,即不同的线程可以对持有的值有不同的看法,这不是唯一的原因,即如果线程不安全,它可能不会看到更改. JIT本身可以发挥作用. 为 ...
- Java内存模型和优化
总览 许多多线程代码开发人员都熟悉这样的想法,即不同的线程可以对持有的值有不同的看法,这不是唯一的原因,即如果线程不安全,它可能不会看到更改. JIT本身可以发挥作用. 为什么不同的线程看到不同的值? ...
最新文章
- Lua中使用Sleep函数
- python数据处理实例-Python数据分析实例操作
- OneAPM CI与阿里云容器服务集成
- 数据库系统实训——实验六——游标
- 深度可分离卷积Depthwise Separable Convolution
- python数据分类聚类案例_Python实现的KMeans聚类算法实例分析
- 计算机系统自带的文字处理程序,如何使用win7系统电脑的内置字符编辑程序
- 加油吧!数字化转型@网络电视台拿了个“云第一”
- HCIP-RS H12-221-题库包含答案 1-50题(不定期更新剩余题目)
- 人脸对齐 matlab,常用几种人脸对齐算法ASM/AAM/CLM/SDM
- 3、RDD-Single-Stage Rotation-Decoupled Detector for Oriented Object
- Frequent values ——RMQ
- 能同时模拟键盘及鼠标的神器--51单片机可控制
- Linux目录和文件管理——备份与恢复文档(四)
- handle java
- 机器学习常用算法的优缺点总结
- 高通常用缩写 --不错
- MMRotate 全面升级,新增 BoxType 设计
- 程序设计思维与实践第九周作业
- 什么是真正的需求,如何才能找到?
热门文章
- tendermint+java_tendermint简介
- java线程排序_Java中的并发排序
- 一个数三位立方和相加等于本身_【题解信奥】打印水仙花数(粉丝求助)
- html研究中心,seo研究中心 教程:认识HTML、css的重要性-专业SEO技
- java 不知道类名_Java 中获取类名的三种方法,你知道几种?
- C++编程进阶3(如何写出正确的operator=、operator运算符的返回值以及是否应该是成员函数的讨论)
- LMDIF_函数源码
- 计算相机采集帧率C实现
- AprilTag中TAG_16h5识别速率和容错率(VISP)
- 安卓心理测试实训代码_我是如何从测试转到开发的