应用内存优化之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();
}
时间: 2024-10-19 03:52:05

应用内存优化之OnLowMemory&OnTrimMemory的相关文章

Android代码内存优化建议-OnTrimMemory优化

原文  http://androidperformance.com/2015/07/20/Android代码内存优化建议-OnTrimMemory优化/ OnTrimMemory 回调是 Android 4.0 之后提供的一个API,这个 API 是提供给开发者的,它的主要作用是提示开发者在系统内存不足的时候,通过处理部分资源来释放内存,从而避免被 Android 系统杀死.这样应用在下一次启动的时候,速度就会比较快. 本文通过问答的方式,从各个方面来讲解 OnTrimMemory 回调的使用过

Android代码内存优化建议-Android官方篇

转自:http://androidperformance.com/ http://developer.android.com/intl/zh-cn/training/displaying-bitmaps/index.html 为了使垃圾回收器可以正常释放程序所占用的内存,在编写代码的时候就一定要注意尽量避免出现内存泄漏的情况(通常都是由于全局成员变量持有对象引用所导致的),并且在适当的时候去释放对象引用.对于大多数的应用程序而言,后面其它的事情就可以都交给垃圾回收器去完成了,如果一个对象的引用不

Android内存优化之OOM

内容大多都是和OOM有关的实践总结概要.理解错误或是偏差的地方,还请多包涵指正,谢谢!本人Q:1524447071 (一)Android的内存管理机制 Google在Android的官网上有这样一篇文章,初步介绍了Android是如何管理应用的进程与内存分配:http://developer.android.com/training/articles/memory.html. Android系统的Dalvik虚拟机扮演了常规的内存垃圾自动回收的角色,Android系统没有为内存提供交换区,它使用

工作中遇到的Android内存优化问题(1)

最近工作中,遇到了几个内存优化的问题,1.应用退出后,此应用进程保持了不少内存得不到释放,用工具强制gc也无法释放.2.应用进入某些页面瞬间请求分配内存过大.此两个问题对于有经验的开发者很容易猜测一个是内存泄露,一个是图片之类的资源问题.下面来写一个例子分析一下这两个问题 第一个例子是Volley加载图片的app,当此app退出时缓存释放问题 Application类 package demo.memory.com.memorydemo; import android.app.Applicati

App性能优化之内存优化

本文为慕课网<App性能优化之内存优化>课程的学习笔记,视频地址 (http://www.imooc.com/video/13670) ## 如何查看一个app在安卓系统中的内存分配情况? 方法一: 1.启动android studio和虚拟机,建立连接. 2.打开cmd窗口,输入adb shell. 3.输入ps.  4.可以看到有一个name为应用包名的进程,这就是我们的app所在的进程  5.为了具体查看app所在进程的内存使用情况,需输入dumpsys meminfo +包名.  方法

Android内存优化相关

Android的内存管理方式 Android系统内存分配与回收方式 一个APP通常就是一个进程对应一个虚拟机 GC只在Heap剩余空间不够时才去垃圾回收 GC触发时,所有线程都会被暂停!!! APP内存限制机制 每个App分配的最大内存限制,随设备不同而不同 吃内存大户:图片 为什么要限制? 切换应用时后台APP清理机制 APP切换时的LRU Cache LRU算法:最近使用的排在最前面,最少的可能被清理掉 GC时,清理时会执行onTrimMemory()回调方法 Android系统内存分配与回

[转]探索 Android 内存优化方法

前言 这篇文章的内容是我回顾和再学习 Android 内存优化的过程中整理出来的,整理的目的是让我自己对 Android 内存优化相关知识的认识更全面一些,分享的目的是希望大家也能从这些知识中得到一些启发. Android 应用运行在 ART 环境上,ART 是基于 JVM 优化而来的,ART 优化的目标就是为了让 Android 应用能更高效地在 Android 平台运行. 不严谨地说,Android 应用就是一个在 Android 平台运行良好的 Java 程序,承载着 Android 应用

试试SQLSERVER2014的内存优化表

原文:试试SQLSERVER2014的内存优化表 试试SQLSERVER2014的内存优化表 SQL Server 2014中的内存引擎(代号为Hekaton)将OLTP提升到了新的高度. 现在,存储引擎已整合进当前的数据库管理系统,而使用先进内存技术来支持大规模OLTP工作负载. 就算如此,要利用此新功能,数据库必须包含"内存优化"文件组和表 即所配置的文件组和表使用Hekaton技术. 幸运的是,SQL Server 2014使这一过程变得非常简单直接. 要说明其工作原理,我们来创

android内存优化5—对界面UI的优化(2)

在一个应用程序中,一般都会存在多个Activity,每个Activity对应着一个UI布局文件.一般来说,为了保持不同窗口之间的风格统一,在这些UI布局文件中,几乎肯定会用到很多相同的布局.如果我们在每个xml文件中都把相同的布局都重写一遍,一个是代码冗余,可读性很差:另一个是修改起来比较麻烦,对后期的修改和维护非常不利.所以,一般情况下,我们需要把相同布局的代码单独写成一个模块,然后在用到的时候,可以通过<include /> 标签来重用layout的代码. 常见的,有的应用在最上方会有一个