JAVA虛擬機(JVM)學習

入門

什么是JVM

JVM:Java Virtual Machine,Java虛擬機。
JVM是JRE(Java Runtime Environment)的一部分,安裝了JRE就相當于安裝了JVM,就可以運行Java程序了。JVM的作用:加載并執行Java字節碼(.class)文件。

常見的JVM

在這里插入圖片描述
在這里插入圖片描述
Java虛擬機要實現Java虛擬機規范,它定義了Java虛擬機的結構、指令集、類文件格式、類加載器、字節碼執行引擎等方面的內容。

JVM結構

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

執行引擎Execution Engine

JVM執行引擎通常由兩個主要組成部分構成:解釋器和即時編譯器(Just-In-Time Compiler,JIT Compiler)。

解釋器:當Java字節碼被加載到內存中時,解釋器逐條解析并直接執行字節碼指令。
即時編譯器(JIT Compiler):即時編譯器將字節碼動態地編譯為本地機器碼,之后再執行。即時編譯器根據運行時的性能數據和優化技術,對經常執行的熱點代碼進行優化,從而提高程序的性能。即時編譯器可以將經過優化的代碼緩存起來,以便下次再次執行時直接使用。
在這里插入圖片描述

本地方法接口Native Interface

本地接口的作用是融合不同的編程語言為 Java 所用。當Java代碼調用本地方法(被native所修飾的方法)時,JVM會將控制權轉移到本地方法實現所在的本地庫本地庫是一個包含本地方法實現的動態鏈接庫(DLL - windows函數庫)或共享對象文件(SO - Linux函數庫)。它是使用其他編程語言編寫的,通常是為了與底層操作系統或硬件進行交互。本地庫可以通過JNI加載到JVM中,并提供給Java代碼調用。
例如Thread類中有一些標記為native的方法 操作底層操作系統線程

本地方法棧Native Method Stack

本地方法棧(Native Method Stack):本地方法棧存儲了從Java代碼中調用本地方法時所需的信息。是線程私有的。
本地方法棧是JVM專門為調用非Java語言方法而設計的,它與操作系統和硬件交互,通過JNI為Java程序提供更強大的功能。每個線程都有自己的本地方法棧,保證本地方法的調用是獨立且線程安全的。

PC寄存器(程序計數器PC Register)

PC寄存器(程序計數器,Program Counter Register)是JVM中線程私有的一塊小內存區域。用于記錄當前線程正在執行的字節碼指令的地址或行號。它類似于一個指針,指向線程正在執行的字節碼指令的下一條指令。
在這里插入圖片描述

類加載器ClassLoader

類加載器(ClassLoader)是JVM的一個關鍵組件,用于動態加載、鏈接和初始化Java類。它的主要職責是在程序運行時將類的字節碼加載到JVM中,以便JVM可以執行這些類。類加載器是一個負責加載類的對象,用于實現類加載過程中的加載這一步。每個 Java 類都有一個引用指向加載它的 ClassLoader。數組類不是通過 ClassLoader 創建的(數組類沒有對應的二進制字節流),是由 JVM 直接生成的。
如果一個類加載器收到了類加載的請求,它首先不會自己去嘗試加載這個類,而是把請求委托給父加載器去完成,即雙親委派模型

虛擬機棧stack

棧也叫棧內存,主管Java程序的運行,是在線程創建時創建,每個線程都有自己的棧,它的生命周期是跟隨線程的生命周期,線程結束棧內存也就釋放,是線程私有的。線程上正在執行的每個方法都各自對應一個棧幀(Stack Frame)。
JVM對Java棧的操作只有兩個,就是對棧幀的壓棧和出棧,遵循“先進后出”或者“后進先出”原則。
一個線程中只能由一個正在執行的方法(當前方法),因此對應只會有一個活動的當前棧幀。
在這里插入圖片描述
棧溢出(StackOverflowError):通常在遞歸調用

棧幀

棧幀是一個內存區塊,是一個數據集,包含方法執行過程中的各種數據信息。
在這里插入圖片描述

局部變量表(Local Variables)

也叫本地變量表。存儲方法參數和方法體內的局部變量:8種基本類型變量、對象引用(reference)。

