java進階1——JVM

java進階——JVM

1、JVM概述
作用

Java 虛擬機就是二進制字節碼的運行環境,負責裝載字節碼到其內部,解釋/編譯為對 應平臺上的機器碼指令行,每一條 java 指令,java 虛擬機中都有詳細定義,如怎么取操 作數,怎么處理操作數,處理結果放在哪兒。

特點:

一次編譯到處運行

自動內存管理

自動垃圾回收功能

現在的 JVM 不僅可以執行 java 字節碼文件,還可以執行其他語言編譯后的字節碼文件,是一 個跨語言平臺.

在這里插入圖片描述

JVM的位置

在這里插入圖片描述

JVM 是運行在操作系統之上的,它與硬件沒有直接的交互。

在這里插入圖片描述

構成部分:
JVM 整體組成可分為以下四個部分:

1.類加載器(ClassLoader)

2.運行時數據區(Runtime Data Area)

3.執行引擎(Execution Engine)

4.本地庫接口(Native Interface)

簡圖:

在這里插入圖片描述

詳細圖:

在這里插入圖片描述

各個組成部分的用途

程序在執行之前先要把 java 代碼轉換成字節碼(class 文件),jvm 首先需要 把字節碼通過一定的方式 類加載器(ClassLoader) 把文件加載到內存中 的運行時數據區(Runtime Data Area) ,而字節碼文件是 jvm 的一套指 令集規范,并不能直接交個底層操作系統去執行,因此需要特定的命令解析 器執行引擎(ExecutionEngine) 將字節碼翻譯成底層系統指令再交由 CPU 去執行,而這個過程中需要調用其他語言的接口 本地庫接口(Native Interface) 來實現整個程序的功能,這就是這 4 個主要組成部分的職責與 功能。

而我們通常所說的 JVM 組成指的是運行時數據區(Runtime Data Area),因為通常需要程序員調試分析的區域就是“運行時數據區”,或者 更具體的來說就是“運行時數據區”里面的 Heap(堆)模塊。

Java 代碼的執行流程

在這里插入圖片描述

在這里插入圖片描述

Java 編譯器編譯過程中,任何一個節點執行失敗就會造成編譯失敗。雖然各個 平臺的 java 虛擬機內部實現細節不盡相同,但是它們執行的字節碼內容卻是一 樣的。 JVM 主要任務就是負責將字節碼裝載到其內部,解釋/編譯為對應平臺上的機器 指令執行。JVM 使用類加載器(Class Loader)裝載 class 文件。 類加載完成后,會進行字節碼校驗,字節碼校驗通過之后 JVM 解釋器會把字節 碼翻譯成機器碼交由操作系統執行。 但不是所有的代碼都是解釋執行,JVM 對此作了優化,比如 HotSpot 虛擬機, 它本身提供了 JIT(Just In Time)編譯器.

JVM 架構模型

Java 編譯器輸入的指令流基本上是一種基于棧的指令集架構,另一種指令集架構 是基于寄存器的指令集架構.

基于棧式架構的特點

設計和實現更簡單,適用于資源受限的系統. 使用零地址指令方式分配,其執行過程依賴于操作棧,指令集更小,編譯器容易實 現.不需要硬件支持,可移植性好,更好實現跨平臺.

基于寄存器式架構特點:

指令完全依賴于硬件,可移植性差.

性能優秀,執行更高效.

完成一項操作使用的指令更少.

在這里插入圖片描述

使用 javap -v class 文件可以將 class 文件反編譯為指令集.

所以由于跨平臺的設計,Java 指令集都是根據棧來設計的,不同 CPU 架構不同,

所以不能設計為基于寄存器的.

優點是跨平臺,指令集小,編譯器容易實現.

缺點是性能下降,實現同樣功能需要更多的指令.

2、JVM結構-類加載

類加載子系統

在這里插入圖片描述

作用:

類加載器子系統負責從文件系統或者網絡中加載 class 文件。

主負責加載類, 有執行引擎執行,存放在方法區(元空間)

扮演者的是一個快遞員的角色

在這里插入圖片描述

  1. class file 存在于硬盤上,可以理解為設計師畫在紙上的模板,而最終這個模板 在執行的時候是要加載 JVM 當中來,根據這個模板實例化出 n 個一模一樣的實 例.

  2. class file 加載到 JVM 中,被稱為 DNA 元數據模板,放在方法區中.

  3. 在.class–>JVM–>最終稱為元數據模板,此過程就要有一個運輸工具(類加 載器 Class Loader),扮演一個快遞員的角色.

