JVM-基于Hotspot

前言

Java虛擬機(Java Virtual Machine簡稱JVM)是運行所有Java程序的抽象計算機,是Java語言的運行環境,其主要任務為將字節碼裝載到內部,解釋/編譯為對應平臺上的機器指令執行。

Java虛擬機規范定義了一個抽象的——而非實際的——機器或處理器。這個規范描述了一個指令集,一組寄存器,一個堆棧,一個“垃圾堆”,和一個方法區。一旦一個Java虛擬機在給定的平臺上運行,任何Java程序(編譯之后的程序,稱作字節碼)都能在這個平臺上運行。Java虛擬機(JVM)可以以一次一條指令的方式來解釋字節碼(把它映射到實際的處理器指令),或者字節碼也可以由實際處理器中稱作just-in-time的編譯器進行進一步的編譯。

JVM的內存結構



我們可以把運行時數據區分為線程私有共享數據區兩大類

  • 線程私有的數據區包含 程序計數器、虛擬機棧、本地方法棧,即為本地區(native area)

  • 線程共享的數據區包含Java堆、方法區,在方法區內有一個常量池。

本地區(native area)

程序計數器(PC Register)

記錄正在執行的虛擬機字節碼的地址。和計算機組成原理中提到的程序計數器PC概念類似,是線程私有的,用來記錄當前執行的字節碼位置。程序計數器會存儲當前線程正在執行的Java方法的JVM指令地址;或者,如果是在執行本地方法,則是未指定值(undefined)。

程序計數器是唯一一個不會發生OOM的區域。

虛擬機棧(JVM Stack)

也就是我們常常所說的棧。

方法執行的內存區,每個方法執行時會在虛擬機棧中創建棧幀,用于存儲局部變量表(局部變量表需要的內存在編譯期間就確定了所以在方法運行期間不會改變大小),操作數棧,動態鏈接,方法出口等信息。每一個方法從調用開始至執行完成的過程,就對應著棧幀在虛擬機棧中從入棧到出棧的過程。

這個區域有兩種異常情況:

  • StackOverflowError:線程請求的棧深度大于虛擬機所允許的深度

  • OutOfMemoryError:虛擬機棧擴展到無法申請足夠的內存時

本地方法棧(Native Method Stack)

本地方法棧則為虛擬機使用到的Native方法提供內存空間。

棧幀

每一個棧幀都包括了局部變量表,操作數棧,動態連接,方法返回地址和一些額外的附加信息。

在編譯代碼的時候,棧幀中需要多大的局部變量表,多深的操作數棧都已經完全確定了,并且寫入到了方法表的Code屬性中,因此一個棧幀需要分配多少內存,不會受到程序運行期變量數據的影響,而僅僅取決于具體虛擬機的實現。

一個線程中的方法調用鏈可能會很長,很多方法都同時處理執行狀態。對于執行引擎來講,活動線程中,只有虛擬機棧頂的棧幀才是有效的,稱為當前棧幀(Current Stack Frame),這個棧幀所關聯的方法稱為當前方法(Current Method)。執行引用所運行的所有字節碼指令都只針對當前棧幀進行操作。棧幀的概念結構如下圖所示:

方法區(method area)

方法區屬于是 JVM 運行時數據區域的一塊邏輯區域,是各個線程共享的內存區域。

當虛擬機要使用一個類時,它需要讀取并解析 Class 文件獲取相關信息,再將信息存入到方法區。方法區會存儲已被虛擬機加載的 類信息、字段信息、方法信息、常量、靜態變量、即時編譯器編譯后的代碼緩存等數據。

可以這樣理解,方法區存的是類的模版。比如說方法,其實就是行為,一個類的行為都是一致的,所以存在方法區;而變量,就是數據,每一個對象的數據都是不一樣的,所以存在堆里。

符號引用和直接引用
  • 符號引用:字符串,能根據這個字符串定位到指定的數據,比如java/lang/StringBuilder,包含三種:類和接口的全限定名、字段的名稱和描述符、方法的名稱和描述符。

  • 直接引用:內存地址

虛擬機棧的動態鏈接就是將符號引用(這些符號引用的集合就是常量池)轉換為直接引用(符號引用對應的具體信息,這些具體信息的集合就是運行時常量池,存在方法區中)的過程。

常量池

常量池表(Constant Pool Table)

