JVM匯總

1.什么是JVM?

Java虛擬機,Java具有自動內存管理等一系列特性,為實現Java跨平臺,一次編譯處處執行。

2.JVM結構圖

3.類加載器-入口

加載class文件,將類信息存放到運行時數據區的方法區內存空間中

通過魔數和文件格式來判斷是否是class文件

類生命周期或加載過程

3.1 類加載器分類

  • 啟動類加載器(BootstrapClassLoader):由C++實現。

  • 擴展類加載器(ExtCla ssLoader/PlatformClassLoader):由Java實現,派生自ClassLoader類。

  • 應用程序類加載器(AppClassLoader):也叫系統類加載器。由Java實現,派生自ClassLoader類。

  • 自定義加載器 :程序員可以定制類的加載方式,派生自ClassLoader類。

3.2 雙生委派機制

類加載器收到加載請求,不是自己嘗試加載,請求委托父加載器,依次向上,自底向上避免重復加載,自頂向下進行加載,避免核心類被修改。

沙箱安全機制:包含核心類(啟動類,擴展類加載器中的類不被破壞),防止內存中出現多份同樣的字節碼。

4. 運行時數據區

4.1 方法區/非堆

被所有線程鎖共享{共享區間},類信息{接口、方法}+靜態變量+常量+運行時常量池。

4.2 堆

存放指向類元數據的地址,JVM啟動時創建,堆內存大小可以調節。

-Xms 512m 初始大小

-Xmx 512m 最大大小

非堆內存

# 設置元空間大小(JDK 8+ 替代永久代)
-XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=256m# 設置線程棧大小
-Xss1m  # 每個線程棧大小為 1MB

4.2.1 分代

堆內存分為:新生代/老年代/永久代(在方法區,8之后變成元空間,只是邏輯上屬于堆內存)

年輕代分為:伊甸園區,幸存者區

4.2.2 分代空間工作流程

頻繁的垃圾回收成為Minor GC

1.生命周期短的對象,在新生代創建,在新生代被垃圾回收。

2.生命周期長的對象,在新生代創建,老年代回收

3.幾乎所以對象創建在伊甸園區,大多銷毀在新生代,大對象直接進入老年代

先創建在伊甸園區,滿后觸發垃圾回收器,回收不再被引用的對象,將剩余對象移動到幸存者0區,對象賦值年齡計數器為1。伊甸園區清空

再次滿后,對伊甸園區和幸存者0區進行銷毀不再被引用的對象,將剩余對象都移動到幸存者1區

對應對象的年齡計數器+1

依次類推,幸存者區0和1進行交替存放,對應對象年齡+1,年齡達到15晉升老年代

4.2.3 堆空間分配

新生代1/3堆空間,老年代2/3,新生代:8:1:1

老年代滿后產生Major GC,觸發Full GC 進行老年代垃圾回收。清理后仍然不能進行對象保存此時產生OOM異常

4.2.4 永久代

存放運行環境必須的類信息,fullgc觸發回收,若出現OOM:PermGen,永久代設置內存不足被占滿

Jdk 自身攜帶的class interface 等

jdk1.8 去永久代變元空間,元空間占用的是本地物理內存

4.2.5?內存溢出的時候:如何分析

內存溢出分析工具

MAT

eclipse推出的內存分析利器,支持解析hprof等格式的堆快照,能快速定位大對象、內存泄漏點,適合處理GB級快照文件

jvisualvm

通過OQL(對象查詢語言)在堆快照中查詢特定對象(如“所有未被回收的String對象”),精準定位內存問題。

arthas 阿爾薩斯 https://arthas.aliyun.com/doc/quick-start.html

JVM

啟動 java -jar arthas-boot.jar

按 Java 進程前面的 序號,然后回車

會展示當前進程的信息 dashboard

查看靜態的屬性 getstatic

查看當前 JVM 的信息 jvm

查看內存使用狀態 memory

常規命令

會打印線程 ID 的棧 thread ID

反編譯類 jad

監控方法的返回值 watch

退出 quit、exit

4.2.6?垃圾回收算法

復制算法

堆內存分割兩塊,遍歷from空間檢索存活對象搬運到to空間,清理from空間,名稱互換

實現簡單,不存在內存碎片。內存縮小一半

標記清除

使用可達性分析算法,標記可達對象,清除未標記對象。

充分利用內存。經過兩次掃描,產生內存碎片。

標記整理/標記壓縮

在標記清除基礎上進行壓縮空間。

充分利用內存,不會產生內存空間。經過兩次掃描耗費時間,存活對象對整理麻煩,算法效率降低

