小白入門JVM、字節碼、類加載機制圖解

前提知識~

JDK 基本介紹

  1. JDK 的全稱(Java Development Kit Java 開發工具包)
  2. JDK = JRE + java 的開發工具[java, javac,javadoc,javap 等]
  3. JDK 是提供給Java 開發人員使用的,其中包含了java 的開發工具,也包括了JRE。
  4. 可開發、編譯、調試……

JRE 基本介紹

  1. JRE(Java Runtime Environment Java 運行環境)
  2. JRE = JVM + Java 的核心類庫[類]
  3. 包括Java 虛擬機(JVM Java Virtual Machine)和Java 程序所需的核心類庫等,如果只想運行開發好的.class 文件只需要JRE。也稱最小運行環境。
  4. 只運行

JVM是什么?

  1. JVM(Java Virtual Machine,? Java虛擬機)

JVM有什么用?

與其他語言不同,Java 語言并不直接將代碼編譯成與系統有關的機器碼,而是編譯成一種特定的語言規范,這種語言規范我們稱之為字節碼。無論 Java 程序要在 Windows 系統,還是 Mac OSX 系統,或是 Linux 系統,它首先都得編譯成字節碼文件,之后才能運行。?

我們編譯成字節碼之后,無論但是 Linux 系統、?Windows 系統都還是不認識。? ? ? ? ? ? ? ? ? ?

這時候 Java 虛擬機就是一個翻譯官,解析字節碼文件的內容,在 Linux 系統上翻譯成 Linux 機器碼給 Linux 系統聽,在 Windows 系統上翻譯成 Windows 機器碼給 Windows 系統聽。

實際上 Java 虛擬機運行的是字節碼文件(Class文件),并不是Java代碼

總結:?Java 虛擬機是一個字節碼翻譯器,它將字節碼文件翻譯成各個系統對應的機器碼,確保字節碼文件能在各個系統正確運行。

JVM的內存結構:

首先先說虛擬機內存結構和運行時數據區兩個說法是一個意思。

分為5 個:

?1.Java堆(Heap):

  1. 是內存中最大的一塊
  2. Java堆是被所有線程共享的一塊內存區域,在虛擬機啟動時創建
  3. 作用:存放對象實例,幾乎所有的對象實例都在這里分配內存。
  4. 有些時候小對象會直接在棧上進行分配,這種現象我們稱之為「棧上分配」

Java 堆根據對象存活時間的不同,Java 堆還被分為年輕代老年代兩個區域;年輕代還被進一步劃分為 Eden 區、From Survivor 0To Survivor 1 區。

當有對象需要分配時,一個對象永遠優先被分配在年輕代的 Eden 區,等到 Eden 區域內存不夠時,Java 虛擬機會啟動垃圾回收。此時 Eden 區中沒有被引用的對象的內存就會被回收,而一些存活時間較長的對象則會進入到老年代。在 JVM 中有一個名為 -XX:MaxTenuringThreshold 的參數專門用來設置晉升到老年代所需要經歷的 GC 次數,即在年輕代的對象經過了指定次數的 GC 后,將在下次 GC 時進入老年代。

Eden:S0?:S1 = 8:1:1?

2.方法區(Method Area):

  1. 作用:存儲已被虛擬機加載的類信息、常量、靜態變量、即時編譯器編譯后的代碼等數據
  2. 常量池其實是存放在方法區中的
  3. 方法區在不同版本的虛擬機有不同的表現形式,例如在 1.7 版本的 HotSpot 虛擬機中,方法區被稱為永久代(Permanent Space),而在 JDK 1.8 中則被稱之為 MetaSpace。

3.程序計數器(Program Counter Register):

  1. 是一塊較小的內存空間
  2. ?字節碼解釋器工作時就是通過改變這個計數器的值來選取下一條需要執行的字節碼指令,分支、循環、跳轉、異常處理、線程恢復等基礎功能都需要依賴這個計數器來完成。
  3. 每條線程都需要有一個獨立的程序計數器,各條線程之間的計數器互不影響,獨立存儲
  4. 如果線程正在執行的是一個Java方法,這個計數器記錄的是正在執行的虛擬機字節碼指令的地址;如果正在執行的是Natvie方法,這個計數器值則為空(Undefined)

4.JVM棧(JVM Stacks):

  1. 與線程同時創建
  2. 每個方法被執行的時候都會同時創建一個棧幀(Stack Frame)用于存儲局部變量表、操作棧、動態鏈接、方法出口等信息。
  3. 每一個方法被調用直至執行完成的過程,就對應著一個棧幀在虛擬機棧中從入棧到出棧的過程
  4. 簡單來說:執行 Java 代碼

5.本地方法棧(Native Method Stacks)?:

本地方法棧與虛擬機棧所發揮的作用是非常相似的,其區別不過是虛擬機棧為虛擬機執行Java方法(也就是字節碼)服務,而本地方法棧則是為虛擬機使用到的Native方法服務

總結一下:一個 Java 文件就加載到內存中了,并且 Java 類信息就會存儲在我們的方法區中。如果創建對象,那么對象數據就會存放在 Java 堆中。如果調用方法,就會用到 PC 寄存器、Java 虛擬機棧、本地方法棧等結構。


