java虛擬機---JVM

JVM

JVM,也就是 Java 虛擬機,它最主要的作用就是對編譯后的 Java 字節碼文件逐行解釋,翻譯成機器碼指令,并交給對應的操作系統去執行。
在這里插入圖片描述
JVM 的其他特性有:

  • JVM 可以自動管理內存,通過垃圾回收器回收不再使用的對象并釋放內存空間。
  • JVM 包含一個即時編譯器 JIT,它可以在運行時將熱點代碼緩存到 codeCache 中,下次執行的時候不用再一行一行的解釋,而是直接執行緩存后的機器碼,執行效率會大幅提高。
    在這里插入圖片描述
注:JIT 和 JNI 的區別:
JIT 是“即時編譯”(Just-In-Time Compilation)的縮寫。
它是一種在程序運行時將字節碼(bytecode)編譯成機器碼的技術,主要用于提高程序的執行效率。JNI 是Java 提供的一種編程框架,允許 Java 代碼與用其他語言(如 C、C++)編寫的本地代碼交互。
通過 JNI,Java 程序可以調用本地方法(native methods),這些方法通常是用 C 或 C++ 實現的,
并編譯為動態鏈接庫(DLL 或 SO 文件)。反過來,本地代碼也可以調用 Java 方法
  • 任何可以通過 Java 編譯的語言,比如說 Groovy、Kotlin、Scala 等,都可以在 JVM 上運行。
“通過 Java 編譯”在問題中的含義是指“編譯成 Java 字節碼”,每種語言都有自己的專用編譯器。

JVM的組織架構

JVM 要解釋執行需要進行三個步驟:加載 .class 文件 -> 準備數據 -> 執行
因此 JVM 大致可以劃分為三個部分:類加載器、運行時數據區和執行引擎

在這里插入圖片描述

JVM內存模型

Java 虛擬機(JVM)在運行 Java 程序時,會將內存劃分為若干區域,每個區域有其特定的功能。
在這里插入圖片描述

  1. 程序計數器(Program Counter Register)

    • 作用:記錄當前線程正在執行的字節碼指令的地址,用于控制程序的執行流程。
    • 特點:每個線程都有獨立的程序計數器,線程之間互不干擾。
  2. Java 虛擬機(Java Virtual Machine Stacks)

    • 作用:為 Java 方法(非 native 方法)的執行提供內存空間。
    • 特點:每個線程擁有自己的虛擬機棧,棧中包含多個棧幀(Stack Frame)。每個棧幀對應一次方法調用,存儲局部變量表、操作數棧、動態鏈接和方法出口等信息。
  3. 本地方法棧(Native Method Stacks)

    • 作用:為 native 方法(用 C/C++ 等語言編寫的方法)提供內存支持。
    • 特點:與 Java 虛擬機棧類似,但專用于 native 方法的執行。
  4. Java (Java Heap)

    • 作用:存儲對象實例和數組。
    • 特點:JVM 中最大的內存區域,所有對象實例都在堆上分配內存。堆是垃圾收集器(GC)的主要管理區域。
  5. 方法區(Method Area)

    • 作用:存儲類的元數據信息(如類結構)、靜態變量、常量以及即時編譯器編譯后的代碼。
    • 特點:在 JDK 8 及之后,方法區被元空間(Metaspace)取代,元空間使用本地內存而非 JVM 堆內存。
  6. 運行時常量池(Runtime Constant Pool)

    • 作用:存儲編譯期生成的字面量(如字符串常量)和符號引用。
    • 特點:是方法區的一部分,包含每個類的常量池表。JDK 8 方法區變元空間,運行時常量池就放在堆上。
  7. 直接內存(Direct Memory)

    • 作用:不屬于 JVM 運行時數據區,但常用于 NIO(如 ByteBuffer)等場景。
    • 特點:使用本地內存,不受 JVM 堆大小限制。

內存區域變化

在這里插入圖片描述
主要是方法區到元空間,以及常量池的變化

字符串常量池,類常量池,運行時常量池存儲的都是什么啊?

1.字符串常量池
  • 字符串常量池主要存儲 字符串字面量,也就是在 Java 代碼中用雙引號括起來的字符串,例如 “Hello”、“World” 等。
  • 它的設計目的是為了復用這些字符串對象,確保 JVM 中每個唯一的字符串字面量只有一份,從而節省內存。
  • String s1 = “Hello”; String s2 = “Hello”;用 s1 == s2 驗證,結果為 true
  • 用 new String(“Hello”) 創建字符串,這個對象會分配在堆上,可以通過 String.intern() 方法將它放入字符串常量池。
