问题
在分析 zygote 创建虚拟机的时候,我们说过系统默认设置的 Java 虚拟机堆栈最大为16MB,这个值对于需要使用较大内存的程序(例如图片处理程序)来说远远不够。当然可以修改这个默认值,例如我在Nexus 6P上就将其修改为32MB 了,但这个改动是全局性的,也就是所有的 Java 程序都会是这个 32MB。我们能动态配置这个值吗?
例如:设置一个配置文件,每个进程启动的时候根据配置文件的参数来设置堆大小。实际上是不行的,zygote 是通过fork 来创建子进程的,Zygote 本身设置的信息会被子进程全部继承。
方案
- 为 Dalivk 增加一个函数,这个函数允许动态调整最大堆的大小。
- zygote 通过 fork 子进程后,调用 exec 家族的函数来加载另外一个映像,该映像对应的程序会重新创建虚拟机,重新注册JNI函数,也就是模拟 zygote 创世界中前两天的工作,最后调用android.app.ActivityThread 的 main函数。这种方式应该是可行的但难度较大,而且会影响运行速度。