在线视频国产欧美另类,偷拍亚洲一区一区二区三区,日韩中文字幕在线视频,日本精品久久久久中文字幕

<small id="qpqhz"></small>
  • <legend id="qpqhz"></legend>

      <td id="qpqhz"><strong id="qpqhz"></strong></td>
      <small id="qpqhz"><menuitem id="qpqhz"></menuitem></small>
    1. Java虛擬機(jī)是什么

      時(shí)間:2025-05-25 20:05:47 好文 我要投稿
      • 相關(guān)推薦

      Java虛擬機(jī)是什么

        什么是Java虛擬機(jī)

        作為一個(gè)Java程序員,我們每天都在寫Java代碼,我們寫的代碼都是在一個(gè)叫做Java虛擬機(jī)的東西上執(zhí)行的。但是如果要問什么是虛擬機(jī),恐怕很多人就會(huì)模棱兩可了。在本文中,我會(huì)寫下我對(duì)虛擬機(jī)的理解。因?yàn)槟芰λ蓿赡苡行┑胤矫枋龅牟粔蚯樊?dāng)。如果你有不同的理解,歡迎交流。

        我們都知道Java程序必須在虛擬機(jī)上運(yùn)行。那么虛擬機(jī)到底是什么呢?先看網(wǎng)上搜索到的比較靠譜的解釋:

        虛擬機(jī)是一種抽象化的計(jì)算機(jī),通過在實(shí)際的計(jì)算機(jī)上仿真模擬各種計(jì)算機(jī)功能來實(shí)現(xiàn)的。Java虛擬機(jī)有自己完善的硬體架構(gòu),如處理器、堆棧、寄存器等,還具有相應(yīng)的指令系統(tǒng)。JVM屏蔽了與具體操作系統(tǒng)平臺(tái)相關(guān)的信息,使得Java程序只需生成在Java虛擬機(jī)上運(yùn)行的目標(biāo)代碼(字節(jié)碼),就可以在多種平臺(tái)上不加修改地運(yùn)行。

        這種解釋應(yīng)該算是正確的,但是只描述了虛擬機(jī)的外部行為和功能,并沒有針對(duì)內(nèi)部原理做出說明。一般情況下我們不需要知道虛擬機(jī)的運(yùn)行原理,只要專注寫java代碼就可以了,這也正是虛擬機(jī)之所以存在的原因--屏蔽底層操作系統(tǒng)平臺(tái)的不同并且減少基于原生語言開發(fā)的復(fù)雜性,使java這門語言能夠跨各種平臺(tái)(只要虛擬機(jī)廠商在特定平臺(tái)上實(shí)現(xiàn)了虛擬機(jī)),并且簡(jiǎn)單易用。這些都是虛擬機(jī)的外部特性,但是從這些信息來解釋虛擬機(jī),未免太籠統(tǒng)了,無法讓我們知道內(nèi)部原理。

        從進(jìn)程的角度解釋JVM

        讓我們嘗試從操作系統(tǒng)的層面來理解虛擬機(jī)。我們知道,虛擬機(jī)是運(yùn)行在操作系統(tǒng)之中的,那么什么東西才能在操作系統(tǒng)中運(yùn)行呢?當(dāng)然是進(jìn)程,因?yàn)檫M(jìn)程是操作系統(tǒng)中的執(zhí)行單位。可以這樣理解,當(dāng)它在運(yùn)行的時(shí)候,它就是一個(gè)操作系統(tǒng)中的進(jìn)程實(shí)例,當(dāng)它沒有在運(yùn)行時(shí)(作為可執(zhí)行文件存放于文件系統(tǒng)中),可以把它叫做程序。

        對(duì)命令行比較熟悉的同學(xué),都知道其實(shí)一個(gè)命令對(duì)應(yīng)一個(gè)可執(zhí)行的二進(jìn)制文件,當(dāng)敲下這個(gè)命令并且回車后,就會(huì)創(chuàng)建一個(gè)進(jìn)程,加載對(duì)應(yīng)的可執(zhí)行文件到進(jìn)程的地址空間中,并且執(zhí)行其中的指令。下面對(duì)比C語言和Java語言的HelloWorld程序來說明問題。

        首先編寫C語言版的HelloWorld程序。

        [cpp] view plain copy#include

        #include

        int main(void) {

        printf("hello world

        ");

        return 0;

        }

        編譯C語言版的HelloWorld程序:

        [plain] view plain copygcc HelloWorld.c -o HelloWorld

        運(yùn)行c語言版的HelloWorld程序:

        [plain] view plain copyzhangjg@linux:/deve/workspace/HelloWorld/src$ ./HelloWorld

        hello world

        gcc編譯器編譯后的文件直接就是可操作系統(tǒng)識(shí)別的二進(jìn)制可執(zhí)行文件,當(dāng)我們?cè)诿钚兄星孟?./HelloWorld這條命令的時(shí)候, 直接創(chuàng)建一個(gè)進(jìn)程, 并且將可執(zhí)行文件加載到進(jìn)程的地址空間中, 執(zhí)行文件中的指令。

        作為對(duì)比, 我們看一下Java版HelloWord程序的編譯和執(zhí)行形式。

        首先編寫源文件HelloWord.java :

        [java] view plain copypublic class HelloWorld {

        public static void main(String[] args) {

        System.out.println("HelloWorld");

        }

        }

        編譯Java版的HelloWorld程序:

        [java] view plain copyzhangjg@linux:/deve/workspace/HelloJava/src$ javac HelloWorld.java

        zhangjg@linux:/deve/workspace/HelloJava/src$ ls

        HelloWorld.class HelloWorld.java

        運(yùn)行Java版的HelloWorld程序:

        [plain] view plain copyzhangjg@linux:/deve/workspace/HelloJava/src$ java -classpath . HelloWorld

        HelloWorld

        從上面的過程可以看到, 我們?cè)谶\(yùn)行Java版的HelloWorld程序的時(shí)候, 敲入的命令并不是 ./HelloWorld.class 。 因?yàn)閏lass文件并不是可以直接操作系統(tǒng)識(shí)別的二進(jìn)制可執(zhí)行文件 。 我們敲入的是java這個(gè)命令。 這個(gè)命令說明, 我們首先啟動(dòng)的是一個(gè)叫做java的程序, 這個(gè)java程序在運(yùn)行起來之后就是一個(gè)JVM進(jìn)程實(shí)例。

        上面的命令執(zhí)行流程是這樣的:

        java命令首先啟動(dòng)虛擬機(jī)進(jìn)程,虛擬機(jī)進(jìn)程成功啟動(dòng)后,讀取參數(shù)“HelloWorld”,把他作為初始類加載到內(nèi)存,對(duì)這個(gè)類進(jìn)行初始化和動(dòng)態(tài)鏈接(關(guān)于類的初始化和動(dòng)態(tài)鏈接會(huì)在后面的博客中介紹),然后從這個(gè)類的main方法開始執(zhí)行。也就是說我們的class文件不是直接被系統(tǒng)加載后直接在cpu上執(zhí)行的,而是被一個(gè)叫做虛擬機(jī)的進(jìn)程托管的。首先必須虛擬機(jī)進(jìn)程啟動(dòng)就緒,然后由虛擬機(jī)中的類加載器加載必要的class文件,包括jdk中的基礎(chǔ)類(如String和Object等),然后由虛擬機(jī)進(jìn)程解釋class字節(jié)碼指令,把這些字節(jié)碼指令翻譯成本機(jī)cpu能夠識(shí)別的指令,才能在cpu上運(yùn)行。

        從這個(gè)層面上來看,在執(zhí)行一個(gè)所謂的java程序的時(shí)候,真真正正在執(zhí)行的是一個(gè)叫做Java虛擬機(jī)的進(jìn)程,而不是我們寫的一個(gè)個(gè)的class文件。這個(gè)叫做虛擬機(jī)的進(jìn)程處理一些底層的操作,比如內(nèi)存的分配和釋放等等。我們編寫的class文件只是虛擬機(jī)進(jìn)程執(zhí)行時(shí)需要的“原料”。這些“原料”在運(yùn)行時(shí)被加載到虛擬機(jī)中,被虛擬機(jī)解釋執(zhí)行,以控制虛擬機(jī)實(shí)現(xiàn)我們java代碼中所定義的一些相對(duì)高層的操作,比如創(chuàng)建一個(gè)文件等,可以將class文件中的信息看做對(duì)虛擬機(jī)的控制信息,也就是一種虛擬指令。

        編程語言也有自己的原理, 學(xué)習(xí)一門語言, 主要是把它的原理搞明白。 看似一個(gè)簡(jiǎn)單的HelloWorld程序, 也有很多深入的內(nèi)容值得剖析。

      【Java虛擬機(jī)是什么】相關(guān)文章:

      Java架構(gòu)師的職責(zé)02-27

      Java架構(gòu)師的具體職責(zé)09-23

      【優(yōu)選】Java架構(gòu)師的職責(zé)02-27

      Java初級(jí)開發(fā)工程師的職責(zé)05-28

      中級(jí)Java開發(fā)工程師的職責(zé)08-26

      Java高級(jí)開發(fā)工程師的基本職責(zé)03-15

      Java中高級(jí)開發(fā)工程師的職責(zé)08-26

      生命是什么09-08

      幸福是什么08-21