自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

別再混淆了!JVM內(nèi)存模型和Java內(nèi)存模型的本質(zhì)區(qū)別

開(kāi)發(fā) 前端
JVM 內(nèi)存模型(JVM Memory Model)和 Java 內(nèi)存模型(Java Memory Model, JMM)是 Java 開(kāi)發(fā)中兩個(gè)非常重要的概念,但這兩個(gè)概念很容易被搞混,所以本文就來(lái)通俗易懂的講講二者的區(qū)別。

JVM 內(nèi)存模型(JVM Memory Model)和 Java 內(nèi)存模型(Java Memory Model, JMM)是 Java 開(kāi)發(fā)中兩個(gè)非常重要的概念,但這兩個(gè)概念很容易被搞混,所以本文就來(lái)通俗易懂的講講二者的區(qū)別。

首先,我們先來(lái)看看各自的概念,以及其解決的問(wèn)題。

1.JVM內(nèi)存模型

  • 定位:JVM 在運(yùn)行 Java 程序時(shí)對(duì)物理內(nèi)存的具體劃分和管理方式,用來(lái)保證 Java 程序正常執(zhí)行的。

  • 目的:定義 Java 程序在運(yùn)行時(shí)如何分配、使用和回收內(nèi)存。
  • 核心組成

a.堆(Heap):存儲(chǔ)對(duì)象實(shí)例(所有線(xiàn)程共享)。

b.方法區(qū)(Method Area):存儲(chǔ)類(lèi)信息、常量等(JDK8 后由元空間實(shí)現(xiàn))。

c.虛擬機(jī)棧(VM Stack):存儲(chǔ)方法的局部變量、操作數(shù)棧(每個(gè)線(xiàn)程私有)。

d.本地方法棧(Native Method Stack):服務(wù)于 JVM 調(diào)用本地方法。

e.程序計(jì)數(shù)器(Program Counter Register):記錄線(xiàn)程當(dāng)前執(zhí)行的指令地址。

  • 關(guān)注點(diǎn):內(nèi)存的分配、垃圾回收(GC)、內(nèi)存泄漏等問(wèn)題。

JVM不劃分5大內(nèi)存區(qū)域行不行?

從理論上來(lái)講可能是可行的,但從程序的運(yùn)行效率、垃圾回收的效率等方面來(lái)講不劃分內(nèi)存區(qū)域,所有的信息放到一起,其效率是非常慢的,是不能被允許的。

并且不劃分區(qū)域可能會(huì)導(dǎo)致關(guān)鍵數(shù)據(jù)易被污染的問(wèn)題,例如方法區(qū)存儲(chǔ)的類(lèi)元數(shù)據(jù)(如類(lèi)結(jié)構(gòu)、靜態(tài)變量)需要長(zhǎng)期存在且全局共享,若與臨時(shí)變量混存,可能導(dǎo)致類(lèi)信息被意外覆蓋。例如,在熱加載類(lèi)時(shí),新類(lèi)元數(shù)據(jù)可能覆蓋正在被其他線(xiàn)程使用的舊版本,引發(fā)不可預(yù)知的錯(cuò)誤。

所以綜合來(lái)看,JVM 必須按存儲(chǔ)的數(shù)據(jù)類(lèi)型劃分為不同的數(shù)據(jù)區(qū)域,以提升程序的執(zhí)行和垃圾回收的效率,并且可以減少程序在運(yùn)行時(shí)的一些不必要的問(wèn)題,這就是 JVM 內(nèi)存模型所解決的問(wèn)題。

2.Java內(nèi)存模型

  • 定位:Java 語(yǔ)言規(guī)范(JLS)定義的多線(xiàn)程環(huán)境下內(nèi)存訪(fǎng)問(wèn)的規(guī)則和約束的一種規(guī)范。

  • 目的:解決多線(xiàn)程并發(fā)時(shí)的內(nèi)存可見(jiàn)性、原子性、有序性問(wèn)題,確保線(xiàn)程間正確通信。
  • 核心概念

a.主內(nèi)存(Main Memory):所有線(xiàn)程共享的內(nèi)存區(qū)域。

b.工作內(nèi)存(Working Memory):每個(gè)線(xiàn)程私有的內(nèi)存副本(可能對(duì)應(yīng) CPU 寄存器或緩存)。

c.happens-before原則:定義操作之間的偏序關(guān)系,確保可見(jiàn)性。

d.內(nèi)存屏障(Memory Barriers):禁止指令重排序的機(jī)制。

  • 關(guān)注點(diǎn):如何通過(guò) synchronized、volatile 等關(guān)鍵字或并發(fā)工具類(lèi)保證線(xiàn)程安全。
  • 示例場(chǎng)景:解決多線(xiàn)程下共享變量的不可見(jiàn)性(如使用 volatile 禁止指令重排序)。

PS:也就是說(shuō)“Java 內(nèi)存模型”主要是保證 Java 在多線(xiàn)程下正常運(yùn)行的一種機(jī)制(或規(guī)定)。

小結(jié)


JVM內(nèi)存模型

Java內(nèi)存模型(JMM)

范疇

JVM 實(shí)現(xiàn)層面的內(nèi)存區(qū)域劃分

多線(xiàn)程并發(fā)編程的內(nèi)存訪(fǎng)問(wèn)規(guī)則

主要目標(biāo)

內(nèi)存分配、回收和管理

解決線(xiàn)程間的可見(jiàn)性、有序性和原子性問(wèn)題

具體實(shí)現(xiàn)

堆、棧、方法區(qū)等物理內(nèi)存劃分

volatile、synchronized 等語(yǔ)義

責(zé)任編輯:姜華 來(lái)源: 磊哥和Java
相關(guān)推薦

2018-07-04 14:43:55

對(duì)象模型內(nèi)存結(jié)構(gòu)內(nèi)存模型

2010-09-25 12:38:40

JVM內(nèi)存模型

2023-11-05 12:05:35

JVM內(nèi)存

2019-07-08 10:00:52

Java內(nèi)存模型并發(fā)

2023-06-07 08:08:43

JVM內(nèi)存模型

2009-06-24 16:50:11

Java內(nèi)存模型

2022-02-04 22:05:19

JVM程序內(nèi)存模型

2018-11-01 10:34:37

JVM內(nèi)存配置

2024-07-26 10:23:52

2010-02-22 08:58:35

JVM內(nèi)存模型垃圾收集

2020-06-11 07:00:00

OAuth 2.0會(huì)話(huà)管理應(yīng)用安全

2023-07-11 08:43:43

volatileJava內(nèi)存

2019-11-08 15:11:03

Java架構(gòu)數(shù)據(jù)

2021-07-02 06:54:45

GoJavachannel

2013-07-11 10:37:20

Java內(nèi)存模型

2020-12-07 06:23:48

Java內(nèi)存

2023-10-27 07:47:58

Java語(yǔ)言順序性

2021-09-08 17:42:45

JVM內(nèi)存模型

2021-01-07 07:56:25

JVM內(nèi)存面試官

2018-07-26 09:06:29

Java內(nèi)存模型
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)