日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關咨詢
選擇下列產(chǎn)品馬上在線溝通
服務時間:8:30-17:00
你可能遇到了下面的問題
關閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
JVM底層原理解析

JVM底層原理解析

作者: 極客重生 2021-07-05 07:51:43

云計算

虛擬化 hi ,大家好,我是極客重生的Alex,今天分享一篇JVM底層原理的文章,希望可以幫助大家了解一下語言虛擬機一些設計原理,不管你當前使用語言是C,C++,Golang,python等,很多思想和原理是相通的,可以借鑒。

目前創(chuàng)新互聯(lián)已為上千家的企業(yè)提供了網(wǎng)站建設、域名、雅安服務器托管、網(wǎng)站托管維護、企業(yè)網(wǎng)站設計、寧城網(wǎng)站維護等服務,公司將堅持客戶導向、應用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長,共同發(fā)展。

本文轉(zhuǎn)載自微信公眾號「極客重生」,作者極客重生。轉(zhuǎn)載本文請聯(lián)系極客重生公眾號。

hi ,大家好,我是極客重生的Alex,今天分享一篇JVM底層原理的文章,希望可以幫助大家了解一下語言虛擬機一些設計原理,不管你當前使用語言是C,C++,Golang,Python等,很多思想和原理是相通的,可以借鑒。

比如之前分析內(nèi)核虛擬機eBPF架構(gòu):

詳細請看:Linux網(wǎng)絡新技術基石 |eBPF and XDP

在本文中,您將學習

  • JVM架構(gòu)
  • 軟件代碼編譯執(zhí)行流程
  • C代碼編譯執(zhí)行過程
  • Java代碼編譯執(zhí)行過程
  • 為什么Java既是解釋型語言又是編譯型語言?
  • 為什么 Java 很慢?

什么是JVM?

Java 虛擬機 (JVM)是提供運行時環(huán)境來驅(qū)動 Java 代碼或應用程序的引擎。它將 Java 字節(jié)碼轉(zhuǎn)換為機器語言。JVM 是 Java 運行環(huán)境 (JRE) 的一部分。在其他編程語言中,編譯器為特定系統(tǒng)生成機器代碼。但是,Java編譯器為稱為Java 虛擬機的虛擬機生成代碼。

JVM的工作原理

首先,Java 代碼被編譯成字節(jié)碼,這個字節(jié)碼在不同的機器上被解釋,在主機系統(tǒng)和 Java 源代碼之間,字節(jié)碼是一種中介語言,Java 中的 JVM 負責分配內(nèi)存空間。

Java 虛擬機 (JVM) 的工作

JVM架構(gòu)

讓我們了解 JVM 的架構(gòu)。Java 中的 JVM 架構(gòu)包含類加載器、內(nèi)存區(qū)、執(zhí)行引擎等。

Java 虛擬機架構(gòu)

1) 類加載器

類加載器是用于加載類文件的子系統(tǒng)。它執(zhí)行三個主要功能,即。加載、鏈接和初始化。

2) 方法區(qū)

JVM 方法區(qū)存儲類結(jié)構(gòu),如元數(shù)據(jù)、常量運行時池和方法代碼。

3) 堆

所有的Objects及其相關的實例變量和數(shù)組都存儲在堆中。此內(nèi)存是通用的,并在多個線程之間共享。

4) JVM 語言棧

Java 語言堆棧存儲局部變量,和部分結(jié)果,每個線程都有自己的 JVM 堆棧,在創(chuàng)建線程時同時創(chuàng)建。每當調(diào)用方法時都會創(chuàng)建一個新的,并在方法調(diào)用過程完成時將其刪除。

5) PC 寄存器

PC 寄存器存儲當前正在執(zhí)行的 Java 虛擬機指令的地址。在 Java 中,每個線程都有其獨立的 PC 寄存器。

6) 本地方法棧

本機方法棧持有本機代碼的指令取決于本機庫。它是用另一種語言而不是 Java 編寫的。

7) 執(zhí)行引擎

它是一種用于測試硬件、軟件或完整系統(tǒng)的軟件。測試執(zhí)行引擎從不攜帶有關被測產(chǎn)品的任何信息。

8) 本地方法接口

本機方法接口是一個編程框架。它允許在 JVM 中運行的 Java 代碼由庫和本機應用程序調(diào)用。

9) 本地方法庫

本機庫是執(zhí)行引擎所需的本機庫(C、C++)的集合。

軟件代碼編譯執(zhí)行流程

為了編寫和執(zhí)行軟件程序,您需要以下內(nèi)容

1) 編輯器 – 要輸入您的程序,可以使用記事本。