我們寫的每一個Java類被編譯后,就會形成一份class文件(每個class文件都有一個class常量池)。 class文件中除了包含類的版本、字段、方法、接口等描述信息外,還有一項信息就是常量池(constant pool table),用于存放編譯器生成的各種字面量(Literal)和符號引用(Symbolic References)。

  • 字面量,即通過字面我們就能知道其值的含義。包括:1.文本字符串 2.八種基本類型的值 3.被聲明為final的常量等;

  • 符號引用包括:1.類和方法的全限定名 2.字段的名稱和描述符 3.方法的名稱和描述符。

常量池表會在類加載后存放到方法區的運行時常量池中。

運行時常量池(Runtime Constant Pool)

jvm在執行某個類的時候,必須經過加載、連接、初始化,而連接又包括驗證、準備、解析三個階段。而當類加載到內存中后,jvm就會將 class常量池 中的內容存放到 運行時常量池 中,由此可知,運行時常量池 也是每個類都有一個。

在上面我也說了,class常量池 中存的是字面量和符號引用,也就是說他們存的并不是對象的實例,而是對象的符號引用值。而經過解析(resolve)之后,也就是把符號引用替換為直接引用,解析的過程會去查詢 字符串常量池 ,以保證 運行時常量池所 引用的字符串與 字符串常量池 中所引用的是一致的。

字符串常量池(String Pool)

字符串常量池存的是 引用值,而不是具體的實例對象,具體的實例對象是在堆中開辟的一塊空間存放的。

是在類加載完成,經過驗證,準備階段之后 在 堆 中生成字符串對象實例,然后 將該字符串對象實例的 引用值 存到 String Pool 中

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

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

相關文章

智能合約安全審計平臺——可視化智能合約漏洞掃描

目錄 可視化智能合約漏洞掃描 —— 理論、實踐與安全保障1. 引言2. 理論背景與漏洞原理2.1 智能合約簡介2.2 常見漏洞類型2.3 漏洞掃描與安全評估原理3. 系統架構與工作流程3.1 系統總體架構3.2 模塊說明4. 漏洞掃描流程詳解4.1 代碼上傳與靜態解析4.2 漏洞模式檢測4.3 風險評估…

【MySQL數據庫】數據類型詳解

目錄 數據類型tinyint類型(整形)bit類型小數浮點數 float、doubledecimal 字符串類型charvarcharchar與varchar的比較 日期時間類型enum和set總結 數據類型 tinyint類型(整形) 例: mysql> create table tt1(num tinyint);mysql> insert into tt1 values(1)…

咪咕MG101_晨星MSO9380芯片_安卓5.1.1_免拆卡刷固件包

咪咕MG101_晨星MSO9380芯片_安卓5.1.1_免拆卡刷固件包(內有教程) 刷機教程簡單說明: 1、把下載好的刷機包,U盤里建立一個upgrade文件夾,固件放入此文件夾里,放入U盤中,注意升級包為壓縮包不要對…

CS61A:STRING REPRESENTATION

Python 規定所有對象都應該產生兩種不同的字符串表示形式:一種是人類可解釋的文本,另一種是 Python 可解釋的表達式。字符串的構造函數 str 返回一個人類可讀的字符串。在可能的情況下,repr 函數會返回一個計算結果相等的 Python 表達式。rep…

LangChain緩存嵌入技術完全指南:CacheBackedEmbedding原理與實踐(附代碼示例)

一、嵌入緩存技術背景與應用場景 1.1 為什么需要嵌入緩存? 算力消耗問題:現代嵌入模型(如text-embedding-3-small)單次推理需要約0.5-1秒/文本 資源浪費現狀:實際業務中約30%-60%的文本存在重復計算 成本壓力&#…

精益數據分析(3/126):用數據驅動企業發展的深度解析

精益數據分析(3/126):用數據驅動企業發展的深度解析 大家好!一直以來,我都堅信在當今競爭激烈的商業環境中,數據是企業獲得競爭優勢的關鍵。最近深入研究《精益數據分析》這本書,收獲頗豐&…

wpf ScaleTransform

