ccbyp 2013-05-30 02:13 采纳率: 100%
浏览 9012
已采纳

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 2013-07-04 09: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的机制和修改

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥30 这是哪个作者做的宝宝起名网站
  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!