1. 程式人生 > >Java 記憶體模型和硬體記憶體架構筆記

Java 記憶體模型和硬體記憶體架構筆記

前言

可跟《主存存取和磁碟存取原理筆記》串著看

雜技

Java 記憶體模型(堆疊)

Jvm 內部,Java 記憶體模型把記憶體分成了兩個部分:執行緒棧區和堆區:

棧區包含:執行緒執行資訊(執行緒棧),本地原始型別變數(boolean,byte, short, int, long, float, double)
堆區包含:Java 應用建立的所有物件資訊,基礎型別的封裝類

  1. 一個本地變數如果是原始型別,儲存棧中
  2. 一個本地變數是一個物件的引用,那麼這個本地引用儲存棧,物件本身儲存堆中
  3. 一個物件的成員方法,儲存棧中,方法中包含的原始型別變數,儲存堆中
  4. 一個物件的成員變數,無論是原始型別還是包裝型別,都儲存堆中
  5. 堆中資料可被多個執行緒共享,對於原始型別變數,每個執行緒都會拷貝一份

硬體記憶體架構

不管什麼記憶體模型,最終還是執行在計算機硬體上,因此有必要了解計算機硬體的記憶體架構

  1. 現在計算機一般都有2個以上cpu, 每個cpu還有多個核心,執行緒會在各個cpu核心中並行執行
  2. CPU 內部會有一組CPU 暫存器、CPU 快取(一級,二級,三級快取),RAM主存
  3. 儲存速度: CPU 暫存器 > CPU 快取(一級> 二級> 三級) > RAM
  4. 儲存大小 CPU 暫存器(64 bit) < CPU 快取[一級(64k)> 二級(256k)> 三級(8MB)] < RAM(4G)

執行緒間的競爭現象

  1. 存在 count 為1, 兩個執行緒都在快取中儲存一份備份
  2. 兩個執行緒分別改變 count 的值,存在寫快取,顧快取和 RAM的值存在偏差
  3. 當寫快取的資料 flush 到 RAM 就發生衝突了

記憶體屏障(Memory Barrier):

  1. 記憶體屏障,又稱記憶體柵欄,是一個CPU 指令
  2. 保證特定操作的執行順序。編譯器和CPU會重排序指令,為了優化,插入記憶體屏障指令會讓CPU不把這條指令重排序。
  3. 影響某些資料(或某條指令的執行結果)的記憶體可見性。強制重新整理各種CPU cache, 寫快取的資料直接寫入RAM,讀快取重新讀取資料

記憶體屏障和 Java 有什麼關係?

volatile 是基於 Memory Barrier 實現的。

這意味著,如果寫入一個 volatile 變數a,可以保證:

  1. 一個執行緒寫入變數a 後,任何執行緒訪問該變數都會拿到最新值
  2. 由於會重新整理 Cache中所有先前寫入,因此寫入變數a之前的寫入操作,其更新的資料對於其它執行緒也是可見的

相關推薦

Java 記憶體模型硬體記憶體架構筆記

前言 可跟《主存存取和磁碟存取原理筆記》串著看 雜技 Java 記憶體模型(堆疊) Jvm 內部,Java 記憶體模型把記憶體分成了兩個部分:執行緒棧區和堆區: 棧區包含:執行緒執行資訊(執行緒棧),本地原始型別變數(boolean,byte, short, int, long, float, doubl

Java 記憶體模型 JVM 記憶體結構真不是一回事

這兩個概念估計有不少人會混淆,它們都可以說是 JVM 規範的一部分,但真不是一回事!它們描述和解決的是不同問題,簡單來說, Java 記憶體模型,描述的是多執行緒允許的行為 JVM 記憶體結構,描述的是執行緒執行所設計的記憶體空間 JVM 是什麼呢?它遮蔽了底層架構的差異性,是 Java 跨平臺的依據,也

Java高併發程式設計學習筆記(三):Java記憶體模型執行緒安全

文章目錄 原子性 有序性 可見性 – 編譯器優化 – 硬體優化(如寫吸收,批操作) Java虛擬機器層面的可見性 Happen-Before規則(先行發生) 程式順序原則: volat

Java併發程式設計裡的volatile。Java記憶體模型核CPU記憶體架構的對應關係 Java併發程式設計:volatile關鍵字解析

  CPU記憶體架構:https://www.jianshu.com/p/3d1eb589b48e Java記憶體模型:https://www.jianshu.com/p/27a9003c33f4 多執行緒下的快取一致性問題:https://www.jianshu.com/p/97dc5242

併發程式設計-(3)Java記憶體模型volatile

目錄 1、記憶體模型概念 2、多執行緒的特性 1.1、原子性 1.2、可見性 1.3、有序性 2、Java記憶體模型 2.1、JMM和JVM 2.2、Java記憶體模型(JMM) 2.2.1、案例 2

[高併發Java 三] Java記憶體模型執行緒安全

網上很多資料在描述Java記憶體模型的時候,都會介紹有一個主存,然後每個工作執行緒有自己的工作記憶體。資料在主存中會有一份,在工作記憶體中也有一份。工作記憶體和主存之間會有各種原子操作去進行同步。 但是由於Java版本的不斷演變,記憶體模型也進行了改變。本文只講述Jav

java記憶體模型記憶體分配

1.什麼是jvm?(1)jvm是一種用於計算裝置的規範,它是一個虛構出來的機器,是通過在實際的計算機上模擬模擬各種功能實現的。(2)jvm包含一套位元組碼指令集,一組暫存器,一個棧,一個垃圾回收堆和一個儲存方法域。(3)JVM遮蔽了與具體作業系統平臺相關的資訊,使Java程式只需生成在Java虛擬機器上執行的

JVM記憶體結構、Java記憶體模型Java物件模型,你知道它們之間的區別嗎?

Java作為一種面向物件的,跨平臺語言,其物件、記憶體等一直是比較難的知識點。而且很多概念的名稱看起來又那麼相似,很多人會傻傻分不清楚。比如本文我們要討論的JVM記憶體結構、Java記憶體模型和Java物件模型,這就是三個截然不同的概念,但是很多人容易弄混。可以這樣說,很多高

實戰Java高併發程式設計之Java記憶體模型執行緒安全

Java記憶體模型 原子性: 是指一個操作是不可中斷的.即使多個執行緒一起執行的時候,一個操作一旦開始,就不會被其他執行緒干擾. 一般CPU的指令是原子的. Q:i++是原子操作嗎? A:不是.

java記憶體模型多執行緒

單個處理器的頻率越來越難以提升,因此人們轉而面向多處理器,這麼多年來致力於提高程式的執行效率,然而面向多核處理器的併發程式設計卻不是那麼的輕鬆,java在語言級別提供的多執行緒併發能力為我們編寫併發的程式提供了不少便利。但是本文並不打算講述如何編寫多執行緒併發程式,而是嘗試

JVM記憶體結構、Java記憶體模型Java物件模型

Java作為一種面向物件的,跨平臺語言,其物件、記憶體等一直是比較難的知識點。而且很多概念的名稱看起來又那麼相似,很多人會傻傻分不清楚。比如本文要討論的JVM記憶體結構、Java記憶體模型和Java物件模型,這就是三個截然不同的概念,但是很多人容易弄混。 首先,這三個概念是完全不同的三個概念。本文主要目的是對

Java多執行緒系列七)Java記憶體模型執行緒的三大特性

