之前在做一个内存优化的时候,使用到了MemoryFile,由此发现了MemoryFile的一些特性以及一个非常trickly的使用方法,因此在这里记录一下

What is it

MemoryFile是android在最开始就引入的一套框架,其内部实际上是封装了android特有的内存共享机制Ashmem匿名共享内存,简单来说,Ashmem在Android内核中是被注册成一个特殊的字符设备,Ashmem驱动通过在内核的一个自定义slab缓冲区中初始化一段内存区域,然后通过mmap把申请的内存映射到用户的进程空间中(通过tmpfs),这样子就可以在用户进程中使用这里申请的内存了,另外,Ashmem的一个特性就是可以在系统内存不足的时候,回收掉被标记为”unpin”的内存,这个后面会讲到,另外,MemoryFile也可以通过Binder跨进程调用来让两个进程共享一段内存区域。由于整个申请内存的过程并不再Java层上,可以很明显的看出使用MemoryFile申请的内存实际上是并不会占用Java堆内存的。MemoryFile暴露出来的用户接口可以说跟他的名字一样,基本上跟我们平时的文件的读写基本一致,也可以使用InputStream和OutputStream来对其进行读写等操作:

MemoryFile memoryFile = new MemoryFile(null, inputStream.available());

memoryFile.allowPurging(false);

OutputStream outputStream = memoryFile.getOutputStream();

outputStream.write(1024);

上面可以看到allowPurging这个调用,这个就是之前说的”pin”和”unpin”,在设置了allowPurging为false之后,这个MemoryFile对应的Ashmem就会被标记成”pin”,那么即使在android系统内存不足的时候,也不会对这段内存进行回收。另外,由于Ashmem默认都是”unpin”的,因此申请的内存在某个时间点内都可能会被回收掉,这个时候是不可以再读写了。

Tricks

MemoryFile是一个非常trickly的东西,由于并不占用Java堆内存,我们可以将一些对象用MemoryFile来保存起来避免GC,另外,这里可能android上有个BUG:

在4.4及其以上的系统中,如果在应用中使用了MemoryFile,那么在dumpsys meminfo的时候,可以看到多了一项Ashmem的值:

可以看出来虽然MemoryFile申请的内存不计入Java堆也不计入Native堆中,但是占用了Ashmem的内存,这个实际上是算入了app当前占用的内存当中

但是在4.4以下的机器中时,使用MemoryFile申请的内存居然是不算入app的内存中的:

而且这里我也算过,也是不算入Native Heap中的,另外,这个时候去系统设置里面看进程的内存占用,也可以看出来其实并没有计入Ashmem的内存的。这个应该是android的一个BUG,但是我搜了一下并没有搜到对应的issue,搞不好这里也可能是一个feature。

而在大名鼎鼎的Fresco当中,他们也有用到这个bug来避免在decode bitmap的时候,将文件的字节读到Java堆中,使用了MemoryFile,并利用了这个BUG然这部分内存不算入app中,这里分别对应了Fresco中的GingerbreadPurgeableDecoder和KitKatPurgeableDecoder,Fresco在decode图片的时候会在4.4和4.4以下的系统中分别使用这两个不同的decoder。从这个地方可以看出来,使用MemoryFile,在4.4以下的系统当中,可以帮我们的app额外”偷”一些内存,并且可以不计入app的内存当中

Summary

这里主要是简单介绍了MemoryFile的基本原理和用法,并且阐述了一个MemoryFile中一个可以帮助开发者”偷”内存的地方,这个是一个非常trickly的方法,虽然4.4以下使用这块的内存并不计入进程当中,但是并不推荐大量使用,因为当设置了allowPurging为false的时候,这个对应的Ashmem内存区域是被”pin”了,那么在android系统内存不足的时候,是不能够把这段内存区域回收的,如果长时间没有释放的话,这样子相当于无端端占用了大量手机内存而又无法回收,那对系统的稳定性肯定会造成影响

References

Android系统匿名共享内存Ashmem(Anonymous Shared Memory)驱动程序源代码分析

Android Kernel Features(Ashmem)

加入GAD的核心用户QQ群:484290331,各类活动奖励任你拿,最新资讯任你读,众多教学任你免费学,如此好地方赶紧加入吧!另VR专属群:476511561,专业VR技术分享,专业导师指导为你答疑解惑,大型小型活动奖励等你拿,免费学习赚奖励的天地,欢迎你加入哟!

