色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線(xiàn)課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
电子发烧友
开通电子发烧友VIP会员 尊享10大特权
海量资料免费下载
精品直播免费看
优质内容免费畅学
课程9折专享价
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

由淺入深的了解Java虛擬機(jī)

我快閉嘴 ? 來(lái)源:集賢網(wǎng) ? 作者:Linkey bpm ? 2020-01-01 17:50 ? 次閱讀

說(shuō)到Java虛擬機(jī),相信作為Java程序員的小伙伴們都不陌生,他們每天都在寫(xiě)Java代碼,寫(xiě)的代碼都是在一個(gè)叫做Java虛擬機(jī)的東西上執(zhí)行的。但是如果要問(wèn)什么是虛擬機(jī),恐怕很多人就會(huì)模棱兩可了。

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

虛擬機(jī)是一種抽象化的計(jì)算機(jī),通過(guò)在實(shí)際的計(jì)算機(jī)上仿真模擬各種計(jì)算機(jī)功能來(lái)實(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)行。

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

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

讓我們嘗試從操作系統(tǒng)的層面來(lái)理解虛擬機(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)它沒(méi)有在運(yùn)行時(shí)(作為可執(zhí)行文件存放于文件系統(tǒng)中),可以把它叫做程序。

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

由淺入深的了解Java虛擬機(jī)

首先編寫(xiě)C語(yǔ)言版的HelloWorld程序。

編譯C語(yǔ)言版的HelloWorld程序:gcc HelloWorld.c-o HelloWorld

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

zhangjg 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í)行形式。

首先編寫(xiě)源文件HelloWord.java :

由淺入深的了解Java虛擬機(jī)

編譯Java版的HelloWorld程序:

zhangjg linux:/deve/workspace/HelloJava/src$javac HelloWorld.java

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

HelloWorld.class HelloWorld.java

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

zhangjg linux:/deve/workspace/HelloJava/src$java-classpath.HelloWorld

HelloWorld

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

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

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

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

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

JVM體系結(jié)構(gòu)簡(jiǎn)介

為了展示虛擬機(jī)進(jìn)程和class文件的關(guān)系,特意畫(huà)了下面一張圖:

根據(jù)上圖表達(dá)的內(nèi)容,編譯之后的class文件是作為Java虛擬機(jī)的原料被輸入到Java虛擬機(jī)的內(nèi)部的,那么具體由誰(shuí)來(lái)做這一部分工作呢?其實(shí)在Java虛擬機(jī)內(nèi)部,有一個(gè)叫做類(lèi)加載器的子系統(tǒng),這個(gè)子系統(tǒng)用來(lái)在運(yùn)行時(shí)根據(jù)需要加載類(lèi)。注意上面一句話(huà)中的“根據(jù)需要”四個(gè)字。在Java虛擬機(jī)執(zhí)行過(guò)程中,只有他需要一個(gè)類(lèi)的時(shí)候,才會(huì)調(diào)用類(lèi)加載器來(lái)加載這個(gè)類(lèi),并不會(huì)在開(kāi)始運(yùn)行時(shí)加載所有的類(lèi)。就像一個(gè)人,只有餓的時(shí)候才去吃飯,而不是一次把一年的飯都吃到肚子里。一般來(lái)說(shuō),虛擬機(jī)加載類(lèi)的時(shí)機(jī),在第一次使用一個(gè)新的類(lèi)的時(shí)候。本專(zhuān)欄后面的文章會(huì)具體討論Java中的類(lèi)加載器。

由虛擬機(jī)加載的類(lèi),被加載到Java虛擬機(jī)內(nèi)存中之后,虛擬機(jī)會(huì)讀取并執(zhí)行它里面存在的字節(jié)碼指令。虛擬機(jī)中執(zhí)行字節(jié)碼指令的部分叫做執(zhí)行引擎。就像一個(gè)人,不是把飯吃下去就完事了,還要進(jìn)行消化,執(zhí)行引擎就相當(dāng)于人的腸胃系統(tǒng)。在執(zhí)行的過(guò)程中還會(huì)把各個(gè)class文件動(dòng)態(tài)的連接起來(lái)。關(guān)于執(zhí)行引擎的具體行為和動(dòng)態(tài)鏈接相關(guān)的內(nèi)容也會(huì)在本專(zhuān)欄后續(xù)的文章中進(jìn)行討論。

