2 ccbyp ccbyp 于 2013.05.30 10:13 提问

android内存自动清理机制和android垃圾回收器的触发条件

有没有对于android系统有深度了解的朋友能解答几个问题:
1、android内存回收机制的LOW_MEMORY和OUT_OF_MEMORY的触发是什么条件,按照网上一些存在的资料给出的答案,LOW_MEMORY是每隔一段时间自动执行的,而OUT_OF_MEMORY是在系统内存不足的时候进行的,这种说法对吗?如果正确,那么他们回收内存的策略是不是一样的?
2、android任务管理器中,内存的回收是在什么条件下执行的,详细的情况是,测试手机内存512,用户可用内存大概230,目测在50M,20M时都会触发内存回收,也就是50M和20M都是系统的稳定内存,但是有些情况下内存会小于3M仍然没有触发回收,这种回收的触发需要特别条件么?触发回收的代码存在于什么地方?

2个回答

ccbyp
ccbyp   2013.07.04 17:18
已采纳

问题过了好久了,网上查了一些资料自己动手试了试,情况应该如下:
首先要明白android基于linux系统,系统的内存使用规则是不一样的。
windows下的内存管理规则为:退出即销毁,程序的内存会被回收。
linux的内存认为不用白不用,在程序退出后,如果没有新的内存申请,则内存不会被释放,这样下一次运行的时候会提高响应速度。
如此,android设计了low_memory和OUT_OF_MEMORY机制。
low_memory是在程序申请内存的时候报警,然后可以对这个报警进行一些响应,比如释放不用的资源来防止崩溃之类的。在低内存机器中,观察launcher在机器刚开机和运行一段时间后所占内存的大小就能发现,开机的时候内存占用很大,但是随着应用越开越多,占用内存在一步步被释放。
而OOM机制是机器底层的一种强制保鲜,在OOM发生的时候内核会排序强制杀掉进程来保证系统的继续运行,同样这种OOM异常容易发生在低内存机器上,比如512M。
首先系统会根据程序是否是空进程(已经由用户关闭的不带有任何服务和provider的进程),是否有服务,是否有provider,是否为前台进程,来排序,可以输入 adb shell dumpsys meminfo来查看,列出信息中的Total PSS by OOM adjustment:就是系统为程序的OOM排序结果,OOM异常的时候会根据这个表单从下网上杀掉进程释放内存。
OOM的阈值:是机器判定发生OOM的规则,在/kernel/drivers/staging/android/lowmemorykiller.c中可以看到
lowmem_adj[6] 为OOM等级,lowmem_minfree[6]为对应的在系统内存低于多少的时候,adj中高于该等级的活动都要被强制释放。对应的可以修改阈值,完成后编译lk就可以了。
以上就是关于low_memory和OOM的机制和修改

suannai0314
suannai0314 点击左侧的√采纳一下呗
大约 5 年之前 回复
znl_12
znl_12   2013.05.30 16:36