分代收集算法

三合一,年輕代復制算法,老年代標記混合實現。

4.2.7 判斷一個對象是否可回收

引用計數法

可達性分析算法

4.3 棧

線程創建時創建,聲明周期跟隨線程,線程私有,線程上執行的每個方法都各自對應一個棧幀。

棧存儲棧幀,棧幀是一個內存區塊,包含方法執行的數據信息

4.3.1 局部變量表

存儲方法參數和方法體內定義的局部變量:8種基本類型變量、對象引用變量、實例方法。

4.3.2 操作數棧

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

4.3.3?動態鏈接

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

4.3.4 方法返回地址

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

4.3.5 棧溢出

StackOverflowError

出現情況:代碼循環調用,棧空間不足 -Xss2M

垃圾回收不涉及棧內存。方法調用結束后自動彈出

方法內的局部變量線程安全嗎?

當方法內局部變量沒有逃離方法的作用范圍時線程安全,因為一個線程對應一個棧,每調用一個方法就會新產生一個棧楨,都是線程私有的局部變量,當變量是static時則不安全,因為是線程共享的。

4.4 本地方法棧

存儲本地方法地址

4.5 程序計數器

每個線程都有,線程私有,運行時的指針,存儲指向下一條命令的地址

5.本地方法接口

本地方法存儲了從Java代碼中調用本地方法時所需的信息。線程私有。

5.1 本地方法

由native修飾,c/c++編寫,通過Java編譯器看不到

5.2 本地方法庫

提供所有本地方法與接口的實現

6. 執行引擎-出口

負責解析命令,交給操作系統執行

6.1 解釋器

Java字節碼加載到內存中,解釋器逐條解析和執行字節碼指令轉換對應平臺的本地機器指令。無需等待編譯,執行速度較慢。

6.2 即時編譯器

為了提高執行速度,JVM還使用即時編譯器。即時編譯器將字節碼動態地編譯為本地機器碼,以便直接在底層硬件上執行。

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

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

相關文章

2024.09.20 leetcode刷題記錄

# 前言 昨天發布了第一遍博客,感覺很好,趁著我現在還是很感興趣就多發幾遍,希望能堅持下去,在這里記錄下自己學習成長的經歷。 今天是周五,下周一就又要去實習啦,距離上一段實習剛結束一個月,之…

SQLite3 中列(變量)的特殊屬性

在 SQLite3 中,列的特殊屬性通常通過約束(Constraints)和數據類型修飾符來定義。這些屬性可以在創建表時指定,用于限制數據的完整性或定義特殊行為。以下是 SQLite3 支持的主要特殊屬性及其說明: 1. 主鍵約束&#xff…

Datawhale AI 夏令營:用戶洞察挑戰賽 Notebook(2)

針對文本聚類優化 優化TF-IDF特征工程# 調整ngram_range:設置為(1, 2),捕捉單字和雙字詞(如“不錯”“不滿意”)。 # 限制特征數量:通過max_features5000保留高信息密度特征,降低維度。 # 過濾低頻/高頻詞&…

【博主親測可用】PS2025最新版:Adobe Photoshop 2025 v26.8.1 激活版(附安裝教程)

軟件簡介 Adobe Photoshop 2025是Adobe公司開發的一款圖像處理軟件。作為行業標準的數字圖像編輯工具,其核心定位是創意設計、后期攝影、3D建模和AI驅動創作,適用于專業設計師、攝影師、插畫家和多媒體創作者。界面設計簡單直觀,易于操作&…

unity A星尋路

算法 fCost gCost hCost gCost 是當前節點到移動起始點的消耗,hCost是當前節點到終點的消耗 網格為變成為1的矩形,左右相鄰的兩個網格直接的gCost為1,斜對角相鄰的兩個網格的gCost為1.4 hCost 當前網格到終點網格的 水平距離 垂直距離 比如…

十一 Javascript的按值傳遞

你將知道:“傳遞” 值是什么意思什么是按值傳遞傳遞物品JavaScript 中沒有傳遞引用!介紹當需要在 JavaScript 中分配或簡單地將一個值傳遞給其他標識符時,我們就會看到通常所說的 按值傳遞 。嚴格來說,JavaScript 中傳遞值的方式只…

SpringBoot ThreadLocal 全局動態變量設置

需求說明: 現有一個游戲后臺管理系統,該系統可管理多個大區的數據,但是需要使用大區id實現數據隔離,并且提供了大區選擇功能,先擇大區后展示對應的數據。需要實現一下幾點: 1.前端請求時,area_i…

