#### 1.Java內存模型 (Java 內存管理機制)
1)運行時數據區
Java虛擬機在執行Java程序時,會把它所管理的內存劃分為若干個不同的數據區域。
> **線程隔離的數據區**
> 程序計數器:
是一塊較小的內存空間,它可以看作是當前線程所執行的字節碼的行號指示器。每條線程都需要有一個獨立的程序計數器,各條線程之間計數器互不影響,獨立存儲(線程私有的內存)。
此內存區域是唯一一個在Java虛擬機規范中沒有規定任何OutOfMemoryError情況的區域。
> java虛擬機棧:
也是線程私有的,它的生命周期與線程相同。
虛擬機棧描述的是Java方法執行的內存模型:每個方法在執行的同時都會創建一個棧幀用于存儲局部變量表、操作數棧、動態鏈接、方法出口等信息。
在Java虛擬機規范中,對這個區域規定了兩種異常狀況:如果線程請求的棧深度大于虛擬機所允許的深度,將拋出StackOverflowError異常;如果虛擬機棧可以動態擴展,如在擴展時無法申請到足夠的內存,就會拋出OutOfMemoryError異常。
> 本地方法棧:
與虛擬機棧所發揮的作用非常相似。區別是虛擬機棧為虛擬機執行Java方法(也就是字節碼)服務,而本地方法棧則為虛擬機使用到的Native方法服務。
與虛擬機棧一樣,本地方法棧區域也會拋出StackOverflowError和OutOfMemoryError異常。
> **由所有線程共享的數據區**
> Java堆:
Java堆是Java虛擬機所管理的內存中最大的一塊。它被所有線程共享,在虛擬機啟動時創建。此內存區域的唯一目的就是存放對象實例,幾乎所有對象實例都在這里分配內存。
Java堆是垃圾收集器管理的主要區域。
Java堆可以處于物理上不連續的內存空間中,只要邏輯上是連續的即可。如果在堆中沒有內存完成實例分,并且堆也無法再擴展時,將分拋出OutOfMemoryError異常。
> 方法區:
與Java堆一樣,是各個線程共享的內存區域,它用于存儲已被虛擬機加載的類信息、常量、靜態變量、即時編譯器編譯后的代碼等數據。
相對而言,垃圾收集行為在這個區域是比較少出現的,但并非數據進入方法區就永久存在了。這個區域的內存回收目標主要是針對常量池的回收和對類型的卸載,一般回收成績較差。
當方法區無法滿足內存分配需求時,將拋出OutOfMemoryError異常。
內存分配和回收策略
#### 2.Android虛擬機的特點
#### 3.Dalvik和Art的區別
#### 4.熟悉垃圾回收的實現機制,了解虛擬機的GC類型