類加載過程

在這里插入圖片描述

1.加載

根據類的地址,從硬盤上讀取類的信息,

將信息讀入到方法區,生成Class類的對象

2.鏈接

驗證: 驗證字節碼文件格式是否是當前虛擬機所支持的文件格式,語法格式

準備: 為靜態成員分配默認值(int 默認值0) 注意static final在編譯期間賦值

解析: 將字節碼中符號引用 替換 成 直接引用

例如: 編寫代碼 方法1 中調用 方法2 (符號引用)

類加載到內存后把符號的引用地址 換成 內存的地址引用

3.初始化

類什么時候初始化

1 )創建類的實例,也就是 new 一個對象

2)訪問某個類或接口的靜態變量,或者對該靜態變量賦值

3)調用類的靜態方法

4)反射(Class.forName(“”))

5)初始化一個類的子類(會首先初始化子類的父類)

類的初始化順序

先初始化靜態的,多個靜態的按照從上向下的順序執行,

如果類有父類,則先初始化父類的靜態,然后是子類.

如果是創建對象,先調用父類的構造方法,然后是子類自己的構造方法

類加載器

在這里插入圖片描述

站在JVM的角度劃分: 啟動類加載器(不是java語言寫的),

其他類加載(都是java語言寫的)

站在開發者的角度:

啟動類加載器(引導類加加載器)

這個類加載器使用 C/C++語言實現,嵌套在 JVM 內部.它用來加載 java 核心類

庫.

負責加載擴展類加載器和應用類加載器

加載<JAVA_HOME>lib

擴展類加載類器

是由java語言實現的 繼承自ClassLoader

負責加載 E:ProgramFilesJavajdk1.8.0_261jrelibext

應用程序類加載器(系統類加載器)

Java 語言編寫的,由 sun.misc.Launcher$AppClassLoader 實現.

派生于 ClassLoader 類.

負責加載用戶類

用戶自定義類加載器(例如tomcat)

雙親委派機制

在這里插入圖片描述

類的加載時按需加載,使用時才會加載.

類加載時,加載器都會將類交給父級類加載器加載.

如果所有的父級加載沒有找到類,

則一級一級的向下委派查找.

如果都找不到,那么就會拋出異常.

目的: 為了安全考慮 避免了用戶自己寫的類覆蓋了系統中的類.

類的主動使用和被動使用
主動使用會觸發類的初始化

new

使用靜態變量 靜態方法

反射加載類

執行main方法

子類被初始化 父類也會觸發初始化

被動使用不會觸發了類的初始化

僅僅使用類的靜態常量 而且是直接賦字面量的那種

將類作為數組的類型聲明使用時不會觸發初始化

3、JVM 運行時數據區

堆,方法區(元空間) 主要用來存放數據 是線程共享的.

程序計數器,本地方法棧,虛擬機棧 是運行程序的,是線程私有的.

程序計數器

jvm中的程序計數器不是cpu中的寄存器, 可以理解為計數器.

是一塊非常小的內存空間,運行速度是最快的,不會出現內存溢出情況.

作用:記錄當前線程中的方法執行的位置. 以便于cpu在切換執行時,記錄程序執行的為位置.

在運行時數據區中唯一一個不會出現內存溢出的區域.

本地方法棧

當我們在程序中調用本地方法時,會將本地方法加載到 本地方法棧中執行.

也是線程私有的, 如果空間不夠,也會出現棧溢出錯誤. hashCode();

虛擬機棧

背景: java為了移植性好(跨平臺) 所以將運行程序的設計架構為棧結構運行, 而不是依賴于cpu的寄存器架構.

棧是運行時的單位(加載方法運行),

而堆是存儲的單位(存儲對象的).

作用運行方法 一個方法就是一個棧幀. 棧幀中包含( 局部變量(基本類型,引用地址) 方法地址,返回地址)

棧中的操作 入棧,出棧
棧中異常 StackOverflowError:線程請求的棧深度大于虛擬機所允許的深度。 遞歸調用方法次數過多

棧中存儲方法運行時需要的數據

棧的運行原理 第一個方法被加載 入棧 在方法中調用了其他方法, 另一個方法入棧 方法運行結束后出棧.

棧幀的結構:
局部變量表: 方法參數,定義的局部變量, 基本值類型直接存值, 引用類型存地址.

