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

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

由淺入深的了解Java虛擬機

我快閉嘴 ? 來源:集賢網 ? 作者:Linkey bpm ? 2020-01-01 17:50 ? 次閱讀

說到Java虛擬機,相信作為Java程序員的小伙伴們都不陌生,他們每天都在寫Java代碼,寫的代碼都是在一個叫做Java虛擬機的東西上執行的。但是如果要問什么是虛擬機,恐怕很多人就會模棱兩可了。

我們都知道java程序必須在虛擬機上運行。那么虛擬機到底是什么呢?先看網上搜索到的比較靠譜的解釋:

虛擬機是一種抽象化的計算機,通過在實際的計算機上仿真模擬各種計算機功能來實現的。Java虛擬機有自己完善的硬體架構,如處理器、堆棧、寄存器等,還具有相應的指令系統。JVM屏蔽了與具體操作系統平臺相關的信息,使得Java程序只需生成在Java虛擬機上運行的目標代碼(字節碼),就可以在多種平臺上不加修改地運行。

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

從進程的角度解釋JVM

讓我們嘗試從操作系統的層面來理解虛擬機。我們知道,虛擬機是運行在操作系統之中的,那么什么東西才能在操作系統中運行呢?當然是進程,因為進程是操作系統中的執行單位。可以這樣理解,當它在運行的時候,它就是一個操作系統中的進程實例,當它沒有在運行時(作為可執行文件存放于文件系統中),可以把它叫做程序。

對命令行比較熟悉的同學,都知道其實一個命令對應一個可執行的二進制文件,當敲下這個命令并且回車后,就會創建一個進程,加載對應的可執行文件到進程的地址空間中,并且執行其中的指令。下面對比C語言和Java語言的HelloWorld程序來說明問題。

由淺入深的了解Java虛擬機

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

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

運行C語言版的HelloWorld程序:

zhangjg linux:/deve/workspace/HelloWorld/src$./HelloWorld

hello world

gcc編譯器編譯后的文件直接就是可被操作系統識別的二進制可執行文件,當我們在命令行中敲下。/HelloWorld這條命令的時候,直接創建一個進程,并且將可執行文件加載到進程的地址空間中,執行文件中的指令。

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

首先編寫源文件HelloWord.java :

由淺入深的了解Java虛擬機

編譯Java版的HelloWorld程序:

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

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

HelloWorld.class HelloWorld.java

運行Java版的HelloWorld程序:

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

HelloWorld

從上面的過程可以看到,在運行Java版的HelloWorld程序的時候,敲入的命令并不是。/HelloWorld.class。因為class文件并不是可以直接被操作系統識別的二進制可執行文件。我們敲入的是java這個命令。這個命令說明,我們首先啟動的是一個叫做java的程序,這個java程序在運行起來之后就是一個JVM進程實例。

上面的命令執行流程是這樣的:

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

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

編程語言也有自己的原理,學習一門語言,主要是把它的原理搞明白。看似一個簡單的HelloWorld程序,也有很多深入的內容值得剖析。

JVM體系結構簡介

為了展示虛擬機進程和class文件的關系,特意畫了下面一張圖:

根據上圖表達的內容,編譯之后的class文件是作為Java虛擬機的原料被輸入到Java虛擬機的內部的,那么具體由誰來做這一部分工作呢?其實在Java虛擬機內部,有一個叫做類加載器的子系統,這個子系統用來在運行時根據需要加載類。注意上面一句話中的“根據需要”四個字。在Java虛擬機執行過程中,只有他需要一個類的時候,才會調用類加載器來加載這個類,并不會在開始運行時加載所有的類。就像一個人,只有餓的時候才去吃飯,而不是一次把一年的飯都吃到肚子里。一般來說,虛擬機加載類的時機,在第一次使用一個新的類的時候。本專欄后面的文章會具體討論Java中的類加載器。

