java內存模型的底層原理(java內存模型的理解)

本文目錄一覽:

java創建對象底層原理是什麼,java中的對象到底在內存中是什麼,別說什麼類的具體實例化

對象是類的實例,同一個類的不同實例當然擁有相同的機器指令(相同的方法行為),不同的實例擁有不同的屬性內存,相同的指令操作不同的內存得到各自的結果。

舉個例子:

我們描述一個類:水果,它有兩個屬性,名稱和數量,一個方法設置數量(setNum)。

現在,我們實例兩個水果,一個蘋果和一個西瓜(假如初始是一個),此時得為蘋果和西瓜各自準備一個不同的存放空間(不能重疊了是吧,這就是為不同對象分配不同的堆內存),然後我們為兩個對象都執行設置數量方法(都是setNum,同一個行為),假如蘋果改為2,西瓜

改為5,此時兩個不同對象執行了同一個方法得到個各自的結果。

下面補充一些官方描述:

java創建類時,也即是你所說的原類,其實只是對那個類的對象的外觀與行為的描述(此時並未開闢堆內存,當然static例外)。只有當使用new創建那個類的對象時才會分配數據存儲空間,其方法才供外界調用。

java為指定類創建對象,其實就是為類的描述創建屬性值存儲空間並初始化,並在堆棧中創建其指針,如果有方法局部變數,方法也會有自己的臨時堆棧。

一個對象是一個堆棧地址所指向的一組堆內存,然後對象的行為則是java語言編譯後的機器指令代碼,指令執行操縱內存的數據。

如果有更合理的理解,或者認為我的理解有不對的地方歡迎指正,學習就是不斷接近真相。

什麼是Java內存模型?

1.java內存模型簡稱JMM

2.通俗點講就是指你代碼中寫的那些內容在內存中是怎麼存儲的

3.比如說 Student stu = new Student();int a = 5; 你新建了一個學生類,建立了一個變數a,這些內容在內存中是咋存儲的,

4.大的來說JMM分為堆棧,一般情況下學生類分配在堆,變數a分配在棧,

Java內存模型FAQ 什麼是內存模型

內存模型描述的是程序中各變數(實例域、靜態域和數組元素)之間的關係,以及在實際計算機系統中將變數存儲到內存和從內存取出變數這樣的低層細節。對象最終存儲在內存中,但編譯器、運行庫、處理器或緩存可以有特權定時地在變數的指定內存位置存入或取出變數值。例如,編譯器為了優化一個循環索引變數,可能會選擇把它存儲到一個寄存器中,或者緩存會延遲到一個更適合的時間,才把一個新的變數值存入主存。所有的這些優化是為了幫助實現更高的性能,通常這對於用戶來說是透明的,但是對多處理系統來說,這些複雜的事情可能有時會完全顯現出來。

JMM 允許編譯器和緩存以數據在處理器特定的緩存(或寄存器)和主存之間移動的次序擁有重要的特權,除非程序員已經使用 synchronized 或 final 明確地請求了某些可見性保證。這意味著在缺乏同步的情況下,從不同的線程角度來看,內存的操作是以不同的次序發生的。

與之相對應地,像 C 和 C++ 這些語言就沒有顯示的內存模型 —— 但 C 語言程序繼承了執行程序處理器的內存模型(儘管一個給定體系結構的編譯器可能知道有關底層處理器的內存模型的一些情況,並且保持一致性的一部分責任也落到了該編譯器的頭上)。這意味著並發的 C 語言程序可以在一個,而不能在另一個,處理器體系結構上正確地運行。雖然一開始 JMM 會有些混亂,但這有個很大的好處 —— 根據 JMM 而被正確同步的程序能正確地運行在任何支持 Java 的平台上。

玉溪java培訓學校告訴你java多線程的內存模型?

硬體的內存模型

物理機並發處理的方案對於jvm的內存模型實現,也有很大的參考作用,畢竟jvm也是在硬體層上來做事情,底層架構也決定了上層的建築建模方式。

計算機並發並非只是多個處理器都參與進來計算就可以了,會牽扯到一些列硬體的問題,最直接的就是要和內存做交互。但計算機的存儲設備與處理器的預算速度相差太大,完全不能滿足處理器的處理速度,怎麼辦,這就是後續加入的一層讀寫速度接近處理器運算速度的高速緩存來作為處理器和內存之間的緩衝。

高速緩存一邊把使用的數據,從內存複製搬入,方便處理器快速運算,一邊把運算後的數據,再同步到主內存中,如此處理器就無需等待了。

高速緩存雖然解決了處理器和內存的矛盾,但也為計算機帶來了另一個問題:緩存一致性。特別是當多個處理器都涉及到同一塊主內存區域的時候,將可能會導致各自的緩存數據不一致。

那麼出現不一致情況的時候,以誰的為準?

為了解決這個問題,處理器和內存之間的讀寫的時候需要遵循一定的協議來操作,這類協議有:MSI、MESI、MOSI、Synapse、Firefly以及DragonProtocol等。這就是上圖中處理器、高速緩存、以及內存之間的處理方式。

另外除了高速緩存之外,為了充分利用處理器,處理器還會把輸入的指令碼進行亂序執行優化,只要保證輸出一致,輸入的信息可以亂序執行重組,所以程序中的語句計算順序和輸入代碼的順序並非一致。

JVM內存模型

上面我們了解了硬體的內存模型,以此為借鑒,我們看看jvm的內存模型。

