中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當前位置: 首頁 > news >正文

wordpress退貨插件北京百度seo排名點擊軟件

wordpress退貨插件,北京百度seo排名點擊軟件,電子商務課程,公司簡介模板表格大家好,我是栗箏i,這篇文章是我的 “栗箏i 的 Java 技術?!?專欄的第 033 篇文章,在 “栗箏i 的 Java 技術?!?這個專欄中我會持續(xù)為大家更新 Java 技術相關全套技術棧內容。專欄的主要目標是已經(jīng)有一定 Java 開發(fā)經(jīng)驗,并希望進…

大家好,我是栗箏i,這篇文章是我的 “栗箏i 的 Java 技術棧” 專欄的第 033 篇文章,在 “栗箏i 的 Java 技術?!?這個專欄中我會持續(xù)為大家更新 Java 技術相關全套技術棧內容。專欄的主要目標是已經(jīng)有一定 Java 開發(fā)經(jīng)驗,并希望進一步完善自己對整個 Java 技術體系來充實自己的技術棧的同學。與此同時,本專欄的所有文章,也都會準備充足的代碼示例和完善的知識點梳理,因此也十分適合零基礎的小白和要準備工作面試的同學學習。當然,我也會在必要的時候進行相關技術深度的技術解讀,相信即使是擁有多年 Java 開發(fā)經(jīng)驗的從業(yè)者和大佬們也會有所收獲并找到樂趣。

在當今的軟件開發(fā)領域,Java 虛擬機(JVM)扮演著至關重要的角色,它不僅是 Java 語言的運行時環(huán)境,也是跨平臺應用的基石。理解 JVM 的原理和功能,對 Java 開發(fā)者來說至關重要。本篇文章將帶你全面了解 JVM 的起源、結構和工作原理,幫助你奠定扎實的基礎,為后續(xù)深入研究 JVM 的各個方面做好準備。


文章目錄

      • 1、對于 Java 虛擬機的認知
        • 1.1、Java 虛擬機(Jvm) 與 Java 語言的關系
        • 1.2、one write run anywhere(一次編寫到處運行)
          • 1.2.1、C 語言的編譯過程
          • 1.2.2、如何理解匯編語言
          • 1.2.3、C 語言為什么不能跨平臺
          • 1.2.4、Java 為什么可以跨平臺
      • 2、Java 虛擬機的基礎知識
        • 2.1、Java 虛擬機概述
        • 2.2、JVM、JRE、JDK的關系
        • 2.3、Java 虛擬機的結構組成


1、對于 Java 虛擬機的認知

1.1、Java 虛擬機(Jvm) 與 Java 語言的關系

在我們系統(tǒng)的認識 Java 虛擬機前,我們應該明確一個事實,即:“Java 虛擬機不和包括 Java 在內的任何一種語言綁定,它只與 ‘Class文件’ 這種特定的二進制文件格式所關聯(lián),Class 文件中包含了 Java 虛擬機指令集和符號表以及若干其他輔助信息”

所以 “Java 虛擬機” 這一命名本身有一定的誤導性,Java 虛擬機和 Java 語言并不存在必要的聯(lián)系,將其稱作 “Class 文件虛擬機” 可以更適合理解。

Java 在 1997 年發(fā)布規(guī)范文檔的時候,也刻意的將 Java 的規(guī)范拆分為《 Java 語言規(guī)范(The Java Language Specification)》與 《Java 虛擬機規(guī)范(The Java Virtual Machine Specification)》兩部分。

Java 語言規(guī)范 & Java 虛擬機規(guī)范:https://docs.oracle.com/javase/specs/

Java 虛擬機是語言無關性的,作為一個通用的、與機器無關的執(zhí)行平臺,任何其他語言的實現(xiàn)都可以將 Java 虛擬機作為其運行的基礎,以 Class 文件作為他們產(chǎn)品的交付媒介。

例如,使用 Java 編譯器可以把 Java 代碼編譯為存儲字節(jié)碼的 Class 文件,使用 JRuby 等其他語言的編譯器一樣可以把它們的源程序代碼編譯成 Class 文件。虛擬機絲毫不關心 Class 的來源是什么語言,它與程序語言之間的關系如圖所示:

Java虛擬機提供的語言無關性

1.2、one write run anywhere(一次編寫到處運行)

在我們初次接觸 Java 時,都不可不避免的了解到,Java 的一個優(yōu)勢,也是 Java 剛推出時的宣傳語:“one write run anywhere(一次編寫到處運行)”,在這句話中,突出了 Java 虛擬機核心的思想,Java 虛擬機是與平臺無關的,或者說 Java 虛擬機具有平臺無關性!