我們知道,Java虛擬機(jī)會(huì)進(jìn)行自動(dòng)內(nèi)存管理。具體說(shuō)來(lái)就是自動(dòng)釋放沒(méi)有用的對(duì)象,而不需要程序員編寫(xiě)代碼來(lái)釋放分配的內(nèi)存。這部分工作由垃圾收集子系統(tǒng)負(fù)責(zé)。

從上面的論述可以知道,一個(gè)Java虛擬機(jī)實(shí)例在運(yùn)行過(guò)程中有三個(gè)子系統(tǒng)來(lái)保障它的正常運(yùn)行,分別是類(lèi)加載器子系統(tǒng),執(zhí)行引擎子系統(tǒng)和垃圾收集子系統(tǒng)。如下圖所示:

虛擬機(jī)的運(yùn)行,必須加載class文件,并且執(zhí)行class文件中的字節(jié)碼指令。它做這么多事情,必須需要自己的空間。就像人吃下去的東西首先要放在胃中。虛擬機(jī)也需要空間來(lái)存放個(gè)中數(shù)據(jù)。首先,加載的字節(jié)碼,需要一個(gè)單獨(dú)的內(nèi)存空間來(lái)存放;一個(gè)線(xiàn)程的執(zhí)行,也需要內(nèi)存空間來(lái)維護(hù)方法的調(diào)用關(guān)系,存放方法中的數(shù)據(jù)和中間計(jì)算結(jié)果;在執(zhí)行的過(guò)程中,無(wú)法避免的要?jiǎng)?chuàng)建對(duì)象,創(chuàng)建的對(duì)象需要一個(gè)專(zhuān)門(mén)的內(nèi)存空間來(lái)存放。

總結(jié):

1虛擬機(jī)并不神秘,在操作系統(tǒng)的角度看來(lái),它只是一個(gè)普通進(jìn)程。

2這個(gè)叫做虛擬機(jī)的進(jìn)程比較特殊,它能夠加載我們編寫(xiě)的class文件。如果把JVM比作一個(gè)人,那么class文件就是我們吃的食物。

3加載class文件的是一個(gè)叫做類(lèi)加載器的子系統(tǒng)。就好比我們的嘴巴,把食物吃到肚子里。

4虛擬機(jī)中的執(zhí)行引擎用來(lái)執(zhí)行class文件中的字節(jié)碼指令。就好比我們的腸胃,對(duì)吃進(jìn)去的食物進(jìn)行消化。

5虛擬機(jī)在執(zhí)行過(guò)程中,要分配內(nèi)存創(chuàng)建對(duì)象。當(dāng)這些對(duì)象過(guò)時(shí)無(wú)用了,必須要自動(dòng)清理這些無(wú)用的對(duì)象。清理對(duì)象回收內(nèi)存的任務(wù)由垃圾收集器負(fù)責(zé)。就好比人吃進(jìn)去的食物,在消化之后,必須把廢物排出體外,騰出空間可以在下次餓的時(shí)候吃飯并消化食物。

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 計(jì)算機(jī)
    +關(guān)注

    關(guān)注

    19

    文章

    7626

    瀏覽量

    90104
  • JAVA
    +關(guān)注

    關(guān)注

    20

    文章

    2984

    瀏覽量

    106784
  • 源代碼
    +關(guān)注

    關(guān)注

    96

    文章

    2950

    瀏覽量

    67807
  • 虛擬機(jī)
    +關(guān)注

    關(guān)注

    1

    文章

    962

    瀏覽量

    28996
