Java [ 進階 ] 深入理解 JVM

?探索Java基礎? ?深入理解 JVM?

深入理解 JVM:結構與垃圾回收機制

Java 虛擬機(JVM)是 Java 程序運行的核心,了解 JVM 的內部結構和垃圾回收機制對優化 Java 應用性能至關重要。本文將深入探討 JVM 的結構和垃圾回收機制,并附上一些代碼示例以幫助理解。

JVM 結構

JVM 是一種抽象的計算機,負責執行 Java 字節碼程序。JVM 的內部結構包括以下幾個關鍵組件:

  1. 類加載器子系統(Class Loader Subsystem)

    • 啟動類加載器(Bootstrap ClassLoader):加載核心類庫,如 rt.jar
    • 擴展類加載器(Extension ClassLoader):加載擴展庫,如 ext 目錄下的類。
    • 應用類加載器(Application ClassLoader):加載用戶類路徑(classpath)下的類。
    public class ClassLoaderExample {public static void main(String[] args) {// 獲取系統類加載器ClassLoader classLoader = ClassLoader.getSystemClassLoader();// 打印類加載器的名稱System.out.println("System ClassLoader: " + classLoader);// 獲取擴展類加載器ClassLoader extClassLoader = classLoader.getParent();System.out.println("Extension ClassLoader: " + extClassLoader);// 獲取啟動類加載器(通常返回 null,因為它是用本地代碼實現的)ClassLoader bootstrapClassLoader = extClassLoader.getParent();System.out.println("Bootstrap ClassLoader: " + bootstrapClassLoader);}
    }
    

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

    • 方法區(Method Area):存儲類信息、常量、靜態變量、即時編譯器編譯后的代碼。方法區是線程共享的。
    • 堆(Heap):存儲所有對象實例和數組,堆是線程共享的,是垃圾回收的主要區域。
    • 棧(Stack):每個線程都有自己的棧,存儲方法調用信息(棧幀),包括局部變量、操作數棧、方法返回地址等。
    • 程序計數器(Program Counter Register):每個線程都有自己的程序計數器,存儲當前線程執行的字節碼指令地址。
    • 本地方法棧(Native Method Stack):為 JVM 執行本地方法(Native Methods)提供棧空間。
  3. 執行引擎(Execution Engine)

    • 解釋器(Interpreter):逐行解釋字節碼,并將其轉換為機器碼執行。
    • 即時編譯器(JIT Compiler):將熱點代碼編譯成機器碼,以提高執行效率。
    • 垃圾回收器(Garbage Collector):負責自動回收不再使用的對象所占用的內存。
    public class ExecutionEngineExample {public static void main(String[] args) {// 使用 JIT 編譯器long startTime = System.nanoTime();for (int i = 0; i < 1_000_000; i++) {double value = Math.sqrt(i); // 假設這是熱點代碼}long endTime = System.nanoTime();System.out.println("Execution time with JIT: " + (endTime - startTime) + " ns");}
    }
    

  4. 本地方法接口(Native Method Interface, JNI)

    • 提供與本地代碼(如 C、C++)交互的接口,使得 Java 可以調用操作系統的本地方法。
    public class NativeMethodExample {static {System.loadLibrary("nativeLib"); // 加載本地庫}// 聲明本地方法public native void nativeMethod();public static void main(String[] args) {new NativeMethodExample().nativeMethod();}
    }
    

垃圾回收機制

JVM 的垃圾回收機制負責自動管理內存,回收不再使用的對象。以下是幾種常見的垃圾回收器和算法:

  1. 垃圾收集器(Garbage Collectors)

    • Serial 垃圾收集器:單線程收集器,適用于單線程環境或小型應用。
    • Parallel 垃圾收集器(Parallel GC):多線程收集器,適用于多線程環境,能夠利用多核 CPU 提高垃圾回收效率。
    • CMS(Concurrent Mark-Sweep)收集器:并發收集器,減少了垃圾回收時的停頓時間,適用于需要較高響應速度的應用。
    • G1(Garbage First)收集器:面向服務器端應用,能夠更好地控制垃圾回收的停頓時間,適用于大內存、多處理器環境。
  2. 垃圾回收算法(Garbage Collection Algorithms)

    • 標記-清除算法(Mark-Sweep):先標記出所有存活對象,然后清除未被標記的對象。缺點是會產生內存碎片。
    • 復制算法(Copying):將存活對象復制到新空間,然后清除舊空間的所有對象。適用于新生代垃圾回收,效率高,但需要額外的內存空間。
    • 標記-壓縮算法(Mark-Compact):先標記出所有存活對象,然后將存活對象壓縮到內存的一端,清除未被標記的對象。解決了內存碎片問題,適用于老年代垃圾回收。
    • 分代收集算法(Generational Collection):將堆分為新生代和老年代,新生代對象回收頻率高,老年代對象回收頻率低。結合復制算法和標記-壓縮算法,提高垃圾回收效率。

如何選擇垃圾收集器

選擇合適的垃圾收集器需要根據具體應用的需求進行權衡:

  • Serial GC:適用于單線程環境或小型應用,垃圾回收時會暫停所有應用線程,適合不需要頻繁交互的小應用。
  • Parallel GC:適用于多線程環境,可以利用多核 CPU 提高垃圾回收效率,但在垃圾回收期間也會暫停所有應用線程。
  • CMS GC:適用于需要低停頓時間的應用,如交互性強的服務,垃圾回收過程中大部分工作與應用線程并發執行。
  • G1 GC:適用于大內存、多處理器的服務器端應用,能夠更好地控制垃圾回收的停頓時間。
public class GCExample {public static void main(String[] args) {// 創建大量對象以觸發垃圾回收for (int i = 0; i < 1_000_000; i++) {String temp = new String("Garbage Collection Test " + i);}// 顯示垃圾回收信息System.gc();}
}

結論

JVM 是 Java 程序運行的核心,深入理解 JVM 的結構和垃圾回收機制有助于優化 Java 應用的性能。不同的垃圾收集器和算法各有優缺點,選擇合適的垃圾收集器需要根據具體應用的需求進行權衡。

覺得有用的話可以點點贊 (*/ω\*),支持一下。

如果愿意的話關注一下。會對你有更多的幫助。

每天都會不定時更新哦? >人<? 。

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

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

相關文章

支付寶沙箱對接(GO語言)

支付寶沙箱對接 1.1 官網1.2 秘鑰生成&#xff08;系統默認&#xff09;1.3 秘鑰生成&#xff08;軟件生成&#xff09;1.4 golan 安裝 SDK1.5 GoLand 代碼1.6 前端代碼 1.1 官網 沙箱官網: https://open.alipay.com/develop/sandbox/app 秘鑰用具下載&#xff1a; https://ope…

序列化、反序列化

java 提供了一種對象序列化的機制&#xff0c;該機制中&#xff0c;一個對象可以被表示為一個字節序列&#xff0c;該字節序列包括該對象的數據、有關對象的類型的信息和存儲在對象中數據的類型。 將序列化對象寫入文件之后&#xff0c;可以從文件中讀取出來&#xff0c;并且對…

Java并發編程-ThreadLocal深入解讀及案例實戰

文章目錄 概述原理使用場景示例最佳實踐內存泄漏風險阿里開源組件TransmittableThreadLocal原理和機制使用場景如何使用注意事項ThreadLocal在分布式存儲系統edits_log案例中的實踐1. 為什么使用`ThreadLocal`?2. 實踐案例2.1 緩存日志操作2.2 線程局部的編輯日志狀態3. 注意事…

在 Spring 中編寫單元測試

單元測試是軟件開發過程中不可或缺的一部分&#xff0c;它能有效地提高代碼質量&#xff0c;確保代碼功能的正確性。在 Spring 應用中&#xff0c;JUnit 和 Mockito 是常用的單元測試工具&#xff0c;而 Spring Test 提供了豐富的測試支持。本文將介紹如何在 Spring 中使用 JUn…

并行處理百萬個文件的解析和追加

處理和解析大量文件&#xff0c;尤其是百萬級別的文件&#xff0c;是一個復雜且資源密集的任務。為實現高效并行處理&#xff0c;可以使用Python中的多種并行和并發編程工具&#xff0c;比如multiprocessing、concurrent.futures模塊以及分布式計算框架如Dask和Apache Spark。這…

物聯網時代5G通信技術分析研究一、引言

一、引言 近幾年&#xff0c;移動網絡技術跟隨互聯網的不斷發展而改革和進步&#xff0c;給平民大眾的生活也帶來新的嘗試與影響。從2G網絡的出現&#xff0c;到逐步被社會民眾所了解的3G&#xff0c;再到被熟知的且正在服務于大家的4G網絡&#xff0c;移動網絡技術的發展速度令…

jQuery Mobile 安裝指南

jQuery Mobile 安裝指南 jQuery Mobile 是一個基于 jQuery 的移動設備友好的網頁開發框架,它允許開發者創建響應式網頁和應用程序。本指南將詳細介紹如何安裝 jQuery Mobile,并確保您的開發環境準備好進行移動網頁開發。 1. 環境準備 在開始安裝 jQuery Mobile 之前,請確…

Mysql系列-Binlog主從同步

原文鏈接&#xff1a;https://zhuanlan.zhihu.com/p/669450627 一、主從同步概述 mysql主從同步&#xff0c;即MySQL Replication,可以實現將數據從一臺數據庫服務器同步到多臺數據庫服務器。MySQL數據庫自帶主 從同步功能&#xff0c;經過配置&#xff0c;可以實現基于庫、表…

B端設計:任何不顧及用戶體驗的設計,都是在裝樣子,花架子

B端設計是指面向企業客戶的設計&#xff0c;通常涉及產品、服務或系統的界面和功能設計。與C端設計不同&#xff0c;B端設計更注重實用性和專業性&#xff0c;因為它直接影響企業的效率和利益。 在B端設計中&#xff0c;用戶體驗同樣至關重要。不顧及用戶體驗的設計只是空洞的表…

數據庫之索引(二)

目錄 一、如何判斷數據庫的索引是否生效 二、如何評估索引創建的是否合理 三、索引是否越多越好 四、如何處理數據庫索引失效 五、是否所有的字段都適合創建索引 一、如何判斷數據庫的索引是否生效 可以使用EXPLAIN語句查看索引是否正在使用。 例如&#xff0c;假設已經創…

70.Bug:使用list.sort(Comparator.Comping(User::getCreateTime).reverse())空指針異常

1.出錯原因&#xff1a;在xml中沒有做字段映射 報錯語句復現&#xff1a; List<User> listnew ArrayList<>()&#xff1b; xml中進行查詢數據&#xff0c;數據存放在list中........... //排序 list.sort(Comparator.Comping(User::getCreateTime).reverse())&…

經典的layui框架,還有人用嗎?令人惋惜。

自從layui官網宣布關閉之后&#xff0c;layui框架的用戶飛速下滑&#xff0c;以至于到現在貝格前端工場承接的項目中&#xff0c;鮮有要求使用layui框架的&#xff0c;那么個框架還有人用嗎&#xff1f; 一、layui沒落是不是jquery惹的禍 layui的沒落與jQuery無關。layui框架…

Hi3861 OpenHarmony嵌入式應用入門--UDP Server

本篇使用的是lwip編寫udp服務端。需要提前準備好一個PARAM_HOTSPOT_SSID宏定義的熱點&#xff0c;并且密碼為PARAM_HOTSPOT_PSK。 修改網絡參數 在Hi3861開發板上運行上述四個測試程序之前&#xff0c;需要根據你的無線路由、Linux系統IP修改 net_params.h文件的相關代碼&…

深入理解 Docker 容器技術

一、引言 在當今的云計算和軟件開發領域&#xff0c;Docker 容器技術已經成為了一項不可或缺的工具。它極大地改變了應用程序的部署和運行方式&#xff0c;為開發者和運維人員帶來了諸多便利。 二、Docker 容器是什么&#xff1f; Docker 容器是一種輕量級、可移植、自包含的…

起底:Three.js和Cesium.js,二者異同點,好比全科和專科.

Three.js和Cesium.js是兩個常用的webGL引擎&#xff0c;很多小伙伴容易把它們搞混淆了&#xff0c;今天威斯數據來詳細介紹一下&#xff0c;他們的起源、不同點和共同點&#xff0c;閱讀后你就發現二者就像全科醫院和專科醫院的關系&#xff0c;很好識別。 一、二者的起源 Th…

性能測試相關理解---性能測試流程(二)

六、性能測試流程&#xff08;如何做性能測試&#xff1f;) 根據學習全棧測試博主的課程做的筆記 1、前期準備– 項目初期就開始&#xff0c;業務需求評審時盡量參與,對業務更深刻的認識&#xff08;確定哪些是核心業務、哪些可能存在并發請求、確定什么地方會出現瓶頸,方便后…

WebOffice在線編微軟Offfice,并以二進制流的形式打開Word文檔

在日常辦公場景中&#xff0c;我們經常會遇到這種場景&#xff1a;我們的合同管理系統的各種Word,excel,ppt數據都是以二進制數組的形式存儲在數據庫中&#xff0c;如何從數據庫中讀取二進制數據&#xff0c;以二進制數據作為參數&#xff0c;然后加載到瀏覽器的Office窗口&…

【無標題】地平線2西之絕境/Horizon Forbidden West? Complete Edition(更新:V1.3.57)

游戲介紹 與埃洛伊同行&#xff0c;在危險壯美的邊疆之地揭開種種未知的神秘威脅。此完整版可完整享受廣受好評的《地平線 西之絕境?》內容和額外內容&#xff0c;包括在主線游戲后展開的后續故事“炙炎海岸”。 重返《地平線》中遙遠未來的后末日世界&#xff0c;探索遠方的土…

Twitter群發消息API接口的功能?如何配置?

Twitter群發消息API接口怎么申請&#xff1f;如何使用API接口&#xff1f; 為了方便企業和開發者有效地與用戶互動&#xff0c;Twitter提供了各種API接口&#xff0c;其中Twitter群發消息API接口尤為重要。AokSend將詳細介紹Twitter群發消息API接口的功能及其應用場景。 Twit…

html+css+js貪吃蛇游戲

貪吃蛇游戲&#x1f579;四個按鈕控制方向&#x1f3ae; 源代碼在圖片后面 點贊??關注&#x1f64f;收藏?? 互粉必回&#x1f64f;&#x1f64f;&#x1f60d;&#x1f60d;&#x1f60d; 源代碼&#x1f4df; <!DOCTYPE html> <html lang"en"&…