在WPF中,ScaleTransform是用于實現元素縮放的核心類,屬于System.Windows.Media命名空間下的變換類型。以下是其主要特性與使用方式的總結: ?核心屬性? ?縮放比例? ScaleX:水平方向縮放比例(默認1.0,即…

用純Qt實現GB28181協議/實時視頻/云臺控制/預置位/錄像回放和下載/事件訂閱/語音對講

一、前言 在技術的長河中探索,有些目標一旦確立,便如同璀璨星辰,指引著我們不斷前行。早在2014年,我心中就種下了用純Qt實現GB28181協議的種子,如今回首,一晃十年已逝,好在整體框架和邏輯終于打…

0x01、Redis 主從復制的實現原理是什么?

Redis 主從復制概述 Redis 的主從復制是一種機制,允許一個主節點(主實例)將數據復制到一個或多個從節點(從實例)。通過這一機制,從節點可以獲取主節點的數據并與之保持同步。 復制流程 開始同步&#xf…

整活 kotlin + springboot3 + sqlite 配置一個 SQLiteCache

要實現一個 SQLiteCache 也是很簡單的只需要創建一個 cacheManager Bean 即可 // 如果配置文件中 spring.cache.sqlite.enable false 則不啟用 Bean("cacheManager") ConditionalOnProperty(name ["spring.cache.sqlite.enable"], havingValue "t…

深入探索如何壓縮 WebAssembly

一、初始體積:默認 Release 構建 我們從最基礎的構建開始,不開啟調試符號,僅使用默認的 release 模式: $ wc -c pkg/wasm_game_of_life_bg.wasm 29410 pkg/wasm_game_of_life_bg.wasm這是我們優化的起點 —— 29,410 字節。 二…

多角度分析Vue3 nextTick() 函數

nextTick() 是 Vue 3 中的一個核心函數,它的作用是延遲執行某些操作,直到下一次 DOM 更新循環結束之后再執行。這個函數常用于在 Vue 更新 DOM 后立即獲取更新后的 DOM 狀態,或者在組件渲染完成后執行某些操作。 官方的解釋是,當…

前端面試-自動化部署

基礎概念 什么是CI/CD?在前端項目中如何應用?自動化部署相比手動部署有哪些優勢?常見的自動化部署工具有哪些?舉例說明它們的區別(如Jenkins vs GitHub Actions)。如何通過Git Hook實現自動化部署&#xf…

架構生命周期(高軟57)

系列文章目錄 架構生命周期 文章目錄 系列文章目錄前言一、軟件架構是什么?二、軟件架構的內容三、軟件設計階段四、構件總結 前言 本節講明架構設計的架構生命周期概念。 一、軟件架構是什么? 二、軟件架構的內容 三、軟件設計階段 四、構件 總結 就…

GPTNet如何革新創意與效率

引言 人工智能正在以前所未有的速度改變我們的工作與生活方式,從智能寫作到視覺創作,AI工具已成為不可或缺的伙伴。在眾多平臺中,GPTNet以其強大的功能整合和直觀體驗嶄露頭角。它不僅匯集了GPT系列、Claude、Grok、Gemini等頂級對話模型&am…

【計網】SSL/TLS核心原理

序言 在HTTP協議中,信息是明文傳輸的,因此為了通信安全就有了HTTPS(Hyper Text Transfer Protocol over Secure Socket Layer)協議。HTTPS也是一種超文本傳送協議,在HTTP的基礎上加入了SSL/TLS協議,SSL/TLS依靠證書來驗證服務端的…

Web Components 開發與集成

以下是關于 Web Components 開發與集成 的系統知識梳理,涵蓋核心概念、高級特性、集成與優化等內容: 一、Web Components 核心概念 技術作用核心 APICustom Elements定義可復用的自定義 HTML 元素customElements.define()、生命周期鉤子(connectedCallback 等)Shadow DOM封…

day26 學習筆記

文章目錄 前言一、圖像顏色轉換1.HSV顏色空間2.顏色轉換 二、灰度化1.最大值法2.平均值法3.加權均值法 三、二值化1.全局閾值法1.閾值法(THRESH_BINARY)2.反閾值法(THRESH_BINARY_INV)3.截斷閾值法(THRESH_TRUNC)4.低閾值零處理(THRESH_TOZERO)5.超閾值零處理(THRESH_TOZERO_IN…

威鋒VL822-Q7T10GHUB芯片適用于擴展塢顯示器

一、概述 VL822-Q7T是VIA Lab(威盛電子旗下專注于USB相關技術研發的子公司)精心打造的一款高性能USB 3.1 Gen2集線器控制器芯片。在當今數字化時代,USB接口作為設備連接與數據傳輸的核心通道,其性能與穩定性至關重要。VL822-Q7T憑…

華為OD機試真題——最小的調整次數/特異性雙端隊列(2025A卷:100分)Java/python/JavaScript/C++/C語言/GO六種最佳實現

2025 A卷 100分 題型 本文涵蓋詳細的問題分析、解題思路、代碼實現、代碼詳解、測試用例以及綜合分析; 并提供Java、python、JavaScript、C、C語言、GO六種語言的最佳實現方式! 2025華為OD真題目錄全流程解析/備考攻略/經驗分享 華為OD機試真題《最小的調…