操作數棧(Operand Stack)

作用:也是一個棧,在方法執行過程中根據字節碼指令記錄當前操作的數據,將它們入棧或出棧。用于保存計算過程的中間結果,同時作為計算過程中變量的臨時存儲空間。

public class OperandStackDemo {public static void main(String[] args) {int i = 15;int j = 8;int k = i + j;}
}

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

動態鏈接(Dynamic Linking)

作用:可以知道當前幀執行的是哪個方法。指向運行時常量池中方法的符號引用。程序真正執行時,類加載到內存中后,符號引用會換成直接引用。
在這里插入圖片描述

方法返回地址(Return Address)

可以知道調用完當前方法后,上一層方法接著做什么,即“return”到什么位置去。存儲當前方法調用完畢后下一條指令的地址

完整一個線程內存結構在這里插入圖片描述
java -Xss 可以設置棧大小

方法區Method Area

被所有線程共享,它用于存儲已被虛擬機加載的類型信息、常量、靜態變量、即時編譯器編譯后的代碼緩存等

堆heap

堆是線程共享

堆、棧、方法區的關系

在這里插入圖片描述

HotSpot是使用指針的方式來訪問對象:

  • 內存用于存放對象和數組
  • 中會存放指向對象類型數據的地址
  • 中會存放指向堆中的對象的地址在這里插入圖片描述

堆空間

一個Java程序運行起來對應一個進程,一個進程對應一個JVM實例,一個JVM實例中有一個運行時數據區。
在 Java 虛擬機(JVM)中,堆空間是管理 Java 對象的內存區域。堆空間的主要作用是動態分配和管理 Java 對象的內存,在JVM啟動的時候被創建,并且一個JVM實例只存在一個堆內存,堆內存的大小是可以調節的。

堆空間劃分

堆內存邏輯上分為三部分:

  • Young Generation Space 新生代/年輕代 Young/New
  • Tenured generation space 老年代/養老代 Old/Tenured
  • Permanent Space/Meta Space 永久代/元空間 Permanent/Meta

新生代又劃分為:

  • 伊甸園區(Eden space)
  • 和幸存者區(Survivor space) 。
    幸存者區有兩個:
  • S0區(Survivor 0 space)
  • S1區(Survivor 1 space)

堆內存內部空間所占比例:

  • 新生代與老年代的默認比例: 1:2
  • 伊甸園區與幸存者區的默認比例是:8:1:1

配置堆大小
-Xms600m -Xmx600m -Xmn200m

  • Xms表示堆的起始內存,等價于-XX:InitialHeapSize,默認是物理電腦內存的1/64。

  • Xmx表示堆的最大內存,等價于-XX:MaxHeapSize,默認是物理電腦內存的1/4。
    通常會將-Xms和-Xmx配置相同的值,目的是為了在Java垃圾回收機制清理完堆區后,不需要重新分隔計算堆區的大小,從而提高性能。

JDK1.8及之后堆空間

在這里插入圖片描述

堆空間工作流程

學不明白的了解即可

垃圾回收GC

在C/C++這類沒有自動垃圾回收機制的語言中,一個對象如果不再使用,需要手動釋放,Java中為了簡化對象的釋放,引入了自動的垃圾回收(Garbage Collection簡稱GC)機制。通過垃圾回收器來對不再使用的對象完成自動的回收,垃圾回收器主要負責對堆上的內存進行回收。其他很多現代語言比如C#、Python、Go都擁有自己的垃圾回收器
在這里插入圖片描述
線程不共享的部分,都是伴隨著線程的創建而創建,線程的銷毀而銷毀。因此線程不共享的程序計數器、虛擬機棧、本地方法棧中沒有垃圾回收。

方法區的垃圾回收

方法區中能回收的內容主要就是不再使用的類。判定一個類可以被卸載。需要同時滿足下面三個條件:
1、此類所有實例對象沒有在任何地方被引用,在堆中不存在任何該類的實例對象以及子類對象。
2、該類對應的 java.lang.Class 對象沒有在任何地方被引用。
3、加載該類的類加載器沒有在任何地方被引用。

堆的垃圾回收

Java堆中的對象是否能被回收,是根據對象是否被引用來決定的。如果對象被引用了,說明該對象還在使用,不允許被回收。

