天天看點

jvm知識點整理

記憶體區域劃分:

1. 程式計數器,多核時,每個線程都會有一個獨立的程式計數器,可以了解為是線程私有的

2. 虛拟機棧,也是每個線程私有的,生命周期和線程相同,描述的是java方法執行的記憶體模型。java方法在 執行時,會建立一個棧幀(方法的基本資訊,局部變量,方法出口等)。方法從調用到執行完成的過程,對應着一個棧幀從虛拟機棧從入棧到出棧的過程。虛拟機棧溢出抛出的異常是StackOverflowError,當然也會抛出OOM,此時是因為線程請求的棧深度雖然沒有達到虛拟機所允許的深度,但是在壓棧時,無法申請到足夠的記憶體。虛拟機棧可以了解為線程的工作記憶體。

3. 本地方法棧,和虛拟機棧類似,差別為本地方法棧是為本地方法 (Native)服務。

4. java 堆(heap),該記憶體區域為所有線程共享,是GC管理的主要區域。現在的垃圾回收機制主要有分代回收的思想。具體涉及到的垃圾回收算法在下一節中專門陳述。

5. 方法區,和java堆一樣,該區域為各個線程所共享,用于存儲已被虛拟機加載的類資訊,常量,靜态變量,即時編譯器編譯後的代碼等資料。該區域 較少發生垃圾收集行為,在java虛拟機規範中也将方法區描述為堆的一個邏輯部分,很多人也願意将方法區稱為永久代。當方法區無法滿足記憶體配置設定需求時,将抛出OOMError.

6. 運作時常量池,也是方法區的一部分,注意該區域是動态的。除了編譯時産生的常量會進入外,運作期間也會産生新的常量進入,比如,String.intern()方法的調用。

7. 直接記憶體。NIO。

8.