jvm定義的一套java內存模型為了能夠跨平台達到一致的內存訪問效果,從而屏蔽掉了各種硬體和操作系統的內存訪問差異。這點和c和c++並不一樣,C和C++會直接使用物理硬體和操作系統的內存模型來處理,所以在各個平台上會有差異,這一點java不會。

java的內存模型規定了所有的變數都存儲在主內存中,java課程發現每個線程擁有自己的工作內存,工作內存保存了該線程使用到的變數的主內存拷貝,線程對變數所有操作,讀取,賦值,都必須在工作內存中進行,不能直接寫主內存變數,線程間變數值的傳遞均需要主內存來完成。

北大青鳥java培訓:Java內存模型原理?

這篇文章主要介紹模型產生的問題背景,解決的問題,處理思路,相關實現規則,環環相扣,希望讀者看完這篇文章後能對Java內存模型體系產生一個相對清晰的理解,知其然知其所以然。

內存模型產生背景在介紹Java內存模型之前,java課程認為應該先了解一下物理計算機中的並發問題,理解這些問題可以搞清楚內存模型產生的背景。

物理機遇到的並發問題與虛擬機中的情況有不少相似之處,物理機的解決方案對虛擬機的實現有相當的參考意義。

物理機的並發問題硬體的效率問題計算機處理器處理絕大多數運行任務都不可能只靠處理器「計算」就能完成,處理器至少需要與內存交互,如讀取運算數據、存儲運算結果,這個I/O操作很難消除(無法僅靠寄存器完成所有運算任務)。

由於計算機的存儲設備與處理器的運算速度有幾個數量級的差距,為了避免處理器等待緩慢的內存完成讀寫操作,現代計算機系統通過加入一層讀寫速度儘可能接近處理器運算速度的高速緩存。

緩存作為內存和處理器之間的緩衝:將運算需要使用到的數據複製到緩存中,讓運算能快速運行,當運算結束後再從緩存同步回內存之中。

緩存一致性問題基於高速緩存的存儲系統交互很好的解決了處理器與內存速度的矛盾,但是也為計算機系統帶來更高的複雜度,因為引入了一個新問題:緩存一致性。

在多處理器的系統中(或者單處理器多核的系統),每個處理器(每個核)都有自己的高速緩存,而它們有共享同一主內存(MainMemory)。

當多個處理器的運算任務都涉及同一塊主內存區域時,將可能導致各自的緩存數據不一致。

為此,需要各個處理器訪問緩存時都遵循一些協議,在讀寫時要根據協議進行操作,來維護緩存的一致性。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/249802.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-12 17:13
下一篇 2024-12-12 17:13

相關推薦

  • TensorFlow Serving Java:實現開發全功能的模型服務

    TensorFlow Serving Java是作為TensorFlow Serving的Java API,可以輕鬆地將基於TensorFlow模型的服務集成到Java應用程序中。…

    編程 2025-04-29
  • Python創建分配內存的方法

    在python中,我們常常需要創建並分配內存來存儲數據。不同的類型和數據結構可能需要不同的方法來分配內存。本文將從多個方面介紹Python創建分配內存的方法,包括列表、元組、字典、…

    編程 2025-04-29
  • Python訓練模型後如何投入應用

    Python已成為機器學習和深度學習領域中熱門的編程語言之一,在訓練完模型後如何將其投入應用中,是一個重要問題。本文將從多個方面為大家詳細闡述。 一、模型持久化 在應用中使用訓練好…

    編程 2025-04-29
  • Harris角點檢測演算法原理與實現

    本文將從多個方面對Harris角點檢測演算法進行詳細的闡述,包括演算法原理、實現步驟、代碼實現等。 一、Harris角點檢測演算法原理 Harris角點檢測演算法是一種經典的計算機視覺演算法…

    編程 2025-04-29
  • 瘦臉演算法 Python 原理與實現

    本文將從多個方面詳細闡述瘦臉演算法 Python 實現的原理和方法,包括該演算法的意義、流程、代碼實現、優化等內容。 一、演算法意義 隨著科技的發展,瘦臉演算法已經成為了人們修圖中不可缺少…

    編程 2025-04-29
  • Python實現一元線性回歸模型

    本文將從多個方面詳細闡述Python實現一元線性回歸模型的代碼。如果你對線性回歸模型有一些了解,對Python語言也有所掌握,那麼本文將對你有所幫助。在開始介紹具體代碼前,讓我們先…

    編程 2025-04-29
  • ARIMA模型Python應用用法介紹

    ARIMA(自回歸移動平均模型)是一種時序分析常用的模型,廣泛應用於股票、經濟等領域。本文將從多個方面詳細闡述ARIMA模型的Python實現方式。 一、ARIMA模型是什麼? A…

    編程 2025-04-29
  • Python變數在內存中的存儲

    該文章將從多個方面對Python變數在內存中的存儲進行詳細闡述,包括變數的聲明和賦值、變數的引用和指向、內存地址的變化、內存管理機制等。 一、聲明和賦值 在Python中,變數聲明…

    編程 2025-04-29
  • 神經網路BP演算法原理

    本文將從多個方面對神經網路BP演算法原理進行詳細闡述,並給出完整的代碼示例。 一、BP演算法簡介 BP演算法是一種常用的神經網路訓練演算法,其全稱為反向傳播演算法。BP演算法的基本思想是通過正…

    編程 2025-04-29
  • VAR模型是用來幹嘛

    VAR(向量自回歸)模型是一種經濟學中的統計模型,用於分析並預測多個變數之間的關係。 一、多變數時間序列分析 VAR模型可以對多個變數的時間序列數據進行分析和建模,通過對變數之間的…

    編程 2025-04-28

發表回復

登錄後才能評論