Android应用程序进程的最大heap内存的问题

如有错误,欢迎指正!

Android官方文档提到,在默认情况下,每个Android应用都是一个独立的进程,Android又是基于Linux系统,那么有一个问题,那就是Android系统为每个应用进程所能分配的最大内存是多少?

目前的Android是32位Linux系统,如果按照传统的32位Linux的内存分配规则,那么Android的单个进程可以最大分配到4G内存,但是Android显然不是按照传统的Linux的内存规则来为应用进程分配内存。

这个问题要先从Android应用进程的构成来分析。

在Android中的进程分为两类:Native进程和Java进程。

Native进程:采用C/C++实现,不包含VM实例的Linux进程,/system/bin/目录下的程序文件运行后都是Native进程。

Java进程:Java的运行依赖于VM,而VM必须要寄宿在Native进程中,所以Java进程实际上就是一个Native进程,只是Native进程中多了一个VM实例而已,而VM有自己独立的内存分配规则,因此Java进程的内存分配要比Native进程复杂。而Android应用绝大多数都是Java进程。

Java进程默认情况下只能使用VM中的heap内存空间,在使用JNI的情况下可以使用Native进程中的heap内存空间。其中,VM中heap内存空间的值是有限制的,在Android系统中,我们可以通过查看/system/build.prop文件来获取VM的heap的内存空间的阈值。



dalvik.vm.heapstartsize=16m
dalvik.vm.heapgrowthlimit=192m
dalvik.vm.heapsize=512m


dalvik.vm.heapstartsize,该参数用来设置一个Java进程的VM的heap的初始大小。即一个Android应用在启动时就会分配到该阈值大小的VM的heap内存。

dalvik.vm.heapgrowthlimit,该参数用来设置一个Java进程在默认情况下能使用的最大VM的heap的大小。即一个Android应用在使用完dalvik.vm.heapstartsize大小的VM的heap内存后,VM会继续分配heap内存,但是不会超过dalvik.vm.heapgrowthlimit所设置的阈值大小。

dalvik.vm.heapsize,该参数设置VM所能使用的最大的heap的内存大小。即一个Android应用程序在开启largeHeap后,所能使用到的最大的VM的heap的大小,但不会超过该阈值。

通过上面的分析,我们可以清楚地知道,在默认情况下,Android应用程序在启动后分配到的内存大小是dalvik.vm.heapstartsize控制的,可以使用的最大内存空间是由dalvik.vm.heapgrowthlimit所控制,在应用程序开启largeHeap后,可以使用的最大内存控件是由dalvik.vm.heapsize控制。

随着应用程序的功能越来越丰富,对内存的消耗也越来越大,VM的heap往往不能满足需求,那就需要使用别的途径来获取更多的内存,JNI和多进程就是比较有效的方式。JNI能够绕开VM的heap内存限制,直接使用Native的heap内存,理论上可以榨干RAM。多进程则是将各个应用程序的组件运行在不同的进程中,这样就能同时使用多个VM的heap。当然,也可以将JNI和多进程结合起来使用。

猜你喜欢

转载自blog.csdn.net/yumeizui8923/article/details/79376969