操作數棧

動態鏈接

方法返回地址

4、Java 堆

5、方法區

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

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

相關文章

搭建集成開發環境PyCharm

1.下載安裝Python&#xff08;建議下載并安裝3.9.x&#xff09; https://www.python.org/downloads/windows/ 要注意勾選“Add Python 3.9 to PATH”復選框&#xff0c;表示將Python的路徑增加到環境變量中 2.安裝集成開發環境Pycharm http://www.jetbrains.com/pycharm/…

vue2-v-if和v-for的優先級

vue2-v-if和v-for的優先級 1.v-if和v-for的作用 v-if是條件渲染&#xff0c;只有條件表達式true的情況下&#xff0c;才會渲染v-for是基于一個數組來渲染一個列表&#xff0c;在v-for的時候&#xff0c;保證給每個元素添加獨一無二的key值&#xff0c;便于diff算法進行優化 …

通過C/C++編程語言實現“數據結構”課程中的鏈表

引言 鏈表(Linked List)是數據結構中最基礎且最重要的線性存儲結構之一。與數組的連續內存分配不同,鏈表通過指針將分散的內存塊串聯起來,具有動態擴展和高效插入/刪除的特性。本文將以C/C++語言為例,從底層原理到代碼實現,手把手教你構建完整的鏈表結構,并深入探討其應…

《redis4.0 通信模塊源碼分析(一)》

【redis導讀】redis作為一款高性能的內存數據庫&#xff0c;面試服務端開發&#xff0c;redis是繞不開的話題&#xff0c;如果想提升自己的網絡編程的水平和技巧&#xff0c;redis這款優秀的開源軟件是很值得大家去分析和研究的。 筆者從大學畢業一直有分析redis源碼的想法&…

開源安全一站式構建!開啟企業開源治理新篇章

在如今信息技術日新月異、飛速發展的數字化時代&#xff0c;開源技術如同一股強勁的東風&#xff0c;為企業創新注入了源源不斷的活力&#xff0c;然而&#xff0c;正如一枚硬幣有正反兩面&#xff0c;開源技術的廣泛應用亦伴隨著不容忽視的挑戰。安全風險如影隨形&#xff0c;…

DeePseek結合PS!批量處理圖片的方法教程

? ? 今天我們來聊聊如何利用deepseek和Photoshop&#xff08;PS&#xff09;實現圖片的批量處理。 傳統上&#xff0c;批量修改圖片尺寸、分辨率等任務往往需要編寫腳本或手動處理&#xff0c;而現在有了AI的輔助&#xff0c;我們可以輕松生成PS腳本&#xff0c;實現自動化處…

13.代理模式(Proxy Pattern)

定義 代理模式&#xff08;Proxy Pattern&#xff09; 是一種結構型設計模式&#xff0c;它通過提供一個代理對象來控制對目標對象的訪問。代理對象作為客戶端與目標對象之間的中介&#xff0c;間接地訪問目標對象的功能。代理模式可以在不改變目標對象的情況下增加一些額外的…

DBeaver連接MySQL提示Access denied for user ‘‘@‘ip‘ (using password: YES)的解決方法

在使用DBeaver連接MySQL數據庫時&#xff0c;如果遇到“Access denied for user ip (using password: YES)”的錯誤提示&#xff0c;說明用戶認證失敗。此問題通常與數據庫用戶權限、配置錯誤或網絡設置有關。本文將詳細介紹解決此問題的步驟。 一、檢查用戶名和密碼 首先&am…

Python進行模型優化與調參

在數據科學與機器學習領域,模型的優化與調參是提高模型性能的重要步驟之一。模型優化可以幫助提高模型的準確性和泛化能力,而合理的調參則能夠充分發揮模型的潛力。這篇教程將重點介紹幾種常用的模型優化與調參方法,特別是超參數調整和正則化技術的應用。這些技術能夠有效地…

Verilog基礎(三):過程