收藏 0人收藏

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    請(qǐng)問(wèn)QTE可以同幾種JAVA虛擬機(jī)集成

    《嵌入式linux應(yīng)用開(kāi)發(fā)完全手冊(cè)》第500頁(yè)中有講:“QTE可以同幾種JAVA虛擬機(jī)集成。JAVA程序可以基于QTE的工作平臺(tái)上運(yùn)行,提供同源程序相同的效果”我就是想請(qǐng)問(wèn),是否有那個(gè)版本的QTE是有帶
    發(fā)表于 05-24 05:45

    淺談Java虛擬機(jī)的研究與移植

    Kaffe移植的關(guān)鍵技術(shù)及方案基于ST20嵌入式系統(tǒng)的Java虛擬機(jī)研究與移植
    發(fā)表于 04-25 09:49

    Java虛擬機(jī)介紹

    什么是JVM?Java虛擬機(jī)Java Virtual Machine, JVM)實(shí)際上是一個(gè)類(lèi)似于真實(shí)計(jì)算機(jī)系統(tǒng)的抽象機(jī)(Abstract Computing Machine),它擁
    發(fā)表于 04-10 16:15 ?0次下載

    Java虛擬機(jī)向ARM平臺(tái)的移植

    介紹Java 虛擬機(jī)的概念,以常用的KVM 為例,講述了將Java 虛擬機(jī)移植到ARM 平臺(tái)的方法,重點(diǎn)介紹了移植過(guò)程中的編譯選項(xiàng)。
    發(fā)表于 09-23 11:54 ?38次下載

    Java虛擬機(jī)向ARM平臺(tái)的移植

    介紹Java 虛擬機(jī)的概念,以常用的KVM 為例,講述了將Java 虛擬機(jī)移植到ARM 平臺(tái)的方法,重點(diǎn)介紹了移植過(guò)程中的編譯選項(xiàng)。
    發(fā)表于 09-23 11:54 ?22次下載

    微軟java虛擬機(jī)下載

    微軟java虛擬機(jī)下載:Java虛擬機(jī)(JVM)是Java Virtual Machine的縮寫(xiě),它是一個(gè)虛構(gòu)出來(lái)的計(jì)算機(jī),是通過(guò)在實(shí)際的計(jì)
    發(fā)表于 02-26 08:26 ?38次下載

    Java虛擬機(jī)基礎(chǔ)

    JVM基礎(chǔ)----java虛擬機(jī)的學(xué)習(xí)內(nèi)容。
    發(fā)表于 10-30 10:21 ?0次下載

    深入JAVA虛擬機(jī)

    深入JAVA虛擬機(jī)
    發(fā)表于 03-19 11:24 ?1次下載

    JAVA虛擬機(jī)的體系結(jié)構(gòu)及基本類(lèi)型

    JAVA虛擬機(jī)的體系結(jié)構(gòu) 下圖是JAVA虛擬機(jī)的結(jié)構(gòu)圖,每個(gè)Java虛擬機(jī)都有一個(gè)類(lèi)裝載子系統(tǒng),
    發(fā)表于 09-27 11:30 ?0次下載
    <b class='flag-5'>JAVA</b><b class='flag-5'>虛擬機(jī)</b>的體系結(jié)構(gòu)及基本類(lèi)型

    Java虛擬機(jī)參數(shù)調(diào)優(yōu)

    隨著JAVA在應(yīng)用系統(tǒng)級(jí)的項(xiàng)目開(kāi)發(fā)中的使用越來(lái)越廣泛,虛擬機(jī)、垃圾收集、熱點(diǎn)編譯、J2EE等新技術(shù)層出不窮,JAVA作為系統(tǒng)級(jí)開(kāi)發(fā)的一個(gè)選擇的優(yōu)勢(shì)也越來(lái)越明顯,在此同時(shí)其不能完全編譯、垃圾收集等與生
    發(fā)表于 04-03 11:29 ?1次下載

    Aion正式推出了一個(gè)建立在流行的Java虛擬機(jī)的基礎(chǔ)上的新虛擬機(jī)

    Aion的首席執(zhí)行官M(fèi)atthew Spoke表示,更廣泛采用區(qū)塊鏈的障礙之一是開(kāi)發(fā)人員缺乏用Java等公共語(yǔ)言的工具。該公司認(rèn)為,如果能在使用多年的Java虛擬機(jī)(JVM)上專(zhuān)門(mén)為區(qū)塊鏈構(gòu)建一個(gè)
    發(fā)表于 06-17 10:59 ?819次閱讀

    Java:JVM虛擬機(jī)的入門(mén)知識(shí)

    Java開(kāi)發(fā)現(xiàn)在面試越來(lái)越難了,進(jìn)大廠(chǎng)必備的JVM、多線(xiàn)程高并發(fā)這都是最基礎(chǔ)的知識(shí)了,今天我們一起來(lái)學(xué)習(xí)Java虛擬機(jī)入門(mén)。
    的頭像 發(fā)表于 07-01 11:43 ?2454次閱讀
    <b class='flag-5'>Java</b>:JVM<b class='flag-5'>虛擬機(jī)</b>的入門(mén)知識(shí)

    一文帶你了解虛擬機(jī)

    今天的許多前沿技術(shù),如云計(jì)算、邊緣計(jì)算和微服務(wù),都源于虛擬機(jī)的概念——將操作系統(tǒng)和軟件實(shí)例從底層物理計(jì)算機(jī)中分離出來(lái)。 ? ? ? 什么是虛擬機(jī)虛擬機(jī)指通過(guò)軟件模擬的具有完整硬件系統(tǒng)功能的、運(yùn)行
    的頭像 發(fā)表于 01-17 15:52 ?3912次閱讀

    Java入手如何了解虛擬機(jī)(VM)

    虛擬機(jī)的設(shè)計(jì)架構(gòu)有兩種: 基于求值棧、基于寄存器,如果從更大的范圍可以認(rèn)為只要實(shí)現(xiàn)了功能的都可以認(rèn)為是虛擬機(jī),通過(guò)直接遍歷AST得到結(jié)果的也可以算一種虛擬機(jī)
    的頭像 發(fā)表于 03-03 10:00 ?1187次閱讀
    從<b class='flag-5'>Java</b>入手如何<b class='flag-5'>了解</b><b class='flag-5'>虛擬機(jī)</b>(VM)

    深入淺出地介紹Java虛擬機(jī)的相關(guān)知識(shí)

    Java 虛擬機(jī)Java Virtual Machine,簡(jiǎn)稱(chēng) JVM)是 Java 語(yǔ)言最核心的技術(shù)之一,也是 Java 開(kāi)發(fā)者必須掌握
    的頭像 發(fā)表于 06-06 14:49 ?3632次閱讀
    主站蜘蛛池模板: 超级乱淫片午夜电影网99 | 国产麻豆精品久久一二三 | 污污内射久久一区二区欧美日韩 | 曰本少妇高潮久久久久久 | 国产色婷婷亚洲99麻豆 | 久久久久久久尹人综合网亚洲 | 狠狠色狠狠色综合曰曰 | 亚洲一卡二卡三卡四卡2021麻豆 | 99精品国产高清自在线看超 | 久久久国产精品免费A片蜜芽广 | 九九热国产视频 | 丰满的美女射精动态图 | 视频一区二区三区蜜桃麻豆 | 久久se视频精品视频在线 | 久久99国产精品二区不卡 | 国产人在线成免费视频 | 久久一本综合 | 在线观看免费国产成人软件 | 永久免费在线观看视频 | 桃隐社区最新最快地址 | 国产精品免费大片一区二区 | 亚洲国产AV精品卡一卡二 | 射死你天天日 | 体育生爆操 | 国产欧美一区二区三区在线看 | 精品国产乱码久久久久久免费 | 久久久97人妻无码精品蜜桃 | 野花社区视频WWW高清 | 我的好妈妈8高清在线观看WWW | 精油按摩日本 | 8x8x我要打机飞在线观看 | 韩国演艺圈悲惨在线 | 俄罗斯雏妓的BBB孩交 | 久久精品国产亚洲精品2020 | 午夜国产福利 | 青春禁区动漫免费观看 | 中文字幕1 | 国产自产第一区c国产 | 日本高清片免费观看 | AV精品爆乳纯肉H漫网站 | 国产AV一区二区三区传媒 |

    電子發(fā)燒友

    中國(guó)電子工程師最喜歡的網(wǎng)站

    • 2931785位工程師會(huì)員交流學(xué)習(xí)
    • 獲取您個(gè)性化的科技前沿技術(shù)信息
    • 參加活動(dòng)獲取豐厚的禮品