由虛擬機加載的類,被加載到Java虛擬機內存中之后,虛擬機會讀取并執行它里面存在的字節碼指令。虛擬機中執行字節碼指令的部分叫做執行引擎。就像一個人,不是把飯吃下去就完事了,還要進行消化,執行引擎就相當于人的腸胃系統。在執行的過程中還會把各個class文件動態的連接起來。關于執行引擎的具體行為和動態鏈接相關的內容也會在本專欄后續的文章中進行討論。

我們知道,Java虛擬機會進行自動內存管理。具體說來就是自動釋放沒有用的對象,而不需要程序員編寫代碼來釋放分配的內存。這部分工作由垃圾收集子系統負責。

從上面的論述可以知道,一個Java虛擬機實例在運行過程中有三個子系統來保障它的正常運行,分別是類加載器子系統,執行引擎子系統和垃圾收集子系統。如下圖所示:

虛擬機的運行,必須加載class文件,并且執行class文件中的字節碼指令。它做這么多事情,必須需要自己的空間。就像人吃下去的東西首先要放在胃中。虛擬機也需要空間來存放個中數據。首先,加載的字節碼,需要一個單獨的內存空間來存放;一個線程的執行,也需要內存空間來維護方法的調用關系,存放方法中的數據和中間計算結果;在執行的過程中,無法避免的要創建對象,創建的對象需要一個專門的內存空間來存放。

總結:

1虛擬機并不神秘,在操作系統的角度看來,它只是一個普通進程。

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

3加載class文件的是一個叫做類加載器的子系統。就好比我們的嘴巴,把食物吃到肚子里。

4虛擬機中的執行引擎用來執行class文件中的字節碼指令。就好比我們的腸胃,對吃進去的食物進行消化。

5虛擬機在執行過程中,要分配內存創建對象。當這些對象過時無用了,必須要自動清理這些無用的對象。清理對象回收內存的任務由垃圾收集器負責。就好比人吃進去的食物,在消化之后,必須把廢物排出體外,騰出空間可以在下次餓的時候吃飯并消化食物。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 計算機
    +關注

    關注

    19

    文章

    7488

    瀏覽量

    87849
  • JAVA
    +關注

    關注

    19

    文章

    2966

    瀏覽量

    104701
  • 源代碼
    +關注

    關注

    96

    文章

    2945

    瀏覽量

    66730
  • 虛擬機
    +關注

    關注

    1

    文章

    914

    瀏覽量

    28160
