【JVM從入門到實戰】(二)字節碼文件的組成

一、Java虛擬機的組成

在這里插入圖片描述

二、字節碼文件的組成

字節碼文件的組成 – 應用場景

在這里插入圖片描述
在這里插入圖片描述

字節碼文件的組成部分-Magic魔數

什么是魔數?
在這里插入圖片描述

Java字節碼文件中的魔數

文件是無法通過文件擴展名來確定文件類型的,文件擴展名可以隨意修改,不影響文件的內容。
軟件使用文件的頭幾個字節(文件頭)去校驗文件的類型,如果軟件不支持該種類型就會出錯。
Java字節碼文件中,將文件頭稱為magic魔數。
在這里插入圖片描述

字節碼文件的組成部分-主副版本號

  1. 主副版本號指的是編譯字節碼文件的JDK版本號,主版本號用來標識大版本號,JDK1.0-1.1使用了45.0-45.3,JDK1.2是46之后每升級一個大版本就加1;副版本號是當主版本號相同時作為區分不同版本的標識,一般只需要關心主版本號。
  2. 版本號的作用主要是判斷當前字節碼的版本和運行時的JDK是否兼容。在這里插入圖片描述

1.2之后大版本號計算方法就是:
主版本號 – 44
比如主版本號52就是JDK8

常見問題

需求:解決以下由于主版本號不兼容導致的錯誤
在這里插入圖片描述
兩種方案:
1.升級JDK版本
2.將第三方依賴的版本號降低或者更換依賴,以滿足JDK版本的要求
(容易引發其他的兼容性問題,并且需要大量的測試)
√ 建議采用

字節碼文件的組成 – 基礎信息

在這里插入圖片描述

字節碼文件的組成部分-常量池

字節碼文件中常量池的作用:避免相同的內容重復定義,節省空間。
在這里插入圖片描述

  1. 常量池中的數據都有一個編號,編號從1開始。在字段或者字節碼指令中通過編號可以快速的找到對應的數據。
  2. 字節碼指令中通過編號引用到常量池的過程稱之為符號引用。

一個非常有意思的面試題

面試官:int i = 0; i = i++; 最終i的值是多少?
答:應該是1吧,i++優先級高,先執行之后將返回結果1賦值給 i,所以最終 i應該是1。
面試官:這個答案是不對的,最終i的值還是0。

字節碼文件的組成部分-方法

字節碼中的方法區域是存放字節碼指令的核心位置,字節碼指令的內容存放在方法的Code屬性中。
操作數棧是臨時存放數據的地方,局部變量表是存放方法中的局部變量的位置。
在這里插入圖片描述

  • i=i++的執行流程:
    在這里插入圖片描述
  • i=++i的執行流程:
    在這里插入圖片描述
  • 通過分析方法中的字節碼指令,我們成功的解決了這個問題
    面試官:int i = 0; i = i++; 最終i的值是多少?
    我:答案是0,我通過分析字節碼指令發現,i++先把0取出來放入臨時的操作數棧中,接下來對i進行加1,i變成了1,最后再將之前保存的臨時值0放入i,最后i就變成了0。
    面試官:非常好!

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

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

相關文章

機器學習筆記 - 隨機樣本共識(RANSAC) 算法

一、什么是 RANSAC? RANSAC(隨機樣本共識)是一種用于機器學習和計算機視覺的算法,隨機樣本共識(RANSAC)是一種迭代方法,用于根據包含異常值的數據集估計數學模型。RANSAC 算法的工作原理是識別數據集中的異常值,并使用不包含異常值的數據來估計所需的模型。 …

在Go中定義結構體

引言 圍繞具體細節構建抽象是編程語言可以提供給開發人員的最好工具。結構體允許Go開發人員描述Go程序運行的世界。結構體允許我們討論Address,而不是描述Street、 City或PostalCode的字符串。它們是我們努力告訴未來開發人員(包括我們自己)哪些數據對我們的Go程序是重要的,…

UE引擎 LandscapeGrass 實現機制分析(UE5.2)

前言 隨著電腦和手機硬件性能越來越高,游戲越來越追求大世界,而大世界非常核心的一環是植被,目前UE5引擎提供給植被生成的主流兩種方式為 手刷植被和LandscapeGrass(WeightMap程序化植被)。當然UE5.3推出新一代PCGFramework 節點程序化生成框…

MyBatis:緩存

MyBatis 緩存一級緩存二級緩存注 緩存 緩存,是數據交換的緩沖區(臨時保存數據的地方)。即將數據(數據一般為頻繁查詢且不易改變)保存在計算機內存中,下次讀取數據時直接從內存中獲取,以避免頻繁…

OpenAI接口調用示例

最近為公司做了一個ChatGPT工具,這里展示一下OpenAI接口的調用 前提條件 訪問OpenAI官網(國內需要翻墻)的賬號,需要sk 地址:https://platform.openai.com 依賴 使用開源工具調用OpenAI接口,依賴如下&am…

js中箭頭函數簡單介紹

1.箭頭函數是 ES6 中新增的一種函數定義方式, 簡單舉例為 var nameA function(a){return a} 可以用箭頭函數簡化為 var nameA a >a; 返回的是你輸入的值 比如 nameA(5) 返回的就是5 nameA(2) 返回的就是2 以上兩個表達的含義是一樣的。nameA為名字 2.…

Vue3封裝一個輪播圖組件