字節碼:

前面我們知道了,在不同操作系統、不同硬件平臺上都可以做到不用修改代碼就可以運行,怎么實現的跨平臺?中間碼誕生了!即“字節碼”!

Java所有的指令有200個左右,一個字節(8位)可以存儲256種不同指令信息,一個這樣的字節成為字節碼。

那么,Java源代碼是如何轉成字節碼的呢?如圖:

?當字節碼通過類加載到JVM環境后,才可以執行,而執行分為三種模式:

  1. 解釋執行(javac編譯器):啟動快,運行慢
  2. JIT編譯執行:啟動慢,運行快
  3. JIT編譯與解釋混合執行(默認):?在啟動時先解釋執行,省去編譯時間

解釋器不需要像 JIT 編譯器一樣,將所有字節碼都轉化為機器碼,所以就減少了時間。而JIT 編譯器完成第一次編譯后,其會將字節碼對應的機器碼保存下來,下次可以直接使用。大家都知道,機器碼的運行效率肯定是高于 Java 解釋器的,所以我們會默認使用混合執行


類加載機制

程序三階段:編譯,加載,運行

JVM 虛擬機將字節碼讀取進內存,從而進行解析、運行等的這整個過程,我們叫:Java 虛擬機的類加載機制。(即第二階段)

類加載階段又可以細分為三個階段,為加載Load,連接Link,初始化Init

  1. 加載?
  2. 連接
    1. 驗證驗證成員的安全性(更詳細的校驗,比如final是否合規、類型是否正確、靜態變量是否合理)
    2. 準備將類中的靜態成員初始化為默認值(為靜態變量分配內存,設定默認值)
    3. 解析將間接地址轉換為直接地址(將其在常量池中的符號引用替換成直接其在內存中的直接引用)
  3. 初始化

尾聲

【JVM】從三種認知角度重識JVM-CSDN博客

?JVM入門教程第7講:JVM 類加載機制 - 陳樹義 - 博客園

jvm系列(二):JVM內存結構 - 純潔的微笑 - 博客園

jvm系列(一):java類的加載機制 - 純潔的微笑 - 博客園

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

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

相關文章

consul服務注冊與發現(go)-學習筆記

