本文目錄一覽:
- 1、java創建對象底層原理是什麼,java中的對象到底在內存中是什麼,別說什麼類的具體實例化
- 2、什麼是Java內存模型?
- 3、Java內存模型FAQ 什麼是內存模型
- 4、玉溪java培訓學校告訴你java多線程的內存模型?
- 5、北大青鳥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-hant/n/249802.html