垃圾判斷

判斷堆上的對象是否被引用方法:引用計數法(已摒棄)和可達性分析法。

可達分析法

將一系列GC Root的集合作為起始點,按照從上至下的方式搜索所有能夠被該合集引用到的對象(是否可達),并將其加入到該和集中,這個過程稱之為標記(mark),被標記的對象是存活對象。 最終,未被探索到的對象便是死亡的,可以回收的。
在這里插入圖片描述

垃圾回收算法

當成功區分出內存中存活對象和死亡對象后,GC接下來的任務就是執行垃圾回收。有以下算法:
標記-清除算法(Mark-Sweep)
復制算法(Copying)
標記壓縮算法(Mark-Compact)
分代收集算法(Generational-Collection)

垃圾收集器

如果說收集算法是內存回收的方法論,垃圾收集器就是內存回收的具體實現
七款經典垃圾收集器:
在這里插入圖片描述
算法和收集器了解即可

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

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

相關文章

【數據結構與算法】——堆(補充)

前言 上一篇文章講解了堆的概念和堆排序,本文是對堆的內容補充 主要包括:堆排序的時間復雜度、TOP 這里寫目錄標題 前言正文堆排序的時間復雜度TOP-K 正文 堆排序的時間復雜度 前文提到,利用堆的思想完成的堆排序的代碼如下(包…

什么是柜臺債

柜臺債(柜臺債券業務)是指通過銀行等金融機構的營業網點或電子渠道,為投資者提供債券買賣、托管、結算等服務的業務模式。它允許個人、企業及機構投資者直接參與銀行間債券市場的交易,打破了以往僅限機構參與的壁壘。以下是綜合多…

【Android讀書筆記】讀書筆記記錄

文章目錄 一. Android開發藝術探索1. Activity的生命周期和啟動模式1.1 生命周期全面分析 一. Android開發藝術探索 1. Activity的生命周期和啟動模式 1.1 生命周期全面分析 onPause和onStop onPause后會快速調用onStop,極端條件下直接調用onResume 當用戶打開新…

Java對象內存結構詳解

Java對象內存結構詳解 Java對象在JVM內存中的存儲結構可以分為三個部分:對象頭(Header)、實例數據(Instance Data)和對齊填充(Padding)。以下是64位JVM(開啟壓縮指針)下…

【TI MSPM0】Printf重定向學習

一、新建工程 通過XDS110與電腦進行通信。 選擇這兩個引腳 需要添加這兩個頭文件 在程序中添加這三個函數即可對printf進行重定向 二、封裝函數 另一種方法 封裝一個函數,定義一個數組

深度強化學習基礎 0:通用學習方法

過去自己學習深度強化學習的痛點: 只能看到各種術語、數學公式勉強看懂,沒有建立清晰且準確關聯 多變量交互關系浮于表面,有時候連環境、代理控制的變量都混淆 模型種類繁多,概念繁雜難整合、對比或復用,無框架分析所…

asm匯編源代碼之-字庫轉換程序

將標準的16x16點陣漢字庫(下載16x16漢字庫)轉換成適合VGA文本模式下顯示的點陣漢字庫 本程序需要調用file.asm中的子程序,所以連接時需要把file連接進來,如下 C:\> tlink chghzk file 調用參數描述如下 C:\> chghzk ; 無調用參數,轉換標準庫文件(SRC16.FNT)為適合VGA…

uniapp轉換markdown

效果 AI智能體 微信小程序 流式 1.安裝Node.js 參考:2024最新版Node.js下載安裝及環境配置教程(非常詳細)_node.js 安裝-CSDN博客 2.需要克隆項目到本地或直接到項目地址下載壓縮包。 參考:uniapp中解析markdown支持網頁和小程序_uniapp ma…

用java代碼如何存取數據庫的blob字段

一.業務 在業務中我們被要求將文件或圖片等轉成 byte[] 或 InputStream存到數據庫的Blob類型的字段中. 二.Blob類型介紹 在 MySQL 中,Blob 數據類型用于存儲二進制數據。MySQL 提供了四種不同的 Blob 類型: TINYBLOB: 最大存儲長度為 255 個字節。BL…

qemu(2) -- 定制開發板

1. 前言 qemu支持自定義開發板,本文就記錄一下折騰的過程。基于qemu-10.0.0-rc3添加x210vb3s開發板。 2. 添加板卡文件 網上參考了一些文章,有些文章使用的版本和我的不一樣,折騰起來費了點時間,最后發現還是直接參考qemu中已有…

Python在糖尿病分類問題上尋找具有最佳 ROC AUC 分數和 PR AUC 分數(決策樹、邏輯回歸、KNN、SVM)

Python在糖尿病分類問題上尋找具有最佳 ROC AUC 分數和 PR AUC 分數(決策樹、邏輯回歸、KNN、SVM) 問題模板解題思路1. 導入必要的庫2. 加載數據3. 劃分訓練集和測試集4. 數據預處理5. 定義算法及其參數6. 存儲算法和對應指標7. 訓練模型并計算指標8. 找…

CPU(中央處理器)

一、CPU的定義與核心作用 CPU 是計算機的核心部件,負責 解釋并執行指令、協調各硬件資源 以及 完成數據處理,其性能直接影響計算機的整體效率。 核心功能: 從內存中讀取指令并譯碼。執行算術邏輯運算。控制數據在寄存器、內存和I/O設備間的…

上層 Makefile 控制下層 Makefile 的方法

在復雜的項目中,通常會將項目劃分為多個模塊或子項目,每個模塊都有自己的 Makefile。上層 Makefile 的作用是協調和控制這些下層 Makefile 的構建過程。下面是幾種常見的示例,實現上層 Makefile 對下層 Makefile 的控制。 直接調用&#xff1…

prompts提示詞經典模板

prompts.py 中的提示詞模板詳解 文件中定義了兩個核心提示詞模板:REASON_PROMPT 和 RELEVANT_EXTRACTION_PROMPT。這兩個模板在 DeepResearcher 的推理過程中扮演著關鍵角色。下面我將詳細解析這兩個模板的結構和功能。 REASON_PROMPT 詳解 REASON_PROMPT 是用于指…

使用python獲取電腦硬盤信息

import psutil# 獲取硬盤信息 disk_partitions psutil.disk_partitions() print(disk_partitions) for partition in disk_partitions:print(f"設備: {partition.device}")print(f"掛載點: {partition.mountpoint}")print(f"文件系統類型: {partitio…

HarmonyOS-ArkUI V2裝飾器: @Provider和@Consumer裝飾器:跨組件層級雙向同步

作用 我們在之前學習的那些控件中,各有特點,也各有缺陷,至今沒有痛痛快快的出現過真正能跨組件的雙向綁定的裝飾器。 比如 @Local裝飾器,不能跨組件@Param裝飾器呢,能跨組件傳遞,但是僅僅就是下一層組件接收參數。另外,它是單向傳遞,不可被重新賦值。如果您非要改值則…

索引下推(Index Condition Pushdown, ICP)

概念 索引下推是一種數據庫查詢優化技術,通過在存儲引擎層面應用部分WHERE條件來減少不必要的數據讀取。它特別適用于復合索引的情況,因為它可以在索引掃描階段就排除不符合全部條件的數據行,而不是將所有可能匹配的記錄加載到服務器層再進行…

idea在線離線安裝插件教程

概述 對于小白來說,剛使用idea時,還有很多不懂的地方,這里,簡單介紹下如何安裝插件。讓小白能容易上手全盤idea。 1、File -> Settings 2、找到 Plugins -> Marketplace 3、安裝 3.1、在線安裝 輸入想搜索的內容&#x…

豪越賦能消防安全管控,解鎖一體化內管“安全密碼”

在消防安全保障體系中,內部管理的高效運作是迅速、有效應對火災及各類災害事故的重要基礎。豪越科技憑借在消防領域的深耕細作與持續創新,深入剖析消防體系內部管理的痛點,以自主研發的消防一體化安全管控平臺,為行業發展提供了創…

ES6學習03-字符串擴展(unicode、for...of、字符串模板)和新方法()

一、字符串擴展 1. eg: 2.for...of eg: 3. eg: 二。字符串新增方法 1. 2. 3. 4. 5.