參考博客 1、服務實例接口與默認實現 type ServiceInstance interface {// 獲取服務實例的唯一IDGetInstanceId() string// 獲取服務IDGetServiceId() string// 獲取服務實例的主機名或IP地址GetHost() string// 獲取服務實例的端口號GetPort() int// 判斷服務實例是否使用HT…

【AI】prompt engineering

prompt engineering ## prompt engineering ## prompt engineering ## prompt engineering 一、定義 Prompt 工程(Prompt Engineering)是指在使用語言模型(如 ChatGPT、文心一言等)等人工智能工具時,設計和優化輸入提…

Python 字典和集合(常見的映射方法)

本章內容的大綱如下: 常見的字典方法 如何處理查找不到的鍵 標準庫中 dict 類型的變種set 和 frozenset 類型 散列表的工作原理 散列表帶來的潛在影響(什么樣的數據類型可作為鍵、不可預知的 順序,等等) 常見的映射方法 映射類型…

對抗Prompt工程:構建AI安全護欄的攻防實踐

大語言模型的開放性與自然語言交互特性使其面臨前所未有的Prompt工程攻擊威脅。本文通過分析2021-2023年間157個真實越獄案例,揭示語義混淆、上下文劫持、多模態組合三重攻擊路徑的技術原理,提出融合動態意圖拓撲分析(DITA)、對抗…

STL c++ list——模擬實現

結點類的模擬實現 list是一個帶頭雙向循環鏈表 因需要實現一個節點類&#xff0c;其中包含哨兵位&#xff08;用來標識位置&#xff09;&#xff0c;節點信息&#xff08;val數據&#xff0c;prev后指針&#xff0c;next后指針&#xff09; template<class T> struct …

ORM、Mybatis和Hibernate、Mybatis使用教程、parameterType、resultType、級聯查詢案例、resultMap映射

DAY21.1 Java核心基礎 ORM Object Relationship Mapping 對象關系映射 面向對象的程序到—關系型數據庫的映射 比如java – MySQL的映射 ORM框架就是實現這個映射的框架 Hibernate、Mybatis、MybatisPlus、Spring Data JPA、Spring JDBC Spring Data JPA的底層就是Hiber…

【學習自用】配置文件中的配置項

server.port服務器端口&#xff0c;常被用于指定應用程序運行時所監聽的端口號spring.datasource.url用于配置數據源的數據庫連接URLspring.datasource.username用于指定連接數據庫的用戶名spring.datasource.password用于配置數據源時設置數據庫連接密碼的屬性mybatis.mapper-…

使用protobuf編譯提示無法打開包括文件: ‘absl/log/absl_log.h’: No such file or directory

問題原因 Protobuf 依賴 Abseil&#xff1a; Protobuf 3.20 版本開始依賴 Abseil&#xff0c;但你的系統未正確安裝或配置 Abseil。 頭文件路徑未包含&#xff1a; 編譯器找不到 absl/log/absl_log.h&#xff0c;可能是因為 Abseil 未正確安裝或未在項目中設置包含路徑。 …

Spring AI Alibaba 文檔檢索使用

一、文檔檢索 (Document Retriever)簡介 1、核心概念 文檔檢索&#xff08;DocumentRetriever&#xff09;是一種信息檢索技術&#xff0c;旨在從大量未結構化或半結構化文檔中快速找到與特定查詢相關的文檔或信息。文檔檢索通常以在線(online)方式運行。 DocumentRetriever通…

前端面試核心知識點整理:從 JavaScript 到 Vue 全解析

一、JavaScript 異步編程核心:Promise 與 async/await 1. Promise 深度解析 定義:Promise 是處理異步操作的對象,代表一個異步操作的最終狀態(成功 / 失敗)。三種狀態: pending(進行中):初始狀態,異步操作未完成。fulfilled(已成功):異步操作成功,調用 resolve …

音視頻(四)android編譯

前言 前面已經講了在windows上應用了&#xff0c;這章主要講述android上編譯 1&#xff1a;環境 git 如果失敗 直接跑到相應網站 手動下載 ubuntu22.* android ndk r21e download:https://developer.android.google.cn/ndk/downloads/index.html?hluk 為什么用這個&#xff0…

【kind管理腳本-3】腳本函數說明文檔 —— 便捷使用 kind 創建、刪除、管理集群腳本

下面是一份詳細的說明文檔&#xff0c;介紹該腳本的功能、用法及各部分的含義&#xff0c;供您參考和使用&#xff1a; Kind 集群管理腳本說明文檔 此腳本主要用于管理 Kind&#xff08;Kubernetes IN Docker&#xff09;集群&#xff0c;提供創建、刪除、導出 kubeconfig、加…

【計算機行業發展與重塑】

計算機行業正經歷前所未有的變革&#xff0c;AI技術的爆發式發展與產業升級的深度融合&#xff0c;正在重塑行業格局與就業市場。以下從行業趨勢、AI的核心價值、就業需求三個維度展開分析。 一、行業趨勢&#xff1a;AI驅動下的多極增長 AI成為核心引擎 生成式AI的突破&#…

(高頻SQL50題)1667. 修復表中的名字

問題 表&#xff1a; Users ------------------------- | Column Name | Type | ------------------------- | user_id | int | | name | varchar | ------------------------- user_id 是該表的主鍵(具有唯一值的列)。 該表包含用戶的 ID 和名字…

基于人工智能的醫學影像關聯分析:利用潛在空間幾何混雜因素校正法|文獻速遞-深度學習醫療AI最新文獻

Title 題目 AI-based association analysis for medical imaging using latent-spacegeometric confounder correction 基于人工智能的醫學影像關聯分析&#xff1a;利用潛在空間幾何混雜因素校正法 01 文獻速遞介紹 人工智能&#xff08;AI&#xff09;已成為各個領域的…

開源免費虛擬化軟件PVE功能介紹

Proxmox VE&#xff08;PVE&#xff09;提供了一個基于 Web UI&#xff08;管理界面&#xff09;的虛擬化管理平臺&#xff0c;用戶可以通過瀏覽器管理 虛擬機&#xff08;VM&#xff09;、容器&#xff08;LXC&#xff09;、存儲、網絡、備份、用戶權限等。 一、PVE Web 界面…

新球體育比分狀態監控

文章目錄 目標分析監控邏輯代碼目標分析 網頁監控地址:aHR0cHM6Ly9saXZlLnRpdGFuMDA3LmNvbS9pbmRleDJpbjEuYXNweD9pZD0x 監控邏輯 比分等數據主要是依賴JS加載得到,通過ajax后端進行渲染 代碼 # -*- coding: utf-8 -*-import warnings warnings.filterwarnings(ignore) f…

【lodash的omit函數詳解 - 從入門到精通】

lodash的omit函數詳解 - 從入門到精通 小白視角&#xff1a;什么是omit&#xff1f; omit在英文中意為"忽略"或"省略"。在編程中&#xff0c;它就是從一個對象中刪除不需要的屬性&#xff0c;返回一個新對象。 // 原始對象 const person {name: "…

軟考筆記9——數據庫技術基礎

第九章節——數據庫技術基礎 數據庫技術基礎 第九章節——數據庫技術基礎一、基本概念1. 數據庫與數據庫系統2. 數據庫的三級模式2.1 內模式2.2 概念模式2.3 外模式2.4 數據庫的兩級映射2.5 數據庫設計的基本步驟 二、數據模型1. 基本概念2. E-R模型2.1 實體2.2 聯系2.3 屬性 3…

Django分頁教程及示例

推薦超級課程: 本地離線DeepSeek AI方案部署實戰教程【完全版】Docker快速入門到精通Kubernetes入門到大師通關課AWS云服務快速入門實戰目錄 完整代碼示例:結論Django的分頁模塊允許你將大量數據分割成更小的塊(頁面)。這對于以可管理的方式顯示項目列表,如博客文章或產品…