2.JVM跨平臺原理(字節碼機制)

目錄

  • 引言
  • 一、跨平臺就跟國際語言翻譯似的
  • 二、字節碼和 JVM 到底是啥玩意兒
  • 三、解決 “語言不通” 這個老難題
  • 四、實現 “一次編寫,到處運行” 就這四步
  • 五、字節碼技術給世界帶來的大改變
  • 總結

引言

咱平常是不是老納悶兒,為啥同一個 Java 程序,在 Windows、Mac、Linux 這些不同的系統上都能順順當當運行起來呢?嘿,這背后的奧秘啊,全在 JVM 和字節碼這一對 “黃金搭檔” 身上呢!

一、跨平臺就跟國際語言翻譯似的

你就這么想啊,假如你在北京寫了本日記,這日記呢就好比是 Java 程序。你想讓遠在紐約、東京的朋友們也都能看懂這本日記。可問題是,這些朋友們只聽得懂他們當地的語言,就像不同的操作系統只認自己那一套指令一樣。那咋解決這個問題呢?

  1. 首先得把日記翻譯成一種大家都能通用的語言,就好比把它譯成 “世界語”,這在 Java 里就是字節碼。

  2. 然后呢,各地的朋友再通過 “翻譯機”,也就是 JVM,來讀取這種 “世界語”。

給你舉幾個 Java 跨平臺技術在實際場景里的例子哈。

  • 像銀行系統,同一套 Java 代碼,在柜員用的 Windows 終端上能跑,在服務器的 Linux 系統上也能同時運行。

  • 還有游戲《我的世界》,用 Java 開發的,不管玩家用的是 PC、Mac 還是 Linux 平臺,都能暢玩無阻。

日記(.java文件)→ 世界語(.class字節碼)→ 翻譯機(Windows/Mac/Linux版JVM)

這要是對應到 Java 技術里,就是這樣一個流程:日記(也就是.java文件),經過一番操作變成 “世界語”(.class字節碼),最后通過不同版本的 “翻譯機”(Windows、Mac、Linux 版的 JVM)來讀取運行。

二、字節碼和 JVM 到底是啥玩意兒

在這里插入圖片描述

Java 的源碼,也就是后綴為.java的文件,經過編譯器,像那個javac,就會生成一種跟平臺沒啥關系的字節碼,也就是.class文件。然后呢,不同系統的 JVM 會在運行的時候,把這些字節碼實時翻譯成當地機器能懂的指令,這么一來,就實現了 “一次編譯,到處運行” 這種超厲害的跨平臺能力。

  • 字節碼:先說說字節碼哈。它是一種特別的中間語言,是那種擴展名為.class的二進制文件。比如說,有個HelloWorld.java文件,經過編譯之后,就會變成HelloWorld.class文件。

  • JVM(Java虛擬機):再講講 JVM,也就是 Java 虛擬機。它就像是每個平臺專屬的 “翻譯官”,不管是 Windows 版、Mac 版還是 Linux 版,功能都是一樣的,核心任務就是把字節碼翻譯成各個平臺本地的指令。

這么類比一下吧,字節碼就像是那種全世界通用的樂高說明書,不管你在哪個國家,拿著這說明書都能知道怎么拼樂高。JVM 呢,就好比是各地的工廠,它們會按照這個說明書,生產出適合當地的樂高。

三、解決 “語言不通” 這個老難題

以前開發軟件的時候,那成本分布可麻煩了。給你看看這個餅狀圖,開發 Windows 版本得占 35% 的成本,給 Mac 適配得 30%,Linux 調試又得 35%。

在這里插入圖片描述

但是字節碼方案出現之后,優勢就特別明顯了。咱對比一下傳統方案,就像 C++ 那種,和 Java 字節碼方案的差別:

對比維度傳統方案(如C++)Java字節碼方案
開發成本需為每個系統單獨開發一次開發,多平臺運行
部署速度每次部署需重新編譯直接部署.class文件
錯誤率各平臺可能出現不同bug運行行為完全一致

