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条)

报告相同问题?

悬赏问题

  • ¥15 matlab生成电测深三层曲线模型代码
  • ¥50 随机森林与房贷信用风险模型
  • ¥50 buildozer打包kivy app失败
  • ¥30 在vs2022里运行python代码
  • ¥15 不同尺寸货物如何寻找合适的包装箱型谱
  • ¥15 求解 yolo算法问题
  • ¥15 虚拟机打包apk出现错误
  • ¥15 用visual studi code完成html页面
  • ¥15 聚类分析或者python进行数据分析
  • ¥15 三菱伺服电机按启动按钮有使能但不动作