收藏 人收藏

    評論

    相關推薦

    請問QTE可以同幾種JAVA虛擬機集成

    《嵌入式linux應用開發完全手冊》第500頁中有講:“QTE可以同幾種JAVA虛擬機集成。JAVA程序可以基于QTE的工作平臺上運行,提供同源程序相同的效果”我就是想請問,是否有那個版本的QTE是有帶
    發表于 05-24 05:45

    淺談Java虛擬機的研究與移植

    Kaffe移植的關鍵技術及方案基于ST20嵌入式系統的Java虛擬機研究與移植
    發表于 04-25 09:49

    Java虛擬機介紹

    什么是JVM?Java虛擬機Java Virtual Machine, JVM)實際上是一個類似于真實計算機系統的抽象(Abstract Computing Machine),它擁
    發表于 04-10 16:15 ?0次下載

    Java虛擬機向ARM平臺的移植

    介紹Java 虛擬機的概念,以常用的KVM 為例,講述了將Java 虛擬機移植到ARM 平臺的方法,重點介紹了移植過程中的編譯選項。
    發表于 09-23 11:54 ?38次下載

    Java虛擬機向ARM平臺的移植

    介紹Java 虛擬機的概念,以常用的KVM 為例,講述了將Java 虛擬機移植到ARM 平臺的方法,重點介紹了移植過程中的編譯選項。
    發表于 09-23 11:54 ?22次下載

    微軟java虛擬機下載

    微軟java虛擬機下載:Java虛擬機(JVM)是Java Virtual Machine的縮寫,它是一個虛構出來的計算機,是通過在實際的計
    發表于 02-26 08:26 ?38次下載

    Java虛擬機基礎

    JVM基礎----java虛擬機的學習內容。
    發表于 10-30 10:21 ?0次下載

    深入JAVA虛擬機

    深入JAVA虛擬機
    發表于 03-19 11:24 ?1次下載

    JAVA虛擬機的體系結構及基本類型

    JAVA虛擬機的體系結構 下圖是JAVA虛擬機的結構圖,每個Java虛擬機都有一個類裝載子系統,
    發表于 09-27 11:30 ?0次下載
    <b class='flag-5'>JAVA</b><b class='flag-5'>虛擬機</b>的體系結構及基本類型

    Java虛擬機參數調優

    隨著JAVA在應用系統級的項目開發中的使用越來越廣泛,虛擬機、垃圾收集、熱點編譯、J2EE等新技術層出不窮,JAVA作為系統級開發的一個選擇的優勢也越來越明顯,在此同時其不能完全編譯、垃圾收集等與生
    發表于 04-03 11:29 ?1次下載

    Aion正式推出了一個建立在流行的Java虛擬機的基礎上的新虛擬機

    Aion的首席執行官Matthew Spoke表示,更廣泛采用區塊鏈的障礙之一是開發人員缺乏用Java等公共語言的工具。該公司認為,如果能在使用多年的Java虛擬機(JVM)上專門為區塊鏈構建一個
    發表于 06-17 10:59 ?757次閱讀

    Java:JVM虛擬機的入門知識

    Java開發現在面試越來越難了,進大廠必備的JVM、多線程高并發這都是最基礎的知識了,今天我們一起來學習Java虛擬機入門。
    的頭像 發表于 07-01 11:43 ?2304次閱讀
    <b class='flag-5'>Java</b>:JVM<b class='flag-5'>虛擬機</b>的入門知識

    一文帶你了解虛擬機

    今天的許多前沿技術,如云計算、邊緣計算和微服務,都源于虛擬機的概念——將操作系統和軟件實例從底層物理計算機中分離出來。 ? ? ? 什么是虛擬機虛擬機指通過軟件模擬的具有完整硬件系統功能的、運行
    的頭像 發表于 01-17 15:52 ?2824次閱讀

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

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

    深入淺出地介紹Java虛擬機的相關知識

    Java 虛擬機Java Virtual Machine,簡稱 JVM)是 Java 語言最核心的技術之一,也是 Java 開發者必須掌握
    的頭像 發表于 06-06 14:49 ?3410次閱讀
    主站蜘蛛池模板: 国产午夜小视频| 美女穿丝袜被狂躁动态图| 免费鲁丝片一级在线观看| 日本无码人妻丰满熟妇5G影院| 亚洲AV无码乱码A片无码蜜桃| 中文字幕日本一区| 国产成人精品免费视频大| 老师我好爽再深一点老师好涨| 三级黄在线播放| 在线免费观看a视频| 99久久精品免费看国产一区二区三区 | 99国内偷揿国产精品人妻| 国产精品免费观看视频播放| 老湿影院色情a| 午夜亚洲精品不卡在线| a免费视频| 久久99热这里只有精品66| 涩里番app黄版网站| 91se在线看片国产免费观看| 国产手机在线亚洲精品观看| 暖暖视频免费观看高清完整版| 99久久免费精品国产免费| 国产最新地址| 我和妽妽在厨房里的激情区二区 | se01短视频在线观看| 葵司中文第一次大战黑人| 亚洲精品国产第一区第二区| 国产大片51精品免费观看| 全免费A敌肛交毛片免费懂色AV| 69SEX久久精品国产麻豆| 久久视频在线视频观看天天看视频| 亚洲精品第一国产综合| 思思re热免费精品视频66| H揉捏娇喘乳叫床NP调教视频| 美女张开腿让男人桶爽无弹窗| 孕妇bbwbbwbbwbbw超清| 精品无码国产自产在线观看水浒传| 亚洲成A人片在线观看中文L| 国产色无码精品视频国产| 午夜家庭影院| 国产喷水1区2区3区咪咪爱AV|