如何解決pip安裝報錯ModuleNotFoundError: No module named ‘logging’問題

【Python系列Bug修復PyCharm控制臺pip install報錯】如何解決pip安裝報錯ModuleNotFoundError: No module named ‘logging’問題 摘要: 在使用 PyCharm 2025 控制臺通過 pip install 安裝第三方庫時,常會遇到諸如 ModuleNotFoundError: No module name…

打破技術債困境:從“保持現狀”到成為變革的推動者

相信許多在科技行業的同行都面臨過類似的挑戰:明知系統存在“技術債”,卻因為溝通成本、團隊壓力和短期KPI等原因,難以推動改進,最終陷入“想做卻不敢做”的矛盾心態。這不僅影響個人心情,更重要的是,它像一…

Spring Boot 整合 RabbitMQ

Spring Boot 整合 RabbitMQ 一、概述:RabbitMQ 是什么? 你可以把 RabbitMQ 想象成一個「快遞中轉站」。 比如你在網上買了一本書,賣家(生產者)把包裹(消息)交給快遞站(RabbitMQ&…

Unity Demo-3DFarm詳解-其一

我們來拆解一個種田游戲,這個游戲種類內部的功能還是比較模板化的,我們來一點點說。我們大體上分為這么幾個部分:農場運營玩法角色與玩家互動物品與背包存檔和進度管理用戶界面系統農場運營可以大體上分為:種植系統:支…

esp8266驅動下載

問題描述:esp8266插上電腦,設備管理器無法識別,顯示為USB serial(黃色感嘆號) 首先確認你的esp8266是不是 CH340 系列的 USB 轉串口芯片 CH340驅動下載地址

大語言模型的極限:知識、推理與創造力的邊界探析

大語言模型的極限:知識、推理與創造力的邊界探析 人工智能領域的快速發展推動了大語言模型(LLM)的廣泛應用,這些模型在文本生成、知識問答和創意表達等方面展現出前所未有的能力。然而,隨著應用場景的深化,…

git中的fork指令解釋

在Git中,Fork 是指將他人的代碼倉庫(Repository)復制到自己的賬戶下,創建一個完全獨立的副本[1][2]。以下是關于Fork的詳細說明: Fork的定義與核心作用 定義:Fork是代碼托管平臺(如GitHub&#…

iPhone 抓包工具有哪些?多工具對比分析優缺點

iOS 平臺一向以安全性著稱,這也使得對其進行網絡調試和抓包變得異常困難。相比安卓,iPhone 抓包難點主要在以下幾點: 系統限制代理設置的靈活性無法自由安裝根證書抓包常涉及 HTTPS 解密與雙向認證破解普通用戶設備無 root 或越獄權限 因此&a…

使用 libcu++ 庫

文章目錄使用 libcu 庫安裝與設置基本組件1. 原子操作2. 內存管理3. 類型特性4. 同步原語編譯選項注意事項使用 libcu 庫 libcu 是 NVIDIA 提供的 CUDA C 標準庫實現,它為 CUDA 開發者提供了類似 C 標準庫的功能和接口。以下是使用 libcu 的基本指南: …

[Leetcode] 預處理 | 多叉樹bfs | 格雷編碼 | static_cast | 矩陣對角線

魔術排列模擬一個特定的洗牌過程,并找到使得經過一系列洗牌和取牌操作后,能夠與給定的目標數組target相匹配的最小k值核心思想: 預處理初始排列:從一個按順序排列的數組(例如,{1, 2, 3, ..., n})開始。洗牌…

【技術追蹤】SynPo:基于高質量負提示提升無訓練少樣本醫學圖像分割性能(MICCAI-2025)

SAM 新用法,無需訓練,利用高質量負提示提升分割性能~ 論文:SynPo: Boosting Training-Free Few-Shot Medical Segmentation via High-Quality Negative Prompts 代碼:https://liu-yufei.github.io/synpo-project-page/ 0、摘要 大…

深入理解機器學習

一.前言本章節開始來講解一下機器學習的知識,本期作為一個了解就大概介紹一下,我們不會從機器學習基礎開始介紹,但是后面會來補充,隨著ai的不斷發展,機器學習在ai的領域里面的占比越來約少,我們還是以應用為…

數據結構 順序表(1)

目錄 1.線性表 2.順序表 1.線性表 線性表(linear list)是n個具有相同特性的數據元素的有限序列。線性表是一種在實際中廣泛使用 的數據結構,常見的線性表:順序表、鏈表、棧、隊列、字符串… 線性表在邏輯上是線性結構&#…