【Android系统内的进程】Zygote进程的创建

我们都知道,Android的应用程序都需要在Dalvik虚拟机中才能运行,在Android中,每一个应用程序对应一个进程,一个进程就是一个Dalvik虚拟机。

那么有人会想到为什么Google不设置一个全局的Dalvik虚拟机,然后每个应用程序都去使用这个Dalvik虚拟机呢?这样内存内就不需要那么多Dalvik虚拟机,可以减少内存的占用,除去重复的Dalvik。这么说的确没有错,但是我们需要考虑的一点是,任何东西都会有它崩溃的时候,如果只设计一个Dalvik虚拟机,那么一旦这个虚拟机或者其中的程序出现了问题,哪怕只有0.01%的概率,都会导致整个手机内的所有使用这个Dalvik虚拟机的程序崩溃,因为Android程序没有Dalvik虚拟机是没办法运行的。给每个程序一个Dalvik虚拟机虽然占内存,但可以保证每个程序的独立性,一旦有一个程序崩溃了也不会影响到其他程序,这种设计被Google广泛运用,包括Chrome的标签页,我们就可以看到,每一个都是独立的进程。

那么这么设计还有一个问题,如果每个程序都需要一个Dalvik虚拟机,那么如果每个程序启动的时候都启动一个Dalvik虚拟机并初始化它,那么这么做非常影响性能,那么有什么办法能解决这个问题呢?我们都知道手机在启动的时候会有个等待时间,这期间包括内核加载,驱动加载等等,那么在这个启动时间内做额外的操作虽然会加长启动时间,但不会影响到用户的任何使用体验,所以Google额外做了一个处理,就是在启动系统的时候再多启动一个Dalvik虚拟机,一旦手机中有运用程序启动的时候,就复制这个Dalvik虚拟机到自己的空间里就可以了,这样可以有效减少初始化和启动Dalvik虚拟机的速度和资源消耗,而这个Dalvik虚拟机就是Zygote。

Zygote(英文:受精卵)是Android系统中很重要的守护进程,zygote是Android系统中第一个Dalvik虚拟机进程,不过它是空的,并没有程序在里面,它的职责是负责给其他手机中的应用程序赋予Dalvik虚拟机,这个过程叫做孵化(fork)。Zygote在内核启动之后由init进程启动,同时启动的进程还有ServiceManager进程

Zygote启动过程中会创建一个Dalvik虚拟机,然后注册JNI方法,在注册完JNI后,Zygote会启动Java的一些处理工作。

在开启Java的时候,Zygote首先会注册一个Socket,用于接收应用程序的启动请求,随后Zygote会预加载Class资源和Resource资源(包括一些系统的资源图片等等),随后Zygote会创建一个system_server进程,该进程负责启动和管理其他系统服务,如果这个进程启动失败或者内部出错,都会重启Zygote,然后再重新来一遍。

到此为止,Zygote算是该做的事情都做完了,最后的最后,Zygote陷入沉睡中,Zygote在启动完system_server进程后就开始处于无限循环的状态,Zygote最开始注册的socket会等待接收应用程序启动请求后再叫Zygote进行工作。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值