## **數據類型**
Java虛擬機中,數據類型可以分為兩類:**基本類型**和**引用類型**。
* **基本類型**
基本類型的變量保存原始值,他代表的值就是數值本身。
包括:byte,short,int,long,char,float,double,boolean,returnAddress
* **引用類型**
引用類型的變量保存的是引用對象的地址。
包括:**類類型**,**接口類型**和**數組**
## **內存結構**
JVM 內存分配結構對于不同的JDK版本有不同的結構類型,下圖



觀察上圖發現,JVM內存結構主要包括
* 堆
* 虛擬機棧
* 本地方法棧
* 方法區(JDK7之后版本就去除了)
* 程序計數器
## **堆**
java堆是java虛擬機所管理的內存中最大的一塊,該內存區域的唯一目的就是存放對象實例。JDK7后,字符串常量池從永久代中剝離出來,存放在堆中。
堆被劃分成兩個不同的區域:新生代 ( Young )、老年代 ( Old )。新生代 ( Young ) 又被劃分為三個區域:Eden、From Survivor、To Survivor。

## **虛擬機棧**
虛擬機棧描述的是Java方法執行的內存模型:每個方法在執行的同時都會創建一個棧幀(Stack Frame)用于存儲局部變量表、操作數棧、動態鏈接、方法出口等信息。

* **局部變量表**
用于存放**方法參數**和**方法內部定義的局部變量**
* **操作棧**
用于存放計算操作所需的值以及結果值
* **動態鏈接**
每個棧幀都包含一個指向運行時常量池中該棧幀所屬方法的引用,持有這個引用是為了支持方法調用過程中的動態連接
* **返回地址**
用于保存方法執行完成后返回的地址
> 棧是運行時的單位,而堆是存儲的單位;棧主要解決程序如何處理數據,堆解決的是數據存儲的問題,即數據怎么放、放在哪兒。
## **本地方法棧**
本地方法棧與虛擬機棧所發揮作用非常相似,它們之間的區別不過是虛擬機棧為虛擬機執行Java方法服務,而本地方法棧則為虛擬機使用到的native方法服務
## **程序計數器**
程序計數器是一塊較小的內存空間,它可以看作是當前線程所執行的字節碼的行號指示器。
## **方法區**
它用于存儲已被虛擬機加載的類信息、常量、靜態變量、即時編譯器編譯后的代碼等數據。
## **常量池**
常量池中主要存放兩類數據,一是字面量、二是符號引用,JDK6常量池位于方法區中,JDK7之后常量池存放在堆中。
* **字面量**:比如String類型的字符串值或者定義為final類型的常量的值
* **符號引用**:
1. 類或接口的全限定名(包括他的父類和所實現的接口)
2. 變量或方法的名稱
3. 方法的描述信息(參數個數、參數類型、方法返回類型等等)
4. 變量的描述信息(變量的返回值)