JVM與JMM

為了更清晰地對比JVM和JMM,我們可以采用表格形式,從定義、功能、結構、與多線程關系等方面進行詳細比較:

對比項JVM(Java Virtual Machine)JMM(Java Memory Model)
定義一種虛構的計算機,為Java程序提供與底層操作系統和硬件無關的運行環境,實現“一次編寫,到處運行”一種抽象規范,定義了Java程序中多線程訪問共享內存的規則
主要功能- 字節碼執行:加載并將字節碼解釋或編譯成機器碼執行
- 內存管理:管理堆、棧、方法區等運行時內存
- 垃圾回收:自動回收不再使用的對象內存
- 解決多線程內存可見性問題:確保一個線程對共享變量的修改能及時被其他線程看到
- 保證原子性操作:確保操作不可中斷,要么全執行,要么全不執行
- 處理指令重排序:防止因指令重排序導致多線程程序出錯
結構組成- 類加載子系統:負責加載字節碼文件
- 運行時數據區:包含堆、棧、方法區等
- 執行引擎:執行字節碼指令
圍繞主內存與工作內存的交互規則,以及保證原子性、可見性、有序性的規則體系
與多線程關系為多線程提供運行的基礎環境,管理多線程的內存分配和線程調度等專門針對多線程環境,確保多線程對共享內存的訪問符合規則,避免數據競爭和并發問題
作用層面從整體上保障Java程序的運行,涵蓋編譯、執行、內存管理等各個方面專注于多線程場景下的內存訪問控制,確保多線程程序的正確性和穩定性
實現方式通過具體的軟件實現,如HotSpot JVM,包含一系列復雜的算法和數據結構來實現其功能通過制定內存訪問規則,依賴關鍵字(如volatilesynchronized)和同步機制來實現
  1. JVM(Java Virtual Machine,Java虛擬機)

    • 定義與概念:JVM是Java程序的運行核心,它是一種虛構出來的計算機,通過在實際的計算機上仿真模擬各種計算機功能來實現的。它為Java程序提供了一個與底層操作系統和硬件無關的運行環境,使得Java程序能夠實現“一次編寫,到處運行”的特性。
    • 主要功能
      • 字節碼執行:Java源文件經過編譯器編譯后生成字節碼文件(.class文件)。JVM負責加載字節碼文件,并將字節碼解釋或編譯成機器碼,然后在計算機上執行。例如,當我們運行一個簡單的Java程序HelloWorld,JVM會加載HelloWorld.class文件,將其中的字節碼轉化為機器可執行的指令。
      • 內存管理:JVM管理Java程序運行時的內存,包括堆內存、棧內存、方法區等。堆內存用于存儲對象實例,棧內存用于存儲方法調用和局部變量等。比如,當創建一個new ArrayList()對象時,該對象會被分配到堆內存中,而調用創建該對象方法的相關局部變量會存儲在棧內存中。
      • 垃圾回收:JVM自帶垃圾回收機制(Garbage Collection,GC),它自動回收不再被使用的對象所占用的內存空間,減輕了程序員手動管理內存的負擔。例如,當一個對象不再有任何引用指向它時,垃圾回收器會在適當的時候回收該對象占用的堆內存。
    • 結構組成
      • 類加載子系統:負責加載字節碼文件到JVM中。它通過不同的類加載器(如啟動類加載器、擴展類加載器、應用程序類加載器)按照一定的層次結構來加載類,保證類的唯一性和安全性。
      • 運行時數據區:包含上述提到的堆、棧、方法區等不同的內存區域,每個區域有其特定的功能和用途。
      • 執行引擎:負責執行字節碼指令,將字節碼翻譯為對應平臺的機器碼。執行引擎可以采用解釋執行(逐行解釋字節碼)或者即時編譯(JIT,將熱點代碼編譯成本地機器碼以提高執行效率)等方式。
  2. JMM(Java Memory Model,Java內存模型)

    • 定義與概念:JMM是一種抽象的規范,它定義了Java程序中多線程訪問共享內存的規則。它描述了在JVM中,各個線程如何訪問和修改共享變量,以及如何保證不同線程之間對共享變量操作的可見性、原子性和有序性。
    • 主要功能
      • 解決多線程內存可見性問題:在多線程環境下,一個線程對共享變量的修改,其他線程何時能看到是不確定的。JMM通過規定線程對共享變量的讀寫操作與主內存之間的交互規則,來保證內存可見性。例如,使用volatile關鍵字修飾的變量,當一個線程修改了這個變量的值,會立即刷新到主內存,其他線程讀取時會從主內存獲取最新值。
      • 保證原子性操作:原子性指一個操作是不可中斷的,要么全部執行成功,要么全部不執行。JMM定義了一些基本操作的原子性,如對基本數據類型(除longdouble在某些平臺上)的簡單讀寫操作是原子的。對于復合操作,如i++,可以通過synchronized關鍵字或Atomic類來保證原子性。
      • 處理指令重排序:為了提高性能,編譯器和處理器可能會對指令進行重排序。JMM通過一些規則來確保在多線程環境下,指令重排序不會導致程序出現錯誤的執行結果。例如,volatile關鍵字不僅保證可見性,還能禁止指令重排序,確保volatile變量的讀寫操作順序與代碼順序一致。
    • 與多線程的關系:JMM是為了保證多線程環境下程序的正確性和穩定性而設計的。它為多線程編程提供了內存層面的規范,使得程序員可以基于這些規則編寫線程安全的代碼。例如,當多個線程同時訪問和修改共享資源時,通過遵循JMM的規則,使用合適的同步機制(如synchronizedLock等),可以避免數據競爭和其他并發問題。
  3. JVM與JMM的關系

    • JMM是JVM的一部分:JMM是JVM規范中關于內存訪問規則的部分,它是JVM整體架構中負責多線程內存管理和同步的模塊。
    • JVM為JMM提供運行基礎:JVM提供了運行時數據區(包括主內存和工作內存等概念),這些是JMM規則得以實施的基礎。JVM的類加載、執行引擎等子系統與JMM相互配合,共同保證Java程序在多線程環境下的正確運行。例如,執行引擎在執行字節碼指令時,需要遵循JMM關于內存訪問的規則,確保多線程操作共享變量的正確性。

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

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

