虚拟内存分配
创始人
2024-02-18 23:54:10
0

开发 Android 应用时,并不需要我们自己去分配内存,直接 new 一个对象,声明一个变量或者常量即可,也不需要我们自己去做释放,但所有的数据都需要内存,这些都是虚拟机帮我们做。虚拟机分配申请内存主要使用的是 malloc() 函数,它是 C 语言库的一个标准函数。

void *malloc(size_t size)

malloc 函数是一个 C 语言库的函数,所以它分配内存最终还是得调用 Linux 系统提供的函数,让 Linux 内核去帮我们申请一块内存。内核会调用 mmap() 函数,在堆中分配我们想要的内存空间大小。 mmap() 函数是 Linux 系统一个很重要的函数,我们需要深刻认识它。

void *mmap(void *addr,size_t length,int prot,int flags,int fd, off_t offset);
  • 参数 addr 指向欲映射的内存起始地址,通常设为 NULL,代表让系统自动选定地址,映射成功后返回该地址;
  • 参数 length 表示将文件中多大的部分映射到内存; 参数 prot 指定映射区域的读写权限;
  • 参数 flags 指定映射时的特性,如是否允许其他进程映射这段内存;
  • 参数 fd 指定映射内存的文件描述符;
  • 参数 offset 指定映射位置的偏移量,一般为 0。

mmap 函数有 2 种用法:

1.映射磁盘文件到用户空间中;
2.匿名映射,不映射磁盘文件,而是向映射区申请一块内存,此时的 fd 入参传 -1。

第 1 种用法可以让我们读文件的效率更高(比如 Android 读取 dex 文件就是通过 mmap 来提高读取速度),也可以用来实现数据跨进程传输(比如 Android 共享内存机制、Binder 通信都是通过 mmap 来实现的)。malloc() 函数使用了 mmap 函数的第 2 种用法,即在 Heap 区域中申请一块内存。

需要注意的,这里申请的内存都是虚拟内存,并且这个时候并不会分配真正的物理内存,只有当我们真正要往这块虚拟内存区域写入数据时,操作系统检查到对应的虚拟内存没有映射到物理内存,便会发生缺页中断,然后分配一块同样大小的物理内存,并建立映射关系。这是一种懒加载技术,也是内存优化的方案之一。

相关内容

热门资讯

资本界金控(00204.HK)... 格隆汇7月2日丨资本界金控(00204.HK)公告,公司近期与江苏福万代科技信息有限公司("福万代"...
新希望:独立董事彭龙接受纪律审... 转自:财联社【新希望:独立董事彭龙接受纪律审查和监察调查】财联社7月2日电,新希望公告,公司独立董事...
3岁萌娃迷路街头,妈妈急疯!两... 来源:杭州公安 “你好 我在天万街与羊头坝路交叉口的桥上 这边有个小孩子找不到家人一直在哭” 6月2...
中考成绩单|低波策略业绩盘点 (转自:国泰基金微幸福)
华菱钢铁:投资者建议连续三年回... 投资者提问:回购注销是财务手段里提升pb最稳定最可靠最有效的方式,在pb回升到1之前,每年分红可以少...
今年前5个月销量排名前十位轿车... 转自:北京商报北京商报讯(记者 刘晓梦)7月2日,据中国汽车工业协会统计分析,今年前5个月,销量排名...
法国已有2人死于热浪 转自:新华社新华社巴黎7月2日电(记者罗毓)法国商业调频电视台2日上午报道,最近该国遭遇强热浪天气,...
赛意信息(300687.SZ)... 格隆汇7月2日丨赛意信息(300687.SZ)公布,截至2025年6月30日,公司通过股份回购专用证...
比亚迪汽车:海洋网累计销售超5... 7月2日,比亚迪汽车官方微博显示,比亚迪海洋网6月热销196766辆,同比增长24.6%。2025年...
能特科技:拟以3亿元-5亿元回... 格隆汇7月2日|能特科技公告,公司拟使用自有资金及自筹资金,本次回购股份将全部用于注销并相应减少注册...