android 游戏内存,如何「偷」Android 的内存?相关推荐

  1. android seekto实现_「seekto」android MediaPlayer 的SeekTo 方法 - seo实验室

    seekto Android使用 mediaplayer 播放video视频过程中, 当用户退出当前播放,再从后台恢复播放时,需要跳转到之前退出的时间点继续播放. 使用的方法基本都是 seekto 之 ...

  2. 不禁网页的浏览器_网页游戏兴衰史:「农场」没有菜,「渣渣辉」不贪玩

    本文经授权转载自 | 国家人文历史 ID |gjrwls 作者 |巴里安 200X年某月某日凌晨2点50,小明悄悄打开房门,蹑手蹑脚地走进存放笔记本电脑的房间,将拔下电源的电脑抱紧在怀里,悄悄地回了房 ...

  3. 营收下滑,腾讯游戏还能保持「王者」地位吗?

    作者 | 曾响铃 文 | 响铃说 国内游戏市场,面临发展瓶颈.腾讯游戏这个「行业巨头」也未能幸免. 最新财报数据显示,二季度腾讯游戏本土与海外市场总营收约为425亿,相比去年同期(营收430亿)和今年 ...

  4. android 9坚果r1,「旗舰」坚果R1开箱,红蓝荧光照亮细细的红线

    「旗舰」坚果R1开箱,红蓝荧光照亮细细的红线 2018-06-29 21:03:21 8点赞 8收藏 6评论 5月15日,锤子科技在鸟巢正式宣布旗下的硬件产品中文将统一以[坚果]为名,并发布了旗舰机型 ...

  5. 格志日志 android,GitHub - SaintAdrian/GridDiary: 格志日记Android版,用「自问」的形式引导自己写日记。...

    格志日记 为什么要开发这个软件? 日记,大概是一个人最忠实的朋友.开心的时候,可以和它分享:难过的时候,可以向它倾诉:就算日子如水一般平淡地匆匆而过, 至少也有它帮你记住那些繁杂和琐碎,那些声希味淡和 ...

  6. java arrayadapter_「arrayadapter」Android之ArrayAdapter(数组适配器)的三种方法 - seo实验室...

    arrayadapter arrayadapter数组适配器用于绑定格式单一的数据,数据源可以是集合或者数组 列表视图(listview)以垂直的形式列出需要显示的列表项. 实现过程:新建适配器-&g ...

  7. android 游戏降低画质6,怎么改善Android游戏的画质?

    Android的游戏画质在此前的一系列文章中已经讨论过不少了,有关于不同GPU在游戏中表现的差异,有Android和iPhone的游戏画质对比.本文要讨论的则是关于如何提高Android游戏画质的问题 ...

  8. android image 位移动画_「translateanimation」Android 补间动画之平移动画TranslateAnimation - seo实验室...

    translateanimation 博客导航: 1.介绍: Android补间动画之平移动画,在实际的开发过程中,其实有好多地方需要用到平移动画,这是对于平移动画的简单介绍. 2.属性 durati ...

  9. android wifi传图片,「教程」将Mac电脑上的照片无线传到安卓手机上

    还在寻找Mac苹果电脑与安卓手机如何无线互传照片的方法吗?今天就与小伙伴们分享一种最简单的方法,只需下载一款锤子开发的HandShaker免费软件即可. 1.首先我们需要先安装一款软件,目前比较好用的 ...

最新文章

  1. lwip之数据收发流程_2
  2. 干!一张图整理了 Python 所有内置异常
  3. 计算机和电子音乐之间的关系,浅析计算机音乐中算法作曲的特点及及作曲技法的对应关系.doc...
  4. c语言程序位置式pid算法,增量式与位置式PID算法(C语言实现与电机控制项目)...
  5. Luogu P3975 [TJOI2015]弦论
  6. Swagger2的使用
  7. STM32线缆综合测试系统
  8. Android开发笔记(六十三)HTTP访问的通信方式
  9. 我的创作纪念日——文章汇总
  10. 魔兽争霸---------常见简称
  11. 2021 智慧养老整体解决方案
  12. [日推荐]『识花草』做个辛勤的小园丁
  13. 盘点互联网招聘玩法:从垂直招聘到猎头平台到精准匹配
  14. JAVA后端工程师笔试题-避坑公司
  15. 竟有比双十一更令人发指的福利……
  16. 护眼灯买什么样的好?这几款2022年最佳的护眼灯值得一看!
  17. 科普贴,告诉大家SGLTE、SVLTE、CSFB、SRLTE的意思
  18. java.lang.ClassCastException: java.util.Arrays$ArrayList cannot be cast to java.util.ArrayList
  19. 联想电脑自带记事本软件如何设置提醒
  20. CMU论文—Hadoop’s Adolescence(0-3页)

热门文章

  1. 。iod_IOD '09,第二天:Maria Winans谈信息主导的即时通讯转型
  2. [转帖]AMD第三代锐龙处理器首发评测:i9已无力招架
  3. SAP SuccessFactors EC学习笔记(二)解码员工数据对象
  4. 四维图新总经理孙玉国谈导航
  5. 8月30日科技联播:子弹短信总激活用户超过400万,亚马逊将成第2个万亿美元市值企业...
  6. 使用Hadoop MapReduce进行大数据分析
  7. 展讯走出困境开始爬坡
  8. 跬步至千里:揭秘谷歌AutoML背后的渐进式搜索技术
  9. 【微信群助手】微信社群怎么运营?微信群规则范本
  10. EAUML日拱一卒 用例包含关系