相關文章

【Docker基礎】Docker數據卷管理:docker volume rm及其參數詳解

目錄 1 引言:Docker Volume 的生命周期管理 2 docker volume rm命令基礎 2.1 命令作用 2.2 命令語法 3 參數深度解析 3.1 基礎參數表 3.2 高級參數詳解 3.2.1 --force(-f) 4 Volume刪除前置條件 4.1 可刪除狀態判斷 4.2 常見報錯處…

嵌入式系統內核鏡像相關(十)

文章目錄 前言一、點亮多個led燈的基礎實驗以及其中的問題1.1 基礎流程1.1.1 alinx教程的問題1.1.1.1 驅動程序中的亮/滅邏輯修改!1.1.1.1.1 邏輯錯誤的修改1.1.1.1.2 多燈亮/滅 1.1.1.2 驅動程序中引腳的問題以及與裸機開發的區別(重要)1.1.…

Word和Excel批量轉PDF新方法,操作簡單

PDF是一種跨平臺的文檔格式,無論在任何設備上查看,其排版、字體和圖像都不會發生變化。這確保了文檔的一致性,避免了由于不同軟件版本或操作系統引起的顯示問題。這款小巧的工具大小不到2MB,使用起來異常簡單。只需要把需要轉換的…

AI搜索 MCP最佳實踐

背景 那些 LLM 不知道的事 嘗試直接詢問LLM“今天天氣如何”時,會發現LLM無法回答——它既不知道“今天”是哪天,也無法獲取地理位置信息。這揭示了LLM的局限:缺乏與外部工具和實時數據的交互能力。 為解決這一問題,MCP&#x…

JVM 簡介與作用

🚀 JVM 簡介與作用 📚 深入理解 Java 虛擬機的核心概念與重要作用 📖 目錄 🤔 什么是 Java 虛擬機(JVM)🌐 JVM 在 Java 生態中的核心地位🔀 JVM 跨平臺原理剖析📝 總結 …

? OpenAudio S1:影視級文本轉語音與語音克隆Mac整合包

? OpenAudio S1:影視級文本轉語音與語音克隆Mac整合包 🚀 OpenAudio S1 簡介 OpenAudio S1 是由 Fish Audio 開發的 Fish Speech 系列的最新一代人工智能語音生成模型。該模型旨在大幅提升 AI 語音生成的技術水平,為用戶提供更加自然、富有表…

spring加載外部properties文件屬性時,讀取到userName變量值和properties文件的值不一致

問題 使用spring DI注入外部properties文件屬性時&#xff0c;讀取到userName變量值和properties文件的值不一致。 bean屬性注入&#xff1a; <!--加載配置文件--> <context:property-placeholder location"classpath:*.properties"/><bean id"…

黑馬點評系列問題之基礎篇p7 06初識redis無法在虛擬機查到圖形化界面存進去的鍵

問題描述 在RESP中輸入了一些鍵(name,age等這些) 但是在圖形化界面里面輸入的&#xff0c;在非圖形化界面就找不到&#xff0c;在非圖形化界面里輸入的&#xff0c;在圖形化界面里就可以查到。 原因分析及解決 經過多次實驗&#xff0c;發現是因為在添加鍵名的時候&#xff0…

在VMware虛擬機中安裝Windows 98時,Explorer提示“該程序執行了非法操作,即將關閉”的解決辦法

在使用iso文件&#xff08;MD5: 0E496B5DCC519F550AAF0BCFBB4A11EA&#xff09;安裝Windows98時&#xff0c;遇到此提示。 雖然原因未知&#xff0c;也無需深入探究&#xff0c;但是根據網友在 https://www.bilibili.com/opus/435866522585702782 中給出的相似經驗&#xff…