過程(Procedures) - Always塊 – 組合邏輯 (Always blocks – Combinational) 由于數字電路是由電線相連的邏輯門組成的,所以任何電路都可以表示為模塊和賦值語句的某種組合. 然而,有時這不是描述電路最方便的方法. 兩種always block是十分有用的: 組合邏輯: always @(…

2024年12月 Scratch 圖形化(一級)真題解析 中國電子學會全國青少年軟件編程等級考試

202412 Scratch 圖形化&#xff08;一級&#xff09;真題解析 中國電子學會全國青少年軟件編程等級考試 一、單選題(共25題&#xff0c;共50分) 第 1 題 點擊下列哪個按鈕&#xff0c;可以將紅框處的程序放大&#xff1f;&#xff08; &#xff09; A. B. C. D. 標…

C++【深入 STL--list 之 迭代器與反向迭代器】

接前面的手撕list(上)文章&#xff0c;由于本人對于list的了解再一次加深。本文再次對list進行深入的分析與實現。旨在再一次梳理思路&#xff0c;修煉代碼內功。 1、list 基礎架構 list底層為雙向帶頭循環鏈表&#xff0c;問題是如何來搭建這個list類。可以進行下面的考慮&am…

如何打開vscode系統用戶全局配置的settings.json

&#x1f4cc; settings.json 的作用 settings.json 是 Visual Studio Code&#xff08;VS Code&#xff09; 的用戶配置文件&#xff0c;它存儲了 編輯器的個性化設置&#xff0c;包括界面布局、代碼格式化、擴展插件、快捷鍵等&#xff0c;是用戶全局配置&#xff08;影響所有…

wordpress外貿獨立站常用詢盤軟件

LiveChat LiveChat是一家提供實時聊天軟件的公司&#xff0c;幫助企業通過其平臺與客戶進行即時通訊&#xff0c;提高客戶滿意度和忠誠度。他們的產品允許企業在網站、應用程序或電子郵件等多個渠道與客戶互動&#xff0c;從而提升客戶體驗并促進銷售增長。 LiveChat的軟件特…

STM32 ADC模數轉換器

ADC簡介 ADC&#xff08;Analog-Digital Converter&#xff09;模擬-數字轉換器 ADC可以將引腳上連續變化的模擬電壓轉換為內存中存儲的數字變量&#xff0c;建立模擬電路到數字電路的橋梁 12位逐次逼近型ADC&#xff0c;1us轉換時間 輸入電壓范圍&#xff1a;0~3.3V&#xff0…

(2025,LLM,下一 token 預測,擴散微調,L2D,推理增強,可擴展計算)從大語言模型到擴散微調

Large Language Models to Diffusion Finetuning 目錄 1. 概述 2. 研究背景 3. 方法 3.1 用于 LM 微調的高斯擴散 3.2 架構 4. 主要實驗結果 5. 結論 1. 概述 本文提出了一種新的微調方法——LM to Diffusion (L2D)&#xff0c;旨在賦予預訓練的大語言模型&#xff08;…

DeepSeek 與 ChatGPT 對比分析

一、技術背景與研發團隊 ChatGPT 由 OpenAI 開發&#xff0c;自 2015 年 OpenAI 成立以來&#xff0c;經過多年的技術積累和迭代&#xff0c;從 GPT-1 到 GPT-4o&#xff0c;每一次升級都帶來了技術上的突破。OpenAI 擁有雄厚的技術實力和海量的數據、強大的算力支持&#xff…

學習threejs,pvr格式圖片文件貼圖

&#x1f468;??? 主頁&#xff1a; gis分享者 &#x1f468;??? 感謝各位大佬 點贊&#x1f44d; 收藏? 留言&#x1f4dd; 加關注?! &#x1f468;??? 收錄于專欄&#xff1a;threejs gis工程師 文章目錄 一、&#x1f340;前言1.1 ??PVR貼圖1.2 ??THREE.Mesh…

DeepSeek R1技術報告關鍵解析(8/10):DeepSeek-R1 的“aha 時刻”,AI 自主學習的新突破

1. 什么是 AI 的“aha 時刻”&#xff1f; 在強化學習過程中&#xff0c;AI 的推理能力并不是線性增長的&#xff0c;而是會經歷一些關鍵的“頓悟”時刻&#xff0c;研究人員將其稱為“aha 時刻”。 這是 AI 在訓練過程中突然學會了一種新的推理方式&#xff0c;或者能夠主動…

python:遞歸函數與lambda函數

遞歸函數&#xff1a;1.函數內調用自己 2.有一個出口 1.遞歸 一.有出口時 def sum(num):if num1:return 1return numsum(num-1) asum(3) print(a) #num3 3sum(2) #num2 2sum(1) #num1是返回1 #即3sum(2&#xff09;即32sum(1)即321運行結果 6 二.無出口時 def sum(num)…