Java虛擬機(JVM)平臺無關?相關?

計算機的概念模型

計算機實際上就是實現了一個圖靈機模型。即,輸入參數,根據程序計算,輸出結果。圖靈機模型如圖。

在這里插入圖片描述

Tape是輸入數據,Program是針對這些數據進行計算的程序,中間橫著的方塊表示的是機器的狀態。

目前使用的電子計算機都是實現了這樣一個抽象模型的產物,只不過物理實現上不一樣。

比如,典型的加法運算。

c = a + b

a和b是輸入參數,c是加法的輸出。

如何實現運算?

設計一臺電腦。CPU里面有一個加法器。現在如何實現加法運算,并將結果輸出呢?實際上可以采用如下的方式。

  • 有一根內存條
  • 有一個CPU
  • CPU含有3條指令(加法,讀取內存,寫入內存)

在這里插入圖片描述

那么如何實現上述的加法運算呢?我們可以采用下面的模式

在這里插入圖片描述

第一步,將a放入內存

第二步,將b壓棧

第三步,CPU從內存讀取a和b,并進行加法運算

第四步,將內存中的a和b清空,并將計算后的結果c放入內存

這種計算機被稱為棧式計算機。我們不僅可以在CPU中執行加法,還可以加入減法,乘法,除法,等等。

這種計算機的好處是指令集緊湊精簡,所有操作都以棧頂元素為對象。

但是,它也存在一些固有缺陷,如執行效率較低(因為對于計算機而言,訪問內存操作是一種時間開銷極大的行為)、尋址能力受限等。

改進

為了讓棧式計算機能夠快速地進行運算。CPU可以在內部加入一個寄存器(register),用于總是保存棧頂數據。其計算過程如圖。

在這里插入圖片描述

由于寄存器處于CPU內部,其訪問速度遠遠大于對內存的直接訪問,

后來隨著技術的發展,CPU內部的寄存器越來越多。不同的廠商針對各自的架構設計特點,發展出了屬于各自架構的寄存器。以x86架構為例(也就是我們常見的AMD或Intel CPU),整數寄存器有32個,并且針對每一個寄存器都標記了一個編號以及別名。 下面以0-2號寄存器為例進行說明。

編號別名
0rax
1rcx
2rdx

于是,CPU發展出下面的形式。

在這里插入圖片描述

架構類型

由于不同廠商實現寄存器和訪問內存(簡稱訪存)方式的不同,發展出了復雜指令集架構(CISC)和精簡指令集架構(RISC)。比如,在x86CISC指令集)上實現加法的指令為

ADD EAX, EBX

該指令將EAX寄存器中的值與EBX寄存器中的值相加后,將結果放入EBX

而典型的ARM架構(RISC指令集)實現加法則為

ADD X0, X1, X2

其含義為將x1x2寄存器中的值相加,將結果放入x0寄存器中。

實際上,不僅二者匯編指令的編寫不一致,而且由此翻譯成的機器碼也不一直。對于x86的加法例子,CPU執行上述加法的機器碼為

0x01C3

而對于ARM架構的例子機器碼為

0x8B000000

平臺相關性

對于同樣的加法,在x86和ARM上實現的指令機器碼是不一樣的。所以,如果有程序要實現一個加法,那么在計算機底層執行時,其執行的內容是不一樣的。

對于C語言這樣的高級語言而言,當實現一個加法運算。例如

int a,b,c;
a = b + c;

在經過編譯器(如gcc)編譯后,其源文件被編譯生成了可被指定平臺識別的二進制可執行文件。該文件中關于實現加法的指令是不同的。因此,盡管高級語言編寫的內容一致,但可執行程序在最后一步執行時是平臺相關的。

Java程序的平臺無關性

所謂的Java程序平臺無關性是指由Java語言編寫的源程序經過Java虛擬機(JVM)編譯后,生成的二進制文件(.class)是一致的。即不管是在ARM上編譯生成的.class文件還是x86上生成的.class文件,其內容是一樣的。不管什么平臺的Java虛擬機都可根據這些.class文件執行。這就與gcc編譯器完全不同,gcc生成的二進制文件必須符合平臺的要求,否則不能執行。

原因

Java虛擬機(JVM)在運行Java程序的時候首先會讀取這些.class文件,將其內容加載到虛擬機內部。至于為什么JVM稱為虛擬機呢?這是因為JVM內部實際上是一個由純軟件方式實現的棧式計算機。該棧式計算機被稱為hotspot,幾乎全部由C++實現。,在hotspot之外,包裹了一層Java語言編寫的外殼(jdk)供開發者調用。