Java記憶體模型和執行緒的三大特性 多執行緒有三大特性:原子性、可見性、有序性 1、Java記憶體模型 Java記憶體模型(Java Memory Model ,JMM),決定一個執行緒對共享變數的寫入時,能對另一個執行緒可見。從抽象的角度來看,JMM定義了執行緒和主記憶體之間的抽象關係:執行緒之間的

JAVA記憶體模型Happens-Before規則

  前言 上一篇文章王子給大家介紹了併發程式設計中比較關心的三個核心問題,可見性、有序性和原子性。 今天我們繼續來探索併發程式設計的內容,聊一聊JAVA的記憶體模型和Happens-Before規則。   JAVA記憶體模型 這裡的JAVA記憶體模型指的不是我們JVM專欄中提到的記憶體分佈

C++PrimerPlus學習之記憶體模型名稱空間

標頭檔案 如果檔名包含在尖括號中,則C++編譯器將在儲存標準標頭檔案的主機系統的檔案系統的中查詢。如果檔名包含在雙引號中,則編譯器將在當前目錄下查詢。 使用條件編譯防止多次包含標頭檔案 #ifndef XXX_H_ #define XXX_H_ ... #en

速記JVM記憶體模型垃圾回收策略

一、常用JVM引數 -Xms: 初始堆大小 -Xmx: 最大堆 -Xss: 棧容量 -PermSize: 方法區大小 -MaxPermSize: 最大方法區大小 -MaxDirectMemorySize: 最大直接記憶體大小 二、java虛擬機器基本結構   1.

C++ primer plus 第9章 記憶體模型名稱空間

C++11中,關鍵字auto用於自動型別推斷,但在C語言和以前的C++版本中,auto的含義截然不同,它用於顯式地指出變數Wie自動儲存。 1.自動變數和棧 程式必須在執行時對自動變數進行管理,常用方法:留出一段記憶體,並將其視為棧,以管理變數的增減。程式使用兩個指標來跟蹤棧,一個指標指向棧

Java記憶體模型(JVM的記憶體劃分)(不看後悔,一看必懂)

執行緒共享區:堆和方法區 執行緒獨佔區:棧,本地方法區和程式計數器 堆:存放的是new出來的東西(物件例項),被final修飾的區域性變數.java堆是垃圾收集器管理的主要區域,因此很多時候被稱為”

Java IO速度佔用記憶體的極致優化方法,模板方法【從hdu 2602 說起】

談起java,給人的第一映像是什麼?除了簡單方便易上手,跨平臺可移植,各種函式庫支援類應有盡有不用重複造輪子這些特性之外,恐怕就是速度慢,佔用記憶體高了吧。不可否認,java執行速度和記憶體佔用方便確實無法比肩C/C++。隨手舉一個很直觀的栗子,在ACM等其他演算法競賽中,

jvm記憶體模型記憶體分配

http://www.w2bc.com/Article/83700 1.什麼是jvm? (1)jvm是一種用於計算裝置的規範,它是一個虛構出來的機器,是通過在實際的計算機上模擬模擬各種功能實現的。 (2)jvm包含一套位元組碼指令集,一組暫存器,一個棧,一個垃圾回收堆

如何利用記憶體共享記憶體構建高速的程序間通訊模型

#include "messagequeue.h" #include BYTE* CMssageQueue::mpCurrAddr = nullptr; CMssageQueue::CMssageQueue() { miBegin = 0; miEnd = 0; miOffse