Java深入|JVM內存結構與Java內存模型

JVM內存結構與Java內存模型

文章目錄

1)JVM內存結構
2)Java內存模型


JVM內存結構

  • JVM內存結構,由Java虛擬機規範定義,描述的是Java程序執行過程中,由JVM管理的不同數據區域。
  • Java代碼是運行在虛擬機上的,虛擬機在執行Java程序的過程中會把所管理的內存劃分爲若干個不同的數據區域,各個區域有其特定的功能。
    • 1).PC寄存器
      • 各個線程獨享
    • 2).Java虛擬機棧
      • 各個線程獨享
    • 3).本地方法棧
      • 各個線程獨享
    • 4).Java堆
      • 所有線程共享
    • 5).方法區
      • 所有線程共享
  • 棧內存堆內存的區別
    • 1.棧內存用來存儲局部變量和方法調用,堆內存用來存儲Java中的對象。
    • 2.棧內存屬於單個線程,堆內存中的對象對所有線程可見,可以被所有線程訪問。
    • 3.棧內存沒有可用的空間存儲方法調用和局部變量,會拋出StackOverFlowError,堆則會拋出OutofMemoryError
    • 4.棧的內存要遠遠小於堆內存。

Java內存模型

  • JMM並不像JVM內存結構一樣是真實存在的,只是一個抽象的概念它與多線程相關,描述了一組規則或規範,定義了一個線程對共享變量的寫入時對另一個線程是可見的。
  • Java多線程之間通過共享內存進行通信。
  • JMM定義了一些語法集,這些語法集映射到Java語言中就是volatile、synchronized等關鍵字。
    • 1.主內存
      • 所有的變量(實例字段,靜態字段,構成數組對象的元素,但是不包括局部變量和方法參數)都必須在主內存中產生
    • 2.工作內存
      • 每個線程都有自己的工作內存,保存了線程需要的變量在內存中的副本。
      • 線程對主內存變量的修改必須在線程的工作內存中進行,不能直接讀取主內存中的變量。
      • 不同線程之間也不能相互訪問對方的工作內存,如需傳遞變量的值,必須通過主內存來作爲中介進行傳遞。
  • 工作內存與主內存進行交互
    • lock
      • 作用於主內存的變量,一個變量在同一時間只能一個線程鎖定,表示這條線程獨佔這個變量。
    • unlock
    • read
      • 把一個主內存變量的值傳輸到線程的工作內存
    • load
      • 把read操作從主內存中讀取的變量的值放到工作內存的變量副本中。
    • use
      • 把工作內存中的一個變量的值傳遞給執行引擎
    • assign
      • 把執行引擎返回的結果賦值給工作內存中的變量
    • store
      • 把工作內存中的變量的值傳遞給主內存
    • write
      • 把store操作得到的值放入主內存的變量中
      • 從主內存傳輸到工作內存,執行read->load
      • 從工作內存回寫到主內存,執行store->write
  • java虛擬機中主內存和工作內存交互,就是一個變量如何從主內存傳輸到工作內存中,如何把修改後的變量從工作內存同步回主內存。
  • 併發內存模型
    • Java內存模型圍繞着併發過程中如何處理原子性、可見性和順序性這三個特徵來設計的。
    • 1.原子性
      • 在Synchronized塊之間的代碼都具有原子性
    • 2.可見性
      • volatile,synchronized,final可以實現可見性
    • 3.有序性
      • volatile禁止指令重排序
      • synchronized 一個變量在同一時刻只能被一個線程對其lock操作

參考

JVM內存結構 VS Java內存模型 VS Java對象模型
JVM中堆和棧的區別
深入理解Java內存模型

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章