在 android 中每一个应用程序都有固定的内存大小,从设备中改变。比如电话的内存是512,应用程序就会是 30 到 50 mb,如果你的应用程序交叉使用这个内存就会崩溃。
onLowMemory 是activity 中的方法。如果内存低就会通知。就像报警器。
OUT_OF_MEMORY 是异常,你可以处理。
当你处理 bitmap 时,OUT_OF_MEMORY 异常可能发生。
Garbage collector 在android 中是有效的,但是当处理 bitmaps时,在某些情况下它可能会失败。回收bitmap。

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
android内存自动清理机制和android垃圾回收器
本文来自互联网,关于android内存自动清理机制和android垃圾回收器,如有错误还望大家指出
android 内存清理
欢迎转载,转载请注明:http://blog.csdn.net/zhgxhuaa 说明 在上一篇中介绍了“垃圾清理”,在系统优化中有一个功能往往是与垃圾清理分不开的,那就是“手机加速”。目前流行的管理软件中以及网络上并没有明确的定义什么叫“垃圾清理”什么叫“手机加速”。结合上一篇的“垃圾清理”这里统一做一个在本系列文章中的定义: n 垃圾清理:在本系列文章中认
android 内存基本原理和机制管理
java语言相对于c/c++语言来说人性化的一点就是java有专门管理回收的垃圾回收器。而c/c++语言只能是“谁造成,谁处理”。GC1,GC是垃圾收集的意思(Gabage Collection) 2,Java提供的GC功能可以自动监测对象是否超过作用域从而达到自动回收内存的目的。 3,Java语言没有提供释放已分配内存的显示操作方法。垃圾回收原理垃圾回收器通常是作为一个单独的低级别的线程运行
Android 一键加速(内存清理、缓存清理) 源码
http://download.csdn.net/detail/yyh352091626/9196107 基于 LeBron_Six 源码修改,先前的代码只能在Android studio上运行,这几天发了点时间移植到eclipse ,只留下了内存清理和缓存清理。其他的都屏蔽了,如果需要开放其他功能可以用对比工具,开启其它功能。本人也是积分不够,赚点积分而已,希望各位勿喷,Thanks! 由于时间有限,我就不做博客了,用现存的 ,功能如网站所示:http://m.codesocang.com/gn/xiangmu/24473.html 注: 这个并没有真正杀死后台应用,如果想杀死,请用 ActivityManager mActivityManager = (ActivityManager) getApplicationContext().getSystemService(Context.ACTIVITY_SERVICE); Method method = Class.forName("android.app.ActivityManager").getMethod("forceStopPackage",String.class); method.invoke(mActivityManager, pkgList[j]); // packageName是需要强制停止的应用程序包名
Android清理内存
Android内存清理,利用ActivityManager获取当前正在运行的进程,清理这些进程释放内存。 可以根据importance的不同来判断前台或后台RunningAppProcessInfo 里面的常量IMOPORTANCE就是上面所说的前台后台,其实IMOPORTANCE是表示这个app进程的重要性,因为系统回收时候,会根据IMOPORTANCE来回收进程的。具体可以去看文档。。
Android内存优化总结【整理】
【前段时间】 一、Android 内存管理 1.1 Dalvik Dalvik虚拟机是Android程序的虚拟机,是Android中Java程序的运行基础。其指令集基于寄存器架构,执行其特有的文件格式——dex字节码来完成对象生命周期管理、堆栈管理、线程管理、安全异常管理、垃圾回收等重要功能。 Dalvik虚拟机的内存大体上可以分为 Java Object Heap、Bit
android垃圾回收器机制
GC是垃圾收集的意思(GabageCollection)。和JAVA一样,Android系统也是由GC来自动回收内存的。android中一个应用的启动,android系统都会为这个应用分配一个dalivk虚拟机,以便这个应用运行在这个独立的虚拟机上,可是一个虚拟机内存大小一般也是限制的(20M左右)。可见,一个应用的运行所申请的内存不可能无限大的。   那我们做android开发时候,就需要
jvm垃圾回收是什么时候触发的? 垃圾回收算法? 都有哪些垃圾回收器
1.1。那究竟GC为我们做了什么操作呢? 1 ,哪些内存需要回收?    2 ,什么时候回收?    3 ,如何回收?     这时候有人就会疑惑了,既然GC 已经为我们解决了这个矛盾,我们还需要学习GC 么?当然当然是肯定的,那究竟什么时候我们还需要用到的呢? 1 ,排查内存溢出    2 ,排查内存泄漏    3 ,性能调优,排查并发瓶颈    1.1.1。JVM怎么判断对象可以回收了?我们知...
java垃圾回收的两个条件
 一、JAVA垃圾回收机制概述在VB、C++等某些程序设计语言中,无论是对象还是动态配置的资源或内存,都必须由程序员自行声明产生和回收,否则其中的资源将不断消耗,造成资源的浪费甚至死机。由于要预先确定占用的内存空间是否应该被回收是非常困难的,这就导致手工回收内存往往是一项复杂而艰巨的工作。因此,当使用这些程序设计语言编程时,程序员不仅要考虑如何实现算法以满足应用,还要花费许多精力考虑合理使
JVM --并发垃圾回收器CMS
1.总体介绍:CMS(Concurrent Mark-Sweep)是以牺牲吞吐量为代价来获得最短回收停顿时间的垃圾回收器。对于要求服务器响应速度的应用上,这种垃圾回收器非常适合。在启动JVM参数加上-XX:+UseConcMarkSweepGC ,这个参数表示对于老年代的回收采用CMS。CMS采用的基础算法是:标记—清除。 2.CMS过程:初始标记(STW initial mark) 并发标记(C