2.類常量池
  • javac 將源文件編譯成 .class 文件,類常量池指的是這個文件的一部分,是在磁盤上的
  • 類常量池存儲了在編譯時生成的 字面量符號引用
  • 類加載階段JVM 加載 .class 文件 時,會把類常量池的內容 拷貝到方法區(JDK 8+ 在元空間)
  • 在解析階段,邏輯地址會被替換為 實際的內存地址,部分數據進入 運行時常量池。

例如對于一個類:

package example;import utils.Helper;  // 🔹 導入外部類public class Main {// 🔹 靜態常量static final double PI = 3.14159;// 🔹 實例變量private String name;// 🔹 構造方法public Main(String name) {this.name = name;}// 🔹 普通方法public void greet() {System.out.println("Hello, " + name);}public static void main(String[] args) {// 🔹 創建對象Main obj = new Main("Alice");obj.greet();// 🔹 調用外部類方法Helper.sayHello();}
}

類常量池為:

CONSTANT_Class      example/Main
CONSTANT_Class      utils/Helper  // 🔹 外部類
CONSTANT_Fieldref   example/Main.PI
CONSTANT_Fieldref   example/Main.name
CONSTANT_Methodref  example/Main.<init>  // 🔹 構造方法
CONSTANT_Methodref  example/Main.greet   // 🔹 方法
CONSTANT_Methodref  utils/Helper.sayHello  // 🔹 外部類方法
CONSTANT_String     "Hello, "
CONSTANT_String     "Alice"
CONSTANT_Double     3.14159
3.運行時常量池
  • 運行時常量池是 JVM 在運行時為每個類或接口維護的常量池
  • 運行時常量池支持動態鏈接和運行時解析,例如將對 System.out.println 的符號引用解析為具體的對象和方法地址
  • 它還能在程序運行時擴展,例如添加新的字符串常量
  • 運行時常量池 = 類常量池內容 + 直接引用 + 動態常量

堆內存

堆 是Java虛擬機(JVM)中內存管理的一個重要區域,主要用于存放對象實例和數組。隨著JVM的發展和不同垃圾收集器的實現,堆的具體劃分可能會有所不同,但通常可以分為以下幾個部分:
在這里插入圖片描述

  • 新生代:新生代又被劃分為 Eden 空間和兩個 Survivor 空間(From 和 To)
    • 新創建的對象會被分配到 Eden 空間。
    • Eden 區填滿時,會觸發一次 Minor GC,清除不再使用的對象。存活下來的對象會從 Eden 區移動到 Survivor 區
  • 老年代:對象在新生代中經歷多次 GC 后,如果仍然存活,會被移動到老年代。當老年代內存不足時,會觸發 Major GC,對整個堆進行垃圾回收。
  • 大對象區:在某些JVM實現中(如G1垃圾收集器),為大對象分配了專門的區域,這部分區域在老年代。

對象的內存布局

對象的內存布局是由 Java 虛擬機規范定義的,但具體的實現細節各有不同,如 HotSpot 和 OpenJ9 就不一樣。HotSpot:
在這里插入圖片描述

對象四種引用

四種分別是“強、軟、弱、虛”
在這里插入圖片描述

  • 強引用:Object obj = new Object(); 只要存在就不回收;
  • 軟引用:SoftReference softRef = new SoftReference<>(new Object()); 內存不足回收,常用于實現內存敏感的緩存(如圖片緩存),在內存壓力大時自動清理;
  • 弱引用:WeakReference weakRef = new WeakReference<>(new Object()); 一定回收,臨時引用,避免內存占用,比如 threadlocal 里的 key;
  • 虛引用:PhantomReference phantomRef = new PhantomReference<>(new Object(), queue); 通常與 ReferenceQueue 結合使用,當對象被回收時,虛引用會被放入關聯的 ReferenceQueue,在對象被回收時收到通知。虛引用不可達;
  • Java.lang.ref 包下的類

內存泄漏和內存溢出