1.2.1、C 語言的編譯過程

既然 Java 虛擬機具有平臺無關性,那么什么是平臺有關性呢,我們先來看一下,C 語言的執(zhí)行過程:

#include <stdio.h>
int main()
{printf("hello world");return 0;
}

這是一個 C 語言的程序,最終的至執(zhí)行結果是打印一行 “hello world” 字符串,我們知道,計算機里的世界里只有 “0” 和 “1”,那以上的 C 程序是如何轉換為 “0” 和 “1” 的呢?

以上 C 程序的編譯過程:

image-20230603161751537

我們分階段來討論:

  • 首先是 “預處理階段” :預處理器(cpp)會將頭文件(# 開頭的行)展開,將宏名替換為字符串,并將注釋去掉;
  • 接下來是 “編譯階段” :編譯器(ccl)將修改后的 .c 文件,翻譯為 .s 文件,即匯編程序;
  • 再然后是 “匯編階段” :匯編器(as)將 .s 文件翻譯成 .o 文件,這就是機器語言指令,二進制文件;
  • 在最后是 “鏈接階段” :鏈接器(ld)將 .o 文件中的函數(shù)庫對應的代碼組合到最終目變文件中,這就是 .out 文件了。
1.2.2、如何理解匯編語言

作為一個插曲,在這里闡述一下筆者對于匯編語言的理解。

什么是匯編語言,其實就是因為計算機只能識得 “0” 和 “1”,在計算機剛被發(fā)明時,科學家們只能通過向計算機輸入 0|1 代碼的方式(通過穿孔紙帶,有孔 1,無孔 0),來運行計算任務,但是這樣的效率實在太慢了,所以匯編語言就被發(fā)明出來,用于簡化程序的編寫。

比如計算 1+1,兩個 “1” 數(shù)據(jù)使用 0x0001 來表示,而 “加” 操作,放在 CPU 中,可以是 0xa90df(這個是胡亂寫的),這個二進制代表的加操作能被計算機識別。而因為這個加操作對于 CPU 來說,編碼的 0xa90df 格式是固定的。所以可以直接一個助記符 add 來表示,這樣科學家們寫程序就方便多了。而這就是匯編程序的由來。因為匯編程序完成之后,可以再有一個專門的程序(就是要上文中所說的匯編器)來把編寫的匯編程序編譯成 “0” 和 “1”,這樣計算機也可以識別了,而匯編語言本身也方便了程序的編寫和閱讀。

編寫匯編比直接編寫二進制方便高效了太多。但是隨著計算任務的復雜,程序的規(guī)模越來越龐大,使用匯編程序也很累啊,那么是否有更簡單的方式呢?所以科學家們發(fā)明了高級語言(比如 C,lisp 等),在編寫程序的時候,使用 C。語言等編寫,然后再使用編譯器將 C 語言程序翻譯成匯編程序,匯編程序再使用匯編器編譯成 “0” 和 “1”,這樣,CPU 能識別的東西沒有變化,但是對于編寫程序的人,確實方便了很多。

通過以上的描述,我們就知道了高級語言的大概由來。也明白了我們所編寫的各種高級語言,到了最后,其實都是轉化為二進制執(zhí)行。

1.2.3、C 語言為什么不能跨平臺

在對匯編語言再一次理解之后,我們回到正題,即為什么 C 語言不具備平臺無關性,或者說為什么 C 語言為什么不能跨平臺。

直接二進制格式的程序,我們稱之為本地機器碼(native code)。而類似那些 add 之類的助記符,以及匯編的編寫格式或標準,我們稱之為指令集。

但是問題的關鍵來了。不同公司所生產(chǎn)的 CPU 芯片。他們所使用的指令集不同啊,這種芯片設計的事情,又不像 TCP/IP 協(xié)議那樣,有國際統(tǒng)一的標準,甚至像 Intel 所代表的復雜指令集,和 ARM 為代表的精簡指令集,它們指令集的設計思路就是不一樣的。

所以我們 C 語言最后編譯出來的的二進制文件,不同的 CPU 上識別的意義是完全不同的。

此外,還有一種場景,就是一段 C 語言的程序,我們編寫一個 .c 的文件后,將其拿到另外一個操作系統(tǒng)|CPU 平臺去執(zhí)行,是否會成功呢?成功了之后那么是否可以說明 C 語言具有跨平臺性呢,很多人存在著不同的看法,對此,筆者是這樣認為的:

  1. C 語言并非不能跨平臺(CPU 或者操作系統(tǒng)),準確的說是 C 語言編譯出的程序無法二進制跨平臺;
  2. 不同環(huán)境下,C 語言的標準有差別,比如不同平臺的 int 類型可能是 16 位表示也可能是 32 位表示,但筆者認為這種情況是可以有多種方式去規(guī)避的,隨意最終的結論還是 C 語言不能跨平臺是特指二進制跨平臺。

那有沒有一種辦法,能夠讓高級語言實現(xiàn)(二進制)跨平臺的運行呢?

思考實際編程中的一個場景,我們前端需要處理的某個數(shù)據(jù)是 A 格式,但是后臺只能提供B格式的數(shù)據(jù),那我們怎么辦?很簡單啊。寫個接口,把 B。格式轉化為 A 格式。這就是設計模式當中的適配器設計模式。

關于跨平臺也是一樣的道理。CPU 的指令集不同, 不同平臺編譯出來的結果格式都不同,那么我們可以在各個平臺上運行虛擬機,然后我們制定某種編譯結果的輸出格式,我們的輸出了某種格式的結果,直接在虛擬機上運行。 這就是 Java 采取的方式。

1.2.4、Java 為什么可以跨平臺

這是 Java 版本的 “Hello World”:

public static void main(String[] args) {System.out.println("Hello World!");
}

這段 Java 程序編譯出來的結果是 hello.class,換句話說,它輸出的結果是 Class 文件格式(也叫字節(jié)碼存儲格式)。

這其實就是 Java 虛擬機定義的二進制格式,這種我們稱之為字節(jié)碼(ByteCode),是 Java 虛擬機所能運行的格式。類似本地機器碼可以反編譯成匯編,這種二進制也可以反編譯成更容易閱讀的格式。

而各個平臺的 Java 虛擬機 是不同的。但是我們編寫的 Java 程序 統(tǒng)一編譯成特定格式的 Class 文件格式,然后 Class 文件可以在各個不同平臺的 Java 虛擬機上運行,當然運行結果肯定也是一致的,至于各個不同平臺之間的差異,這是那些編寫 Java 虛擬機的人去考慮的事情。

通過這種方式,我們的 Java 程序就實現(xiàn)了跨平臺。


2、Java 虛擬機的基礎知識

2.1、Java 虛擬機概述

Java 虛擬機(英語:Java Virtual Machine,縮寫:JVM),一種能夠執(zhí)行 Java 字節(jié)碼(Class 文件)的虛擬機,以堆棧結構機器來進行實做。最早由 Sun 公司所研發(fā)并實現(xiàn)第一個實現(xiàn)版本,是 Java 平臺的一部分,能夠執(zhí)行以 Java 語言所寫的軟件程序。

Java 虛擬機有自己完善的硬體架構,如處理器、堆棧、寄存器等,還具有相應的指令系統(tǒng)。JVM 屏蔽了與具體操作系統(tǒng)平臺相關的信息,使得 Java 程序只需生成在 Java 虛擬機上運行的目標代碼(字節(jié)碼),就可以在多種平臺上不加修改地運行。通過對中央處理器(CPU)所執(zhí)行的軟件實現(xiàn),實現(xiàn)能執(zhí)行編譯過的 Java 程序碼(Applet 與應用程序)。

作為一種編程語言的虛擬機,實際上不只是專用于 Java 語言,只要生成的編譯文件符合 JVM 對加載編譯文件格式要求,任何語言都可以由 JVM 編譯運行。此外,除了甲骨文,也有其他開源或閉源的實現(xiàn)。

2.2、JVM、JRE、JDK的關系

JVM 是 Java 程序能夠運行的核心。但需要注意,JVM 自己什么也干不了,你需要給它提供生產(chǎn)原料(Class 文件)。 僅僅是 JVM,是無法完成一次編譯,處處運行的。它需要一個基本的類庫,比如怎么操作文件、怎么連接網(wǎng)絡等。

而 Java 體系很慷慨,會一次性將 JVM 運行所需的類庫都傳遞給它。JVM 標準加上實現(xiàn)的一大堆基礎類庫,就組成了 Java 的運行時環(huán)境,也就是我們常說的 JRE。

對于 JDK 來說,就更龐大了一些。除了JRE,JDK還提供了一些非常好用的小工具,比如 javac、java、jar 等。它是 Java 開發(fā)的核心。 我們也可以看下 JDK 的全拼,JavaDevelopmentKit。

JVM、JRE、JDK 它們三者之間的關系,可以用一個包含關系表示:

img

2.3、Java 虛擬機的結構組成

Java 虛擬機整體組成可分為四個部分:類加載器(Class Loader)、運行時數(shù)據(jù)區(qū)(Runtime Data Area)、執(zhí)行引擎(Execution Engine)、本地庫接口(Native Interface)

  • 類加載器:負責從字節(jié)碼 Class 文件中,加載 Class 信息到運行時數(shù)據(jù)區(qū)的方法區(qū);
  • 運行時數(shù)據(jù)區(qū):存放 Jvm 在執(zhí)行 Java 程序時相關數(shù)據(jù)的區(qū)域;
  • 執(zhí)行引擎:將字節(jié)碼翻譯成底層系統(tǒng)指令再交由 CPU 去執(zhí)行;
  • 本地庫接口:執(zhí)行過程中可能需要調用到其他語言(比如 C 語言)的本地接口。

Ps:Javac 是收錄于 Jdk 中的 Java 語言編譯器。該工具可以將 .java 源文件編譯為 Class 文件(.class 文件)。

在程序被執(zhí)行之前,Java 前, Java 代碼會被先轉換成字節(jié)碼 Class 文件,Jvm 首先通過一定的方式使用「類加載器」把字節(jié)碼文件加載到內存中「運行時數(shù)據(jù)區(qū)」,而字節(jié)碼文件是 Jvm 提供的一套指令集規(guī)范,并不能直接交個底層操作系統(tǒng)去執(zhí)行,因此需要特定的命令解析器「執(zhí)行引擎」將字節(jié)碼翻譯成底層系統(tǒng)指令再交由 CPU 去執(zhí)行,而這個過程中需要調用其他語言的接口「本地庫接口」,來實現(xiàn)整個程序的功能,這就是這 4 個主要組成部分的職責與功能。

http://www.risenshineclean.com/news/11568.html

相關文章:

  • dw做的網(wǎng)站怎么做后臺企業(yè)中層管理人員培訓課程
  • 網(wǎng)站建設明薇通網(wǎng)絡天津seo建站
  • php網(wǎng)站如何編輯推廣方案的內容有哪些
  • 云南網(wǎng)站建設專家百度搜索大全
  • 中山百度網(wǎng)站排名網(wǎng)頁百度網(wǎng)盤
  • 機械類外貿(mào)網(wǎng)站建設站長之家工具
  • 社交網(wǎng)站上的商城怎么做淘寶店鋪如何推廣
  • eclipse 網(wǎng)站開發(fā)教程臺州關鍵詞優(yōu)化平臺
  • 網(wǎng)站頁面一般以多大標準做合適百度站長收錄提交入口
  • 海宏集團網(wǎng)站建設朋友圈網(wǎng)絡營銷
  • 中國航發(fā)網(wǎng)上商城客服電話快手seo
  • WordPress批量掃描谷歌seo代運營
  • 重慶網(wǎng)站推百度網(wǎng)盤seo優(yōu)化
  • 小程序免費制作網(wǎng)站2021年10月新聞摘抄
  • 風鈴做的網(wǎng)站能否推廣seo搜索引擎優(yōu)化的內容
  • 中山做網(wǎng)站哪個公司好如何優(yōu)化搜索引擎
  • 用vs做網(wǎng)站的登錄百度關鍵詞搜索量統(tǒng)計
  • 做網(wǎng)站的工作流程成都網(wǎng)站seo設計
  • 成都定制網(wǎng)站建設網(wǎng)站如何做seo排名
  • 網(wǎng)站技術的解決方案鄭州網(wǎng)絡營銷哪個好
  • 做京東網(wǎng)站需要哪些手續(xù)強強seo博客
  • app設計素材網(wǎng)站鄭州怎么優(yōu)化網(wǎng)站排名靠前
  • 常州網(wǎng)站制作報價php視頻轉碼
  • 做簡歷網(wǎng)站成人營銷管理培訓班
  • 關注網(wǎng)站制作廣州各區(qū)最新動態(tài)
  • 制作釣魚網(wǎng)站移動網(wǎng)站推廣如何優(yōu)化
  • 企業(yè)做網(wǎng)頁還是網(wǎng)站網(wǎng)站優(yōu)化資源
  • cdn網(wǎng)絡對網(wǎng)站開發(fā)有影響嗎全網(wǎng)推廣代理
  • 中國建筑總公司官網(wǎng)首頁windows優(yōu)化大師怎么下載
  • 網(wǎng)站app下載平臺怎么做的代運營公司是怎么運營的