在這里插入圖片描述

本質上說,在軟件層面,所有的Java程序運行都通過純軟件的棧式計算機實現計算。但是棧式計算機的具體計算過程,則由平臺的具體指令實現。

這也是為什么openjdk的源碼目錄結構中會出現不同架構的文件夾。

在這里插入圖片描述

不僅如此,為了能夠實現**“一次編譯,處處執行”**,Java虛擬機還能根據不同的操作系統進行適配,對于有些與操作系統和CPU結合的部分,也提供了不同的實現。

在這里插入圖片描述

結論

Java虛擬機即是平臺無關,也是平臺相關。平臺無關是因為其執行過程是由純軟件實現的棧式計算機實現,而平臺相關是因為Java虛擬機的具體操作跟平臺指令和操作系統相關。

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

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

相關文章

satoken的奇奇怪怪的錯誤

發了 /user/getBrowseDetail和/user/getResponDetail,但為什么進入handle里面有三次?且第一次的handle類型是AbstractHandleMapping$PreFlightHttpRequestHandlerxxx,這一次進來的時候flag為false,StpUtils.checkLogin拋出了異常 第二次進來的…

【KWDB 創作者計劃】_上位機知識篇---SDK

文章目錄 前言一、SDK的核心組成API(應用程序接口)庫文件(Libraries)開發工具文檔與示例依賴項與環境配置二、SDK的作用簡化開發流程確保兼容性與穩定性加速產品迭代功能擴展與定制三、SDK的典型應用場景硬件設備開發操作系統與平臺云服務與API集成游戲與圖形開發四、SDK與…

golang處理時間的包time一次性全面了解

本文旨在對官方time包有個全面學習了解。不鉆摳細節,但又有全面了解,重點介紹常用的內容,一些低頻的可能這輩子可能都用不上。主打一個花最少時間辦最大事。 Duration對象: 兩個time實例經過的時間,以長度為int64的納秒來計數。 常見的durati…

PyCharm Flask 使用 Tailwind CSS 配置

使用 Tailwind CSS 步驟 1:初始化項目 在 PyCharm 終端運行:npm init -y安裝 Tailwind CSS:npm install -D tailwindcss postcss autoprefixer初始化 Tailwind 配置文件:npx tailwindcss init這會生成 tailwind.config.js。 步…

【英語語法】基本句型

目錄 前言一:主謂二:主謂賓三:主系表四:主謂雙賓五:主謂賓補 前言 英語基本句型是語法體系的基石,以下是英語五大基本句型。 一:主謂 結構:主語 不及物動詞 例句: T…

隔離DCDC輔助電源解決方案與產品應用科普

**“隔離”與“非隔離的區別** 隔離: 1、AC-DC,也叫“一次電源”,人可能會碰到的應用場合,起安全保護作用; 2、為了抗干擾,通過隔離能有效隔絕干擾信號傳輸。 非隔離: 1、“安全特低電壓&#…

DS-SLAM 運動一致性檢測的源碼解讀

運動一致性檢測是Frame.cc的Frame::ProcessMovingObject(const cv::Mat &imgray)函數。 對應DS-SLAM流程圖Moving consistency check的部分 把這個函數單獨摘出來&#xff0c;寫了一下對兩幀檢測&#xff0c;查看效果的程序&#xff1a; #include <opencv2/opencv.hpp…

安全測試的全面知識體系及實現路徑

以下是安全測試的全面知識體系及實現路徑,結合最新工具和技術趨勢(截至2025年): 一、安全測試核心類型與工具 1. 靜態應用安全測試(SAST) 知識點: 通過分析源代碼、字節碼或二進制文件識別漏洞(如SQL注入、緩沖區溢出)支持早期漏洞發現,減少修復成本,適合白盒測試場…

GPT-4o Image Generation Capabilities: An Empirical Study

GPT-4o 圖像生成能力:一項實證研究 目錄 介紹研究背景方法論文本到圖像生成圖像到圖像轉換圖像到 3D 能力主要優勢局限性與挑戰對比性能影響與未來方向結論介紹 近年來,圖像生成領域發生了巨大的變化,從生成對抗網絡 (GAN) 發展到擴散模型,再到可以處理多種模態的統一生成架…

Redis之全局唯一ID

