安卓虚拟机是如何分配内存的?
1、Android VM的内存空间
Heap初始大小:App启动后,系统分配给它的Heap初始大小,随着App使用可增加。
Heap最大值:默认情况下,App可使用的Heap的最大值,超过这个值就会产生OOM(Out Of Memory)。
largeHeap属性:如果App的manifest文件中配置了largeHeap属性,那么App可使用的Heap的最大值为此项设定值。
2、Android VM内存分配流程
tryMalloc函数:尝试分配内存,如果分配失败且GC正在运行,则等待GC完成后重试;如果GC未运行,则执行foreground GC后重试;如果仍然失败,则尝试扩展Heap并再次分配。
3、垃圾回收机制
分代回收:Android的内存堆是分代的,根据对象的预期寿命和大小跟踪不同的分配存储分区,新生代、老年代和永久代各有其专用上限,当某一代填满时,系统会执行垃圾回收事件以释放内存。
4、共享内存
Zygote进程:每个应用进程都从一个名为Zygote的现有进程分叉,这使得为框架代码和资源分配的大多数RAM页面可在所有应用进程之间共享。
ashmem或gralloc:在进程间共享同一动态RAM,例如窗口surface使用在应用和屏幕合成器之间共享的内存。
5、限制应用内存
硬性上限:为了维持多任务环境的正常运行,Android会为每个应用的堆大小设置硬性上限,不同设备的确切堆大小上限取决于设备的总体可用RAM大小。
6、切换应用
缓存保留:当用户在应用之间切换时,Android会将非前台应用保留在缓存中,这些进程不会退出,而是被系统保留以便快速恢复。
7、内存类型
RAM:就是我们常常听到的手机内存,但通常容量有限,一般高端设备拥有更大的RAM。
zRAM:相当于swap区域是用于交换空间的RAM分区,Android系统没有使用磁盘作为交换空间,而是直接在RAM上开辟了一个单独的区域。
存储器:可以类比磁盘,它包含了很多持久化存储的数据,存储器相比上面两种类型的内存容量要大很多。
8、优化工具
Memory Profiler:Android Studio自带的一个内存检测工具,通过实时图表的方式展示内存信息,具有可以识别内存泄露,内存抖动等现象,并可以将捕获到的内存信息进行堆转储、强制GC以及跟踪内存分配的能力。
9、内存管理策略优化
LargeObjectSpace调整:通过调整Bitmap的内存管理策略以减少虚拟机整体内存使用,从而间接增加了其他内存空间的实际使用范围。
相关问题与解答
Q1: Android中的垃圾回收机制是如何工作的?
A1: Android的垃圾回收机制是基于分代回收的策略,内存堆被分为新生代、老年代和永久代,每一代人都有其专用的内存上限,当某一代填满时,系统会执行垃圾回收事件以释放不再使用的内存,垃圾回收的目标是查找并回收那些程序中将来无法访问的数据对象所占用的资源。
Q2: 如何优化Android应用的内存使用?
A2: 可以通过以下几种方式优化Android应用的内存使用:避免内存泄漏,合理使用数据结构以减少内存消耗,使用Memory Profiler工具监控内存使用情况,以及通过调整Bitmap的内存管理策略来减少虚拟机整体内存使用。
以上内容就是解答有关“安卓虚拟机分配的内存”的详细内容了,我相信这篇文章可以为您解决一些疑惑,有任何问题欢迎留言反馈,谢谢阅读。