Dalvik虛擬機(jī)運(yùn)行在linux操作系統(tǒng)之上。Linux操作系統(tǒng)并沒(méi)有純粹的線程概念,只要兩個(gè)進(jìn)程共享一個(gè)地址空間,那么就可以認(rèn)為它們是同一個(gè)進(jìn)程的兩個(gè)線程。Linux系統(tǒng)提供了兩個(gè)fork和clone調(diào)用,其中,前者是用來(lái)創(chuàng)建進(jìn)程的,而后者是用來(lái)創(chuàng)建線程的。
一般來(lái)說(shuō),虛擬機(jī)的進(jìn)程和線程都是和目標(biāo)機(jī)器本地操作系統(tǒng)的進(jìn)程和線程一一對(duì)應(yīng)的,這樣的好處是可以使本地操作系統(tǒng)來(lái)調(diào)度進(jìn)程和線程。
每個(gè)Android應(yīng)用程序進(jìn)程都有一個(gè)Dalvik虛擬機(jī)實(shí)例。這樣做得好處是Android應(yīng)用程序進(jìn)程之間不會(huì)互相影響,也就是說(shuō),一個(gè)Android應(yīng)用程序進(jìn)程的意外終止,不會(huì)影響到其他的應(yīng)用程序進(jìn)程的正常運(yùn)行。
每個(gè)Android應(yīng)用程序進(jìn)程都是由一種稱為Zygote的進(jìn)程fork出來(lái)的。Zygote進(jìn)程是由init進(jìn)程啟動(dòng)起來(lái)的,也就是在系統(tǒng)啟動(dòng)的時(shí)候啟動(dòng)的。Zygnote進(jìn)程在啟動(dòng)的時(shí)候,會(huì)創(chuàng)建一個(gè)虛擬機(jī)實(shí)例,并且在這個(gè)虛擬機(jī)實(shí)例將所有的java核心庫(kù)都加載起來(lái)。每當(dāng)Zygote進(jìn)程需要?jiǎng)?chuàng)建一個(gè)Android應(yīng)用程序進(jìn)程的時(shí)候,它就通過(guò)復(fù)制自身來(lái)實(shí)現(xiàn),也就是通過(guò)fork系統(tǒng)調(diào)用來(lái)實(shí)現(xiàn)。這些被fork出來(lái)的Android應(yīng)用程序進(jìn)程,一方面是復(fù)制了Zygote進(jìn)程中的虛擬機(jī)實(shí)例,另外一方面是與Zygote進(jìn)程共享了同一套Java核心庫(kù)。這樣不僅Android程序進(jìn)程的創(chuàng)建很快,而且所有的應(yīng)用程序都共享同一套Java核心庫(kù)而節(jié)省了內(nèi)存空間。
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注