在分析Zygote创建虚拟机的时候,我们说过系统默认设置的Java虚拟机堆栈最大为16MB,这个值对于需要使用较大内存的程序(例如图片处理程序)来说还远远不够。当然,可以修改这个默认值,例如我的HTC G7就将其修改为32MB了,但是这个改动是全局性的,也就是所有的Java程序都会是这个32MB。我们能动态配置这个值吗?例如: * **设置一个配置文件,每个进程启动的时候根据配置文件的参数来设置堆大小**。 不过正如前面所说,我的这一美好愿望最终破灭了,原因只有一个: * **Zygote是通过fork来创建子进程的,Zygote本身设置的信息会被子进程全部继承,例如Zygote设置的堆栈为16MB,那么它的子进程也是用这个16MB。** 关于这个问题,我目前想到了两个解决方案: * 为Dalivk增加一个函数,这个函数允许动态调整最大堆的大小。 * Zygote通过fork子进程后,调用exec家族的函数来加载另外一个映像,该映像对应的程序会重新创建虚拟机,重新注册JNI函数,也就是模拟Zygote创世界中前两天的工作,最后调用android.app.ActivityThread的main函数。这种方式应该是可行的,但难度较大,而且会影响运行速度。 * * * * * 关于本节所提出的问题,欢迎广大读者踊跃讨论。 * * * * *