全局ID生成器 文章目錄 全局ID生成器一、全局ID生成器的定義定義核心作用 二、全局ID生成器需滿足的特征1. 唯一性&#xff08;Uniqueness&#xff09;?2. 高性能&#xff08;High Performance&#xff09;?3. 可擴展性&#xff08;Scalability&#xff09;?4. 有序性&#…

nginx中的代理緩存

1.緩存存放路徑 對key取哈希值之后&#xff0c;設置cache內容&#xff0c;然后得到的哈希值的倒數第一位作為第一個子目錄&#xff0c;倒數第三位和倒數第二位組成的字符串作為第二個子目錄&#xff0c;如圖。 proxy_cache_path /xxxx/ levels1:2 2.文件名哈希值

靜態時序分析STA——8.1 時序檢查(建立時間檢查)

文章目錄 一、時序路徑組二、建立時間檢查1. 觸發器到觸發器路徑1&#xff09;時鐘單元UCKBUF0的延遲計算2&#xff09;時鐘源延遲&#xff08;clock source latency&#xff09; 2. 輸入到觸發器路徑1) 虛擬時鐘的輸入路徑2) 具有實際時鐘的輸入路徑 3. 觸發器到輸出路徑4. 輸…

了解高速設計的信號完整性仿真

高速設計需要精確的信號傳輸&#xff0c;以確保最佳性能。信號完整性差會導致關鍵應用中的誤碼、數據損壞甚至系統故障等問題。介電常數、損耗角正切和插入損耗等因素會顯著影響信號質量。通過使用信號完整性仿真&#xff0c;您可以及早發現并解決這些挑戰。這種主動方法有助于…

RAGFlowwindows本地pycharm運行

Python環境準備 1. 安裝pipx。如已經安裝&#xff0c;可跳過本步驟&#xff1a; python -m pip install --user pipxpython -m pipx ensurepath## 驗證安裝pipx --version2. 安裝 uv。如已經安裝&#xff0c;可跳過本步驟&#xff1a; pipx install uv ## 設置為阿里云 PyPI…

STM32-FreeRTOS的詳細配置

配置FreeRTOS 原文鏈接&#xff1a;https://ydamooc.github.io/posts/c9defcd/ 1.1 下載FreeRTOS 打開FreeRTOS官網&#xff1a;https://www.freertos.org/ 點擊下載&#xff0c;并且選擇"FreeRTOS 202212.01"版本&#xff0c;再點擊Download按鈕下載官方的資源包…

Linux筆記---動靜態庫(原理篇)

1. ELF文件格式 動靜態庫文件的構成是什么樣的呢&#xff1f;或者說二者的內容是什么&#xff1f; 實際上&#xff0c;可執行文件&#xff0c;目標文件&#xff0c;靜態庫文件&#xff0c;動態庫文件都是使用ELF文件格式進行組織的。 ELF&#xff08;Executable and Linkable…

HVV-某田相關經歷

一、背景 本次項目為期兩周&#xff0c;由集團主導招募攻擊隊員對集團下屬及其子公司進行的攻防演練。本次項目主導研判分析應急排查內部Nday發掘。 二、研判分析 2.1、帆軟V10 漏洞概述 帆軟 V10 及 V11 版本報表軟件存在反序列化漏洞&#xff0c;攻擊者可利用該漏洞使用…

AI與物聯網的深度融合:開啟智能生活新時代

在當今數字化時代&#xff0c;人工智能&#xff08;AI&#xff09;和物聯網&#xff08;IoT&#xff09;作為兩大前沿技術&#xff0c;正在加速融合&#xff0c;為我們的生活和工作帶來前所未有的變革。這種融合不僅提升了設備的智能化水平&#xff0c;還為各行各業帶來了新的機…

Linux `init` 相關命令的完整使用指南

Linux init 相關命令的完整使用指南—目錄 一、init 系統簡介二、運行級別&#xff08;Runlevel&#xff09;詳解三、常用 init 命令及使用方法1. 切換運行級別2. 查看當前運行級別3. 服務管理4. 緊急模式&#xff08;Rescue Mode&#xff09; 四、不同 Init 系統的兼容性1. Sy…

UNet 改進(12):UNet with ECA (Efficient Channel Attention) 網絡

詳解 下面將詳細解析這個實現了ECA注意力機制的UNet網絡代碼。 1. 代碼概述 代碼實現了一個帶有Efficient Channel Attention (ECA)模塊的UNet網絡架構。 UNet是一種常用于圖像分割任務的編碼器-解碼器結構網絡,而ECA模塊則是一種輕量級的通道注意力機制,可以增強網絡對重…