給你說個實際發生的事兒哈,有個銀行系統遷移的時候,就因為用了 Java 字節碼這種方式,直接節省了 2000 小時的開發時間,為啥呢?就是因為不用再給 Linux 服務器重新寫代碼了,多省事啊!

四、實現 “一次編寫,到處運行” 就這四步

具體咋實現 “一次編寫,到處運行” 呢?給你看看這個流程哈:

在這里插入圖片描述

開發者先編寫HelloWorld.java,然后把這個文件交給編譯器,編譯器就會生成HelloWorld.class字節碼文件。接著,這個字節碼文件會被發送到 Windows JVM 那里,Windows JVM 再把它翻譯成 Windows 系統能懂的exe指令。同樣的一份字節碼,也會被送到 Mac JVM 那里,Mac JVM 就會把它翻譯成 Mac 系統能執行的dmg指令。

這里面有幾個關鍵的技術點得知道:

關鍵技術點

1.統一編譯標準

通過執行命令 javac HelloWorld.java,就能生成標準化的 .class 文件。這就好比大家都按照一個標準來生產產品,不管在啥系統上,執行這個相同的命令,出來的東西都是符合要求的,后續就能在各個系統上順暢運行啦。

2.平臺專屬JVM

  • Windows JVM 就像是個特別了解 Windows 系統的專家,它清楚 Windows 系統是怎么調用各種資源和指令的,能很好地和 Windows 系統配合工作。

  • Linux JVM 呢,對 Linux 內核通信那一套門兒清,能精準地把字節碼轉化成適合 Linux 系統運行的指令,讓程序在 Linux 系統上也能正常跑起來。

3.即時翻譯機制

  • 解釋執行這一塊呢,JVM 就像是個逐字逐句翻譯的翻譯官,它會一行一行地把字節碼翻譯成機器能懂的指令。這種方式在程序啟動階段特別適用,能保證程序平穩地開始運行。

  • JIT 編譯就更高級啦,它會對那些經常被用到的 “熱點代碼” 進行整體翻譯,然后把翻譯結果緩存起來。這樣下次再用到這些代碼的時候,就不用再重新翻譯了,直接從緩存里拿出來用就行,程序的運行速度一下子就提上去了。

五、字節碼技術給世界帶來的大改變

字節碼技術在好多領域都發揮了巨大的作用,給生活帶來了不少便利呢。

場景1:云服務平臺

在云計算環境里,這個技術可太牛了。系統能夠自動識別當前用的是什么操作系統,然后同一份字節碼,不管是在阿里云的 Linux 環境里,還是 Azure 的 Windows 環境中,都能直接運行起來。這就好比一個萬能鑰匙,不管啥鎖都能開,大大提高了云服務的效率和通用性。

場景2:物聯網設備

現在物聯網設備到處都是,像智能冰箱,用的是 Linux 系統;工業機器人,有的用 Windows CE 系統;共享單車的中控,用的是 Android 系統。通過統一的字節碼,再加上定制的 JVM,不管是什么硬件設備,都能輕松實現硬件控制程序跨平臺運行。不管什么設備,都能在這一套技術體系下協同工作,這物聯網的發展可就順暢多了。

場景3:教育領域

在教育這塊,字節碼技術也幫了大忙。學生在 Windows 電腦上寫好程序,老師在 Mac 筆記本上直接就能運行學生的作業,啥修改都不用做!這對老師檢查作業、指導學生來說,可太方便了,大大提高了教學效率。

總結

這么總結一下哈,字節碼就像是 Java 的 “世界語”,不管在哪個 “語言環境”(操作系統)里都能通用。JVM 呢,就像是把 “世界語” 翻譯成各個地方 “母語” 的翻譯官。這倆配合得那叫一個默契,一下子就打破了不同系統之間的界限,讓 Java 變成了編程世界里真正的 “環球公民”,在各個平臺上都能 “暢行無阻”,可真是厲害得沒話說!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/916420.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/916420.shtml
英文地址,請注明出處:http://en.pswp.cn/news/916420.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

