美文网首页Android知识进阶
Android内存管理机制

Android内存管理机制

作者: 34sir | 来源:发表于2018-02-26 14:29 被阅读24次

每开一个应用就会打开一个独立的虚拟机

进程种类

  • 前台进程(foreground)
    目前正在屏幕上显示的进程和一些系统进程
  • 可见进程(visible)
    不在前台,但用户依然可见的进程
  • 桌面进程(home app)即launcher
  • 次要服务(secondary server)
  • 后台进程(hidden)
  • 内容供应节点(content provider)
  • 空进程(empty)

执行条件
剩余内存小于应用定义的APP_MEM值,开始查看adj值列表,kill相应程序

内存管理机制

内存共享

每一个appprocess都是从同一个被叫做Zygote的进程中fork出来的,大多数的RAM pages被用来分配给framework的代码与资源,并在应用的所有进程中进行共享

分配与回收内存

  • 每一个进程的Dalvik heap都有一个限制的虚拟内存范围
  • 逻辑上讲的heap size和实际物理上使用的内存数量是不等的
  • Dalvik heap与逻辑上的heap size不吻合,这意味着Android并不会去做heap中的碎片整理用来关闭空闲区域

限制应用的内存

Android为每一个app都设置了一个硬性的heap size限制,如果你的app已经到了heap的限制大小并且再尝试分配内存的话,会引起OutOfMemoryError的错误
通过getMemoryClass()来查询 heap size

切换应用

Android并不会在用户切换不同应用时候做交换内存的操作。Android会把那些不包含foreground组件的进程放到LRU cache
当系统开始进入低内存状态时,它会由系统根据LRU的规则与其他因素选择杀掉某些进程

如何进行进程管理?

  • ActivityManager.getRunningAppProcesses方法,就可以获取到正在运行的进程列表
  • 遍历整个进程列表,我们可以获取进程的信息RunningAppProcessInfo info,我们可以直接通过进程信息对象的成员变量获取其中的信息,代码如下:
info.processName //当前进程的应用包名
info.pid  //进程id号
  • 通过进程的id号,我们就可以获取进程的内存占用等信息,当然我们需要一个PackageManager对象,代码如下:
PackageManager pm = ctx.getPackageManager();
int[] pids = new int[]{info.pid};
//根据进程id获取memInfo,传递几个id就会给几个memoryInfo
MemoryInfo[] memInfo = am.getProcessMemoryInfo(pids );
memInfo[0].getTotalPrivateDirty();//获取当前进程"弄脏的"占用的内存数,该方法返回的内存大小是以KB为单位的
  • 通过包管理器和相应的包名我们又可以获取到应用程序的信息,代码如下:
Drawable icon = pm.getApplicationIcon(packageName);//获取当前进程的Icon
ApplicationInfo appInfo = pm.getApplicationInfo(packageName, 0);
String appName = appInfo.loadLabel(pm).toString();//进程名称
if((appInfo.flags & ApplicationInfo.FLAG_SYSTEM)!=0){//通过应用的flags值与系统flag按位相与可以知道当前应用是否为系统应用
taskInfo.setSysProc(true);//系统进程
}else{
taskInfo.setSysProc(false);//用户进程
}

通过判断应用程序是否是系统应用,来判断当前进程是否为系统进程

  • 当然这其中会有一些小问题,由于某些进程应用是使用C语言写的,我们无法获取到应用的图标,也无法获取到当前应用的应用名称,我们只能使用包名代替应用名称,而图标我们自己定义一个特定的图标即可.处理代码如下:
taskInfo.setIcon(ctx.getResources().getDrawable(R.drawable.ic_launcher));
taskInfo.setAppName(packageName);
taskInfo.setSysProc(true);//我们一般将C语言程序定义为系统程序
  • 如何清理进程
    只需要使用ActivityManager的杀死后台进程的方法即可,代码如下:
am.killBackgroundProcesses(taskInfo.getPackageName()); //只能清理掉后台进程

该方法只能清理掉后台进程,前台进程/可见进程/系统进程是无法清理的
其他方式
锁屏自动清理,这时我们就需要开启服务,并在服务中注册一个屏幕锁定的广播接收者,当收到锁屏广播时清理进程

相关文章

  • Android内存管理机制

    Android内存管理机制 [转载自大果仁Pareto的 android内存管理机制] 1、基于Linux内存管理...

  • Android 开发进阶之『清除应用中的内存泄漏』

    Android 内存管理机制 Android 的内存管理机制可以简单概括为:系统没有为内存提供交换区,它使用 pa...

  • Android 系统内存管理机制

    系列文章Java 内存模型Android 系统内存管理机制Android 性能优化(三)之内存管理Android ...

  • Java 内存模型- JMM

    系列文章Java 内存模型Android 系统内存管理机制Android 性能优化(三)之内存管理Android ...

  • Android内存管理机制

    Android内存管理机制的定义 内存的分配 内存的回收 管理机制的说明 管理的内存对象 进程 对象 变量 管理的...

  • android内存管理

    内存管理机制概述 Android 的内存管理机制可以简单概括为:系统没有为内存提供交换区,它使用 paging (...

  • Android 内存优化

    Android 内存管理机制 内存管理 进程(由Application FrameWork和Linux内核管理) ...

  • Android内存优化

    Android内存管理机制 优化内存的意义 内存分析工具 避免内存泄露 优化内存空间未完待续

  • 内存管理

    一、内存管理机制概述 1.分配机制 2.回收机制 二、Android内存管理机制 1.分配机制 根据物理手机的内存...

  • Android避免OOM(内存优化)

    Android内存优化是性能优化很重要的一部分,而如何避免OOM又是内存优化的核心。 Android内存管理机制 ...

网友评论

    本文标题:Android内存管理机制

    本文链接:https://www.haomeiwen.com/subject/ukhyxftx.html