用一個比較有味道的比喻來形容就是,內存溢出是排隊去蹲坑,發現沒坑了;內存泄漏,就是有人占著茅坑不拉屎,導致坑位不夠用。
在這里插入圖片描述

  • 內存泄漏舉例:1、靜態屬性導致內存泄露 2、 未關閉的資源 3、 使用ThreadLocal
  • 靜態屬性(用 static 修飾的字段)屬于類級別,其生命周期與類的加載和卸載綁定,其超長的生命周期和全局可見性導致更容易內存泄漏
    ThreadLocal—java

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

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

相關文章

VectorBT:使用PyTorch+LSTM訓練和回測股票模型 進階四

VectorBT&#xff1a;使用PyTorchLSTM訓練和回測股票模型 進階四 本方案融合 LSTM 時序預測與動態風險控制。系統采用混合架構&#xff0c;離線訓練構建多尺度特征工程和雙均線策略&#xff0c;結合在線增量更新持續優化模型。技術要點包括三層特征篩選、波動率動態倉位管理、混…

前端中rem,vh,vw

1. rem&#xff08;Root EM&#xff09; 參照對象 基準&#xff1a;相對于 根元素&#xff08;<html>&#xff09;的 font-size 計算。 默認情況下&#xff0c;瀏覽器的根 font-size 為 16px&#xff08;即 1rem 16px&#xff09;&#xff0c;但可通過 CSS 修改&#…

詳解 MySQL 常見的存儲引擎及它們之間的區別

MySQL 支持多種存儲引擎&#xff0c;每種引擎針對不同的應用場景提供了特定的特性和優化。下面是幾種常見的存儲引擎以及它們之間的主要區別&#xff1a; 常見存儲引擎 1. InnoDB&#xff08;重點&#xff09; 事務支持&#xff1a; 完全支持 ACID 事務&#xff0c;確保數據一…

html+css+js 實現一個貪吃蛇小游戲

目錄 游戲簡介 游戲功能與特點 如何玩轉貪吃蛇 游戲設計與實現 HTML結構 JavaScript核心實現 代碼結構&#xff1a; 效果 關于“其他游戲” 游戲簡介 貪吃蛇是一款經典的單人小游戲&#xff0c;玩家通過控制蛇的移動&#xff0c;吃掉食物來增加長度&#xff0c;避免撞…

GLSL(OpenGL 著色器語言)基礎語法

GLSL&#xff08;OpenGL 著色器語言&#xff09;基礎語法 GLSL&#xff08;OpenGL Shading Language&#xff09;是 OpenGL 計算著色器的語言&#xff0c;語法類似于 C 語言&#xff0c;但提供了針對 GPU 的特殊功能&#xff0c;如向量運算和矩陣運算。 著色器的開頭總是要聲明…

ngx_http_core_merge_srv_conf