06-ES6

微任務&宏任務JS是單線程執行。所有要執行的任務都要排隊。所有的同步任務會在主線程上排隊,等待執行。異步任務:不會進入主線程,而是會進入任務隊列。等到主線程上的任務執行完成之后,通知任務隊列,執行異步任務。…

FreeSWITCH配置文件解析(10) 配置IP封禁(防暴力破解)

以下是針對FreeSWITCH配置IP封禁(防暴力破解)的完整方案,結合Fail2Ban與系統級防護策略:一、Fail2Ban核心配置(推薦方案)??啟用FreeSWITCH鑒權日志??修改SIP Profile(conf/sip_profiles/int…

【React 入門系列】React 組件通訊與生命周期詳解

🧩 第一章:組件通訊概述在 React 開發中,組件是封裝的、獨立的功能單元。為了實現組件間的數據共享與協作,需要通過組件通訊機制。組件通訊的意義: 讓多個封閉的組件能夠共享數據,實現協作功能。&#x1f4…

前端開發 Vue 狀態優化

Vue 項目中的狀態優化一般都會用Pinia替代Vuex,Pinia 是 Vue 生態系統中的一個輕量級狀態管理庫,作為 Vuex 的替代品,它提供了更簡潔的 API 和更好的性能。模塊化管理:使用 Pinia 時,建議將狀態拆分為多個 store 模塊&…

虛幻基礎:創建角色——FPS

能幫到你的話,就給個贊吧 😘 文章目錄創建角色設置模型添加攝像機添加位置:插槽彈簧臂:伸縮防止由碰撞導致攝像機穿模攝像機添加武器添加位置:插槽創建動畫藍圖:主動獲取角色數據并播放相應動畫設置角色控制…

2025年入局蘋果Vision Pro開發:從零到發布的完整路線圖

蘋果Vision Pro的發布標志著空間計算(Spatial Computing)進入主流市場。作為開發者,如何快速掌握visionOS開發?本文將為你提供詳細的路線圖、實踐建議與資源指南,涵蓋從窗口式應用到沉浸式3D應用的完整開發路徑。 一、visionOS開發的核心目標與階段劃分 visionOS的開發可…

百度文心大模型ERNIE全面解析

百度文心大模型ERNIE概述 百度推出的文心大模型(ERNIE,Enhanced Representation through kNowledge IntEgration)系列是結合知識增強技術的預訓練大模型,涵蓋自然語言處理(NLP)、跨模態、行業應用等多個方向。其開源版本為開發者提供了可商用的大模型能力支持。 ERNIE的…

【SpringAI實戰】提示詞工程實現哄哄模擬器

一、前言 二、實現效果 三、代碼實現 3.1 后端實現 3.2 前端實現 一、前言 Spring AI詳解:【Spring AI詳解】開啟Java生態的智能應用開發新時代(附不同功能的Spring AI實戰項目)-CSDN博客 二、實現效果 游戲規則很簡單,就是說你的女友生氣了&#x…

速通python加密之AES加密

AES加密 AES加密(Advanced Encryption Standard,高級加密標準)是目前全球公認的最安全、應用最廣泛的對稱加密算法之一,于2001年被美國國家標準與技術研究院(NIST)確定為替代DES的標準加密算法,…

Java 對象秒變 Map:字段自由伸縮的優雅實現

前言 在開發中,我們常常需要把對象轉成 Map 格式,用于序列化、傳輸、展示,甚至硬塞給某些第三方框架吃進去再吐出來。乍一看很簡單,字段多起來后就像打翻調色盤,維護起來一不小心就翻車。想優雅地搞定這事,必須有一套穩妥、可擴展的方案,才能寫出讓同事膜拜、領導點贊、…

激光雷達-相機標定工具:支持普通相機和魚眼相機的交互式標定

激光雷達-相機標定工具:支持普通相機和魚眼相機的交互式標定 前言 在自動駕駛、機器人導航等領域,激光雷達和相機的標定是一個基礎而重要的問題。準確的標定結果直接影響后續的感知算法性能。本文將介紹一個開源的激光雷達-相機標定工具,支持…

linux shell從入門到精通(二)——變量操作

1.什么是變量變量在許多程序設計語言中都有定義,與變量相伴地有使用范圍地定義。Linux Shell也不例外。變量,本質上就是一個鍵值對。例如:str“hello”就是將字符串值“hello”賦予鍵str。在str地使用范圍內,我們都可以用str來引用…

[Linux入門] 初學者入門:Linux DNS 域名解析服務詳解

目錄 一、域名服務基礎:從 “名字” 到 “地址” 的轉換 1??什么是域名? 2??什么是 DNS? 3??DNS 用 TCP 還是 UDP? 二、DNS 服務器:各司其職的 “導航站” 1??根域名服務器 2??頂級域名服務器 3??權…

iview表單驗證一直提示為空的幾個原因?

1.Form上的rules是否配置正確; 2.Form-item的prop是否配置正確; 3.規則的名稱和input的v-model是否對應; 4.驗證的字段是否響應,新增字段使用this. $set. © 著作權歸作者所有,轉載或內容合作請聯系作者 平臺聲明&#xff1…

SpringBoot3(若依框架)集成Mybatis-Plus和單元測試功能,以及問題解決

一、Mybatis-Plus集成 新增依賴到父級pom.xml,原先的mybatis依賴可以不動需要注意 mybatis-plus與mybatis版本之間的沖突,不要輕易改動依賴,不然分頁也容易出現問題分類頂級pom.xml下面,如果沒有引入還是出現報錯,在co…

刪除遠程分支上非本分支的提交記錄

要刪除遠程分支上非本分支的提交記錄(即主分支的提交歷史),需要使用 Git 的重寫歷史功能。以下是完整解決方案: 解決方案步驟: 創建干凈的新分支(基于主分支最新提交) # 切換到主分支并更新 git…

Flask input 和datalist結合

<input list"categories" name"category" id"category" class"form-control" placeholder"任務分類" required> 這段代碼是一個 HTML 輸入控件&#xff0c;結合了 <input> 和 <datalist>&#xff0c;用來…

嵌入式分享#27:原來GT911有兩個I2C地址(全志T527)

最近在調試全志T527的觸摸功能時&#xff0c;發現GT911觸摸芯片的I2C地址有時是0x5d&#xff0c;有時又識別成0x14&#xff0c;不知道大家有沒有遇到過類似這個情況。雖然最后使用0x5d地址調通了觸摸功能&#xff0c;但是一直還是很困惑&#xff0c;為什么會出現0x14和0x5d兩個…

Linux運維新人自用筆記(Rsync遠程傳輸備份,服務端、郵箱和客戶端配置、腳本)

內容全為個人理解和自查資料梳理&#xff0c;歡迎各位大神指點&#xff01;每天學習較為零散。day24一、Rsync傳輸文件#安裝rsync#-a遞歸同步&#xff08;包含子目錄&#xff09;保留文件權限、所有者、組、時間戳等元數據 #??-z傳輸時壓縮數據 #??-v顯示詳細同步過程 #??…

以 “有機” 重構增長:云集從電商平臺到健康生活社區的躍遷

當電商行業陷入流量爭奪的紅海&#xff0c;同質化運營模式難以突破增長瓶頸時&#xff0c;云集以從精選電商到有機生活平臺的戰略轉型&#xff0c;開辟出差異化發展路徑。其轉型并非憑經驗決斷的孤例&#xff0c;而是建立在對市場趨勢的精準研判、用戶需求的深度解碼&#xff0…