深入瞭解Java虛擬機(內存管理)

深入瞭解Java虛擬機(內存管理)

JDK、JRE與JVM之間的關係:

JDK全稱爲Java SE Development Kit(Java開發工具),提供了編譯和運行Java程序所需的各種資源和工具,包括:JRE+java開發工具。
JRE全稱爲Java runtime environment(Java運行環境),包括:虛擬機+java的核心類庫。
JVM是運行Java程序的核心虛擬機。

在這裏插入圖片描述

JVM的內存管理

在這裏插入圖片描述

程序計數器

**程序計數器(處於線程獨佔區)**是一個非常小的內存空間,它可以看成是當前線程所執行的字節碼的行號指示器。此區域是唯一一個在Java虛擬機規範中沒有規定任何OutOfMemoryError情況的區域。如果線程執行的是java方法,這個計數器記錄的是正在執行的虛擬字節碼指令的地址。如果正在執行的是native方法,那麼這個計數器的值爲undefined。程序計數器的作用就是因爲多線程可能會使線程掛起,然後掛起的線程恢復時,程序計數器找到運行的位置

虛擬機棧(線程棧)

虛擬機棧描述的是Java方法執行的動態內存模型。
棧幀: 每個方法執行都要創建一個棧幀,方法執行完畢,棧幀銷燬。
用於存儲局部變量表,操作數棧,動態鏈接,方法出口等。
**局部變量表:**存放編譯期可知的各種基本數據類型,引用類型,局部變量表的大小在編譯期便已經可以確定,在運行時期不會發生改變。
棧的大小:如果棧滿了,StackOverFlowError,遞歸調用很常見
在這裏插入圖片描述
操作數棧:就是存儲比如 int = 0,操作數棧存儲數字0,然後局部變量表把數字賦值給變量。

本地方法棧

本地方法棧爲虛擬機執行native方法

方法區

存儲虛擬機加載的類信息(類的版本、字段、方法、接口),常量,靜態常量,以及編譯後的class文件都在方法區。

堆內存用於存放由new創建的對象和數組。在堆中分配的內存,由java虛擬機自動垃圾回收器來管理。在堆中產生了一個數組或者對象後,還可以在棧中定義一個特殊的變量,這個變量的取值等於數組或者對象在堆內存中的首地址,在棧中的這個特殊的變量就變成了數組或者對象的引用變量,以後就可以在程序中使用棧內存中的引用變量來訪問堆中的數組或者對象,引用變量相當於爲數組或者對象起的一個別名,或者代號。
  根據垃圾回收機制的不同,Java堆有可能擁有不同的結構,最爲常見的就是將整個Java堆分爲新生代和老年代。其中新聲帶存放新生的對象或者年齡不大的對象,老年代則存放老年對象。
新生代分爲eden區、s0區、s1區,s0和s1也被稱爲from和to區域,他們是兩塊大小相等並且可以互相角色的空間。
  絕大多數情況下,對象首先分配在eden區,在新生代回收後,如果對象還存活,則進入s0或s1區,之後每經過一次新生代回收,如果對象存活則它的年齡就加1,對象達到一定的年齡後,則進入老年代。
  在這裏插入圖片描述

對象頭

在這裏插入圖片描述

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