定義在 src\http\ngx_http_core_module.c static char * ngx_http_core_merge_srv_conf(ngx_conf_t *cf, void *parent, void *child) {ngx_http_core_srv_conf_t *prev parent;ngx_http_core_srv_conf_t *conf child;ngx_str_t name;ngx_http_server_name_t…

uni-app:firstUI框架的選擇器Select改造,添加一個搜索的插槽

<fui-select :show"showSiteType" :options"siteTypeList" textKey"dict_label" title"請選擇站點類型" confirm"chooseSiteType" close"onCloseSiteType"><template v-slot:search><view><…

Debian/Ubuntu的networking的`/etc/network/interfaces`配置文件,如何配置route路由

Debian/Ubuntu的networking的/etc/network/interfaces配置文件,如何配置route路由 在 Debian/Ubuntu 系統中&#xff0c;通過 /etc/network/interfaces 配置文件配置路由&#xff08;靜態路由或默認路由&#xff09;可以通過以下方式實現。以下是詳細配置方法及示例&#xff1…

天梯賽 L2-024 部落

一個并查集題目&#xff0c;難點就在于統計總人數&#xff0c;使用map即可&#xff0c;還有需要注意的是編號不一定是小于N的&#xff0c;小于10000的&#xff0c;需要注意。 #include<bits/stdc.h> using namespace std; const int N 10010; int fa[N]; int find(int …

uniapp 微信小程序 使用ucharts

文章目錄 前言一、組件功能概述二、代碼結構分析2.1 模板結構 總結 前言 本文介紹一個基于 Vue 框架的小程序圖表組件開發方案。該組件通過 uCharts 庫實現折線圖的繪制&#xff0c;并支持滾動、縮放、觸摸提示等交互功能。文章將從代碼結構、核心方法、交互實現和樣式設計等方…

Axure項目實戰:智慧運輸平臺后臺管理端-承運商管理(中繼器篩選)

親愛的小伙伴,在您瀏覽之前,煩請關注一下,在此深表感謝! 課程主題:智慧運輸平臺后臺管理端 主要內容:承運商管理 應用場景:條件篩選、增刪改查操作、臺賬制作 案例展示: 正文內容: 承運商管理模塊主要解決平臺對承運商的管理,包括新增承運商作,審核承運商申請,修…

[論文筆記] Deepseek技術報告解讀: MLAMTP

1. RMSNorm 歸一化層 class RMSNorm(nn.Module):def __init__(self, dim: int, eps: float = 1e-8):super().__init__()self.eps = epsself.weight = nn.Parameter(torch.ones(dim)) # 可學習的縮放參數def _norm(self, x: torch.Tensor):return x * torch.rsqrt(x.pow(2).me…

八款內網電腦監控軟件:探尋適配企業需求的數字化監管方案組合

數字化辦公的時代背景下&#xff0c;企業管理面臨著前所未有的挑戰。如何實現對員工辦公行為的高效管理&#xff0c;確保網絡資源的合理利用&#xff0c;成為眾多企業決策者和高級管理人員亟待解決的重要問題。內網電腦監控軟件作為一種有效的管理工具&#xff0c;應運而生。本…

Flutter求助貼

報錯信息&#xff1a;The Dart VM Service was not discovered after 30 seconds. This is taking much longer than expected... 基本情況&#xff1a; 硬件&#xff1a;mac(15.3.1)&#xff0c;iPad(iOS 16.6),iPhone 16 pro(iOS 18.4) 項目環境 flutter&#xff1a;3.16…

React(九)React Hooks

初識Hook 我們到底為什么需要hook那? 函數組件類組件存在問題 函數組件存在的問題&#xff1a; import React, { PureComponent } from reactfunction HelloWorld2(props) {let message"Hello world"// 函數式組件存在的缺陷&#xff1a;// 1.修改message之后&a…

數據清洗的具體內容

&#xff08;一&#xff09;ETL介紹 “ETL&#xff0c;是英文Extract-Transform-Load的縮寫&#xff0c;用來描述將數據從來源端經過抽取&#xff08;Extract&#xff09;、轉換&#xff08;Transform&#xff09;、加載&#xff08;Load&#xff09;至目的端的過程。ETL一詞較…

【動手學深度學習】#7 現代卷積神經網絡

主要參考學習資料&#xff1a; 《動手學深度學習》阿斯頓張 等 著 【動手學深度學習 PyTorch版】嗶哩嗶哩跟李牧學AI 概述 硬件性能和大數據的發展為深度卷積神經網絡&#xff08;AlexNet&#xff09;的實現提供了條件。VGG首次將塊的思想用于搭建網絡。NiN將多層感知機應用在…

Jenkins + CICD流程一鍵自動部署Vue前端項目(保姆級)

git倉庫地址&#xff1a;參考以下代碼完成,或者采用自己的代碼。 南澤/cicd-test 拉取項目代碼到本地 使用云服務器或虛擬機采用docker部署jenkins 安裝docker過程省略 采用docker部署jenkins&#xff0c;注意這里的命令&#xff0c;一定要映射docker路徑&#xff0c;否則無…

使用 libevent 處理 TCP 粘包問題(基于 Content-Length 或雙 \r\n)

在基于 libevent 的 TCP 服務器開發中,處理消息邊界是常見需求。以下是兩種主流分包方案的完整實現: 一、基于 Content-Length 的分包方案 1.1 數據結構設計 typedef struct {struct bufferevent *bev;int content_length; // 當前消息的預期長度int received_bytes; //…

酶動力學預測工具CataPro安裝教程

簡介&#xff1a;預測酶動力學參數是酶發現和酶工程中的一項重要任務。在此&#xff0c;研究人員基于蛋白質語言模型、小分子語言模型和分子指紋&#xff0c;提出了一種名為 CataPro 的新酶動力學參數預測算法。該研究從 BRENDA 和 SABIO-RK 數據庫中收集了最新的轉化率&#x…