先看效果 編寫組件代碼 CarouselChart.vue <template><div classimg-box><el-button clickpreviousImages v-ifprops.showBtn>←</el-button><div classimg><div styledisplay: flex;gap: 20px idmove><imgclassimg-item v-for(item…

centos7部署docker

文章目錄 &#xff08;1&#xff09;安裝前準備&#xff08;2&#xff09;卸載舊版Docker&#xff08;3&#xff09;安裝docker&#xff08;4&#xff09;配置鏡像加速 &#xff08;1&#xff09;安裝前準備 在開始安裝之前&#xff0c;首先需要檢查內核版本。使用 uname -r 命…

nodejs微信小程序+python+PHP個性化服裝搭配系統APP-計算機畢業設計推薦 android

目 錄 摘 要 I ABSTRACT II 目 錄 II 第1章 緒論 1 1.1背景及意義 1 1.2 國內外研究概況 1 1.3 研究的內容 1 第2章 相關技術 3 2.1 nodejs簡介 4 2.2 express框架介紹 6 2.4 MySQL數據庫 4 第3章 系統分析 5 3.1 需求分析 5 3.2 系統可行性分析 5 3.2.1技術可行性&#xff1a;…

redis(設置密碼)配置文件詳細

1.設置賬號密碼端口 config set requirepass 123456 設置密碼為123456 config get requirepass 查看賬號密碼 auth 123456 登入的時候輸入這個確定賬號密碼 1. 首先連接到Redis服務器: redis-cli 2. 然后使用CONFIG SET命令設置requirepass參數并指定密碼: CONFIG SET requi…

【PyTorch】現代卷積神經網絡

文章目錄 1. 理論介紹1.1. 深度卷積神經網絡&#xff08;AlexNet&#xff09;1.1.1. 概述1.1.2. 模型設計 1.2. 使用塊的網絡&#xff08;VGG&#xff09;1.3. 網絡中的網絡&#xff08;NiN&#xff09;1.4. 含并行連結的網絡&#xff08;GoogLeNet&#xff09; 2. 實例解析2.1…

家具制造ERP軟件包含哪些功能?家具制造業ERP系統哪個好

不同的家具有不同的用料、品質、制造工時、營銷渠道等&#xff0c;而有些家具制造企業采用傳統的管理方式在處理物料BOM、生產實際成本核算、庫存盤點、供應商選擇、班組計件核對、生產領用以及物料追溯等方面存在不少提升空間。 與此同時也有很多的皮具制造企業借助ERP軟件優…

Linux16 ftp文件服務區、vsftpd文件系統服務安裝、lftp客戶端安裝、NFS遠程共享存儲

目錄 一、FTP基礎ftp主動模式ftp被動模式 二、vsftpd配置共享目錄編輯配置文件使用windows 訪問 三、客戶端安裝 &#xff08;lftp&#xff09;匿名用戶的一些操作&#xff08;lftp {ip}&#xff09;ftp配置本地用戶登錄配置本地用戶ftp配置文件 lftp操作 NFS遠程共享存儲安裝n…

新的側通道攻擊可泄露處理器的 Root 密碼

阿姆斯特丹自由大學的一組科學家開發了一種名為 SLAM&#xff08;Spectre Linear Address Masking&#xff09;的側信道攻擊。 該攻擊利用旨在提高新型Intel、AMD 和 Arm 處理器安全性的硬件功能&#xff0c;從內核內存中提取根密碼哈希。 重現 SLAM 攻擊所需的代碼和所有數據…

dockerfile:創建鏡像的方式,船艦自定義的鏡像

dockerfile&#xff1a;創建鏡像的方式&#xff0c;船艦自定義的鏡像 包括配置文件&#xff0c;掛載點&#xff0c;對外暴露的端口&#xff0c;設置環境變量 docker創建鏡像的方式 1、基于已有鏡像進行創建。 根據官方提供的鏡像源&#xff0c;創建鏡像&#xff0c;然后拉起…

IP與以太網的轉發操作

TCP模塊在執行連接、收發、斷開等各階段操作時&#xff0c;都需要委托IP模塊將數據封裝成包發送給通信對象。 網絡中有路由器和集線器兩種不同的轉發設備&#xff0c;它們在傳輸網絡包時有著各自的分工。 (1)路由器根據目標地址判斷下一個路由器的位置 (2)集線器在子網中將網…

docker的鏡像創建 dockerfile

dockerfile Dokcer鏡像的創建 創建鏡像有三種方法&#xff0c;分別為【基于已有鏡像創建】、【基于本地模板創建】以及【基于Dockerfile創建】。 &#xff08;1&#xff09;首先啟動一個鏡像&#xff0c;在容器里做修改 docker run -itd --name web centos:7 /bin/bash …

k8s pod日志寫入ELK的具體實現

shigen堅持更新文章的博客寫手&#xff0c;擅長Java、python、vue、shell等編程語言和各種應用程序、腳本的開發。記錄成長&#xff0c;分享認知&#xff0c;留住感動。 在上一部分&#xff0c;shigen講到了k8spod的日志寫入ELK的三種技術方案&#xff0c;并在最后展示了一下我…

QMainWindow和QWidget有什么區別

2023年12月12日&#xff0c;周二上午 QMainWindow 和 QWidget 是 Qt 框架中兩個不同的類&#xff0c;用于創建用戶界面的窗口部件。它們之間的主要區別在于它們的設計和用途。 QMainWindow: QMainWindow 是用于創建主窗口的類&#xff0c;通常包含了一個應用程序的主要界面。…

NFR 數字權益開發流程

NFR 在技術開發領域通常指的是“非功能性需求”&#xff08;Non-Functional Requirements&#xff09;&#xff0c;這些是描述系統屬性如安全性、性能、可用性、兼容性等方面的需求。然而&#xff0c;如果在這里 NFR 被用來指代與數字權益或非同質化代幣&#xff08;NFT&#x…