淺析java內存模型(JMM)

淺析java內存模型(JMM)

內存模型邏輯圖

JDK1.7內存模型
在這裏插入圖片描述
這裏就拿JDK1.7的內存模型說明內存模型運行時數據區中各部分的作用

程序計數器

程序計數器是一個記錄着當前線程所執行的字節碼的行號指示器。
JVM的多線程是通過CPU時間片輪轉(即線程輪流切換並分配處理器執行時間)算法來實現的。在JVM中,通過程序計數器來記錄某個線程的字節碼執行位置。因此,程序計數器是具備線程隔離的特性,也就是說,每個線程工作時都有屬於自己的獨立計數器。
程序計數器佔用內存很小,在進行JVM內存計算時,可以忽略不計。程序計數器,是唯一一個在java虛擬機規範中沒有規定任何OutOfMemoryError的區域

虛擬機棧

在這裏插入圖片描述

本地方法棧

本地方法棧和Java棧所發揮的作用非常相似,區別不過是Java棧爲JVM執行Java方法服務,而本地方法棧爲JVM執行Native方法服務。本地方法棧也會拋出StackOverflowError和OutOfMemoryError異常。

heap(堆)

虛擬機堆:堆是JVM所管理的內存中國最大的一塊,是被所有Java線程鎖共享的,不是線程安全的,在JVM啓動時創建。堆是存儲Java對象的地方,這一點Java虛擬機規範中描述是:所有的對象實例以及數組都要在堆上分配。Java堆是GC管理的主要區域,從內存回收的角度來看,由於現在GC基本都採用分代收集算法,所以Java堆還可以細分爲:新生代和老年代;新生代再細緻一點有Eden空間、From Survivor空間、To Survivor空間等。

方法區

  1. 方法區存放了要加載的類的信息(名稱、修飾符等)、類中的靜態常量、類中定義爲final類型的常量、類中的Field信息、類中的方法信息,當在程序中通過Class對象的getName.isInterface等方法來獲取信息時,這些數據都來源於方法區。
  2. 方法區是被Java線程所共享的,不像Java堆中其他部分一樣會頻繁被GC回收,它存儲的信息相對比較穩定,在一定條件下會被GC,當方法區要使用的內存超過其允許的大小時,會拋出OutOfMemory的錯誤信息。方法區也是堆中的一部分,就是我們通常所說的Java堆中的永久區 Permanet Generation,大小可以通過參數來設置,可以通過-XX:PermSize指定初始值,-XX:MaxPermSize指定最大值。
  3. 方法區包含 常量池Constant Pool
    常量池本身是方法區中的一個數據結構。常量池中存儲瞭如字符串、final變量值、類名和方法名常量。常量池在編譯期間就被確定,並保存在已編譯的.class文件中。一般分爲兩類:字面量和應用量。字面量就是字符串、final變量等。類名和方法名屬於應用量。應用量最常見的是在調用方法的時候,根據方法名找到方法的應用,並以此定爲到函數體進行函數代碼的執行。應用量包含:類和接口的權限定名、字段的名稱和描述符,方法的名稱和描述符。

生命週期

跟線程相同

程序計數器、棧、本地方法棧都是線程創建時創建、銷燬時銷燬的。線程獨享,線程安全的。

所有線程共享

方法區、堆

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