2) 編譯器 ——將您的高級語言程序轉(zhuǎn)換為本地機器代碼。

3) 鏈接器 ——將主程序中的不同程序文件引用組合在一起。

4) Loader – 將您的輔助存儲設備(如硬盤、閃存驅(qū)動器、CD )中的文件加載到 RAM 中以供執(zhí)行。執(zhí)行代碼時會自動完成加載。

5) 執(zhí)行– 由您的操作系統(tǒng)和處理器處理的代碼的實際執(zhí)行。

C代碼編譯執(zhí)行過程

了解Java中的Java編譯過程。首先讓我們快速了解一下 C 中的編譯和鏈接過程。

假設在 main 中,您調(diào)用了兩個函數(shù) f1 和 f2。main 函數(shù)存儲在文件 a1.c 中。

函數(shù) f1 存儲在文件 a2.c 中

函數(shù) f2 存儲在文件 a3.c 中

所有這些文件,即 a1.c、a2.c 和 a3.c,都被提供給編譯器。其輸出是相應的目標文件,即機器代碼。

下一步是在鏈接器的幫助下將所有這些目標文件集成到一個 .exe 文件中。鏈接器會將所有這些文件組合在一起并生成 .exe 文件。

在程序運行過程中,加載程序會將 a.exe 加載到 RAM 中執(zhí)行。

Java VM 中的 Java 代碼編譯和執(zhí)行

讓我們看看 JAVA 的編譯執(zhí)行過程。在您的主文件中,您有兩個方法 f1 和 f2。

  • main方法存放在文件a1.java中
  • f1 作為 a2.java 存儲在文件中
  • f2 作為 a3.java 存儲在文件中

編譯器將編譯這三個文件,并生成 3 個對應的 .class 文件,其中包含字節(jié)碼。與 C 不同,沒有進行鏈接。Java VM 或 Java 虛擬機駐留在 RAM 上。在執(zhí)行期間,使用類加載器將類文件帶到 RAM 中。字節(jié)碼已驗證是否存在任何安全漏洞。

接下來,執(zhí)行引擎會將字節(jié)碼轉(zhuǎn)換為本地機器碼。這只是及時編譯,這是Java相對較慢的主要原因之一。

注意:JIT或即時編譯器是 Java 虛擬機 (JVM) 的一部分。它同時轉(zhuǎn)化具有相似功能的部分字節(jié)碼。

為什么Java既是解釋型語言又是編譯型語言?

編程語言被分類為

  • 高級語言,例如C++、Java
  • 中級語言,例如C
  • 低級語言,例如匯編
  • 最后是最低級別的機器語言。

編譯器是一個程序,它把程序從一個級別轉(zhuǎn)化到另外一個級別(一般是從高到低),比如把C++ 程序轉(zhuǎn)化到機器碼。

java編譯器將高級java代碼轉(zhuǎn)換成字節(jié)碼(也是一種機器碼)。

解釋器是一個程序,它把程序轉(zhuǎn)化為相同等級的其他語言,比如把Java程序轉(zhuǎn)換成C++。

在 Java 中,Jit生成器將字節(jié)碼轉(zhuǎn)換為處于相同級別的本機機器代碼,因此,Java 既是編譯型語言,又是解釋型語言。

為什么 Java 很慢?

Java 運行緩慢的兩個主要原因是

動態(tài)鏈接:與 C 不同,鏈接是在運行時完成的,每次程序在 Java 中運行時。

運行時解釋器:字節(jié)碼到本地機器碼的轉(zhuǎn)換是在 Java 運行時完成的,這進一步減慢了速度。

但是,最新版本的 Java 在很大程度上解決了性能瓶頸。

總結(jié):

  • JVM 的完整形式是Java Virtual Machine.(Java虛擬機),Java 中的 JVM 是驅(qū)動 Java 代碼的引擎,它將 Java 字節(jié)碼轉(zhuǎn)換為機器語言。
  • Java 中的 JVM 架構(gòu)包含類加載器、內(nèi)存區(qū)、執(zhí)行引擎等。
  • 在 JVM 中,Java 代碼被編譯為字節(jié)碼。這個字節(jié)碼在不同的機器上被解釋成不同的機器碼。
  • JIT 代表即時編譯器。JIT 是 Java 虛擬機 (JVM) 的一部分。它用于加快執(zhí)行時間。
  • 與其他編譯器機器相比,Java 中的 JVM 執(zhí)行速度可能較慢。

本文題目:JVM底層原理解析
標題網(wǎng)址:http://www.dlmjj.cn/article/dhpecep.html