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 点击左侧的√采纳一下呗
4 年多之前 回复
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币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!