在瀏覽器中使用SQLite(官方sqlite3.wasm)

有人可能會問&#xff1a;既然瀏覽器里又內置得IndexedDB&#xff0c;而且在IndexedDB里存數據&#xff0c;關了瀏覽器數據也不會丟&#xff0c;為什么還要在瀏覽器里用SQLite? 實際上&#xff0c;當 IndexedDB 內的數據量增多&#xff0c;數據和數據之間的關系變得復雜&…

數據結構(Java)--位運算

前言 本文為本小白學習數據結構的筆記&#xff0c;將以算法題為導向&#xff0c;向大家更清晰的介紹數據結構相關知識&#xff08;算法題都出自B站馬士兵教育——左老師的課程&#xff0c;講的很好&#xff0c;對于想入門刷題的人很有幫助&#xff09; 為什么要使用為位運算 位…

秋招Day14 - Redis - 應用

Redis如何實現異步消息隊列&#xff1f; List配合LPUSH和RPOP。 另外就是用 Redis 的 Pub/Sub 來實現簡單的消息廣播和訂閱。 但是這兩種方式都是不可靠的&#xff0c;因為沒有 ACK 機制所以不能保證訂閱者一定能收到消息&#xff0c;也不支持消息持久化。 Redis如何實現延時…

因果語言模型、自回歸語言模型、僅解碼器語言模型都是同一類模型

因果語言模型、自回歸語言模型、僅解碼器語言模型都是同一類模型 flyfish 因果語言模型&#xff08;causal Language Models&#xff09; 自回歸語言模型&#xff08;autoregressive language models&#xff09; 僅解碼器語言模型&#xff08;decoder-only language models&am…

jvm架構原理剖析篇

簡單題&#xff08;5道&#xff09; 考查內容&#xff1a;JVM運行時數據區域 題干&#xff1a;Java虛擬機棧的主要作用是&#xff1f; A. 存儲對象實例 B. 存儲方法調用和局部變量 C. 存儲靜態字段 D. 存儲字節碼指令 正確答案&#xff1a;B 解析&#xff1a;虛擬機棧用于存儲方…

智鏈萬物:人工智能驅動的產業智能化革命

當生成式AI在藝術與創意領域掀起風暴&#xff0c;大型語言模型重塑信息交互方式時&#xff0c;一場更為基礎、影響更為深遠的變革&#xff0c;正在全球實體經濟的根基處悄然發生并加速推進——這就是產業智能化。它并非簡單的“機器換人”&#xff0c;而是人工智能&#xff08;…

python中上下文管理器 與 try finally有什么區別

目錄 主要區別代碼對比何時使用哪種方式 主要區別 語法簡潔性 上下文管理器使用 with 語句&#xff0c;語法更簡潔優雅try-finally 需要顯式編寫異常處理代碼&#xff0c;更冗長 代碼復用性 上下文管理器可以封裝為類或函數&#xff0c;便于在多處復用try-finally 通常需要在每…

人體屬性識別+跌倒檢測:兒童行為監測與安全升級

智慧幼兒園的AI智能檢測盒應用實踐 背景&#xff1a;傳統園區管理的三大痛點 傳統幼兒園管理長期面臨三大核心挑戰&#xff1a;一是安全監控依賴人工巡查&#xff0c;存在視覺盲區與響應延遲&#xff0c;如某連鎖幼兒園曾因人工巡查疏漏&#xff0c;導致3起兒童跌倒事故未能及…

【ESP32-IDF筆記】09-UART配置和使用

環境配置 Visual Studio Code &#xff1a;版本1.98.2 ESP32&#xff1a;ESP32-S3 ESP-IDF&#xff1a;V5.4 支持型號&#xff1a;ESP32、ESP32-C2、ESP32-C3、ESP32-C5、ESP32-C6、ESP32-C61、ESP32-H2、ESP32-P4、 ESP32-S2、ESP32-S3 簡介 通用異步接收器/發送器 (UART) …

在 .NET Core 和 React 中使用 WebSockets 和 SignalR 進行實時數據傳輸

對于需要即時更新和通知的應用程序來說&#xff0c;實時數據傳輸至關重要。在 .NET Core 中&#xff0c;WebSocket 和 SignalR 提供了強大的工具來實現客戶端和服務器之間的實時通信。在本指南中&#xff0c;我們將探討如何在 .NET Core 應用程序中使用 WebSocket 和 SignalR 實…

第八十六篇 大數據排序算法:從廚房整理到分布式排序的智慧

目錄一、基礎排序算法&#xff1a;生活場景中的計算智慧1.1 冒泡排序&#xff1a;圖書館的書籍整理1.2 插入排序&#xff1a;廚房調料的整理藝術二、高效排序算法&#xff1a;大數據處理的利器2.1 快速排序&#xff1a;音樂APP的智能歌單2.2 歸并排序&#xff1a;學校成績單的合…