素小暖講JVM:第一章 走進Java,第二章 Java內存區域與內存溢出異常

本系列是用來記錄《深刻理解Java虛擬機》這本書的讀書筆記。方便本身查看,也方便你們查閱。多線程

欲速則不達,欲達則欲速!併發

第一章 走進Javajvm

1、Java虛擬機發展史優化

這部分一帶而過吧,有興趣的能夠閱讀原著!spa

2、Java內存管理,class文件結構與執行引擎,編譯器優化,多線程併發的簡單解釋(後續章節詳述)線程

  1. 自動內存管理講的是Java運行時數據區裏的部分分爲內存劃分和垃圾收集器
  2. 執行子系講的是類文件管理、類加載機制、字節碼執行引擎
  3. 優化分爲編譯器優化和運行期優化
  4. 併發講的是虛擬機是如何實現多線程的

具體能夠結合下面的jvm結構圖來看,這張圖是基於JDK1.7的。JDK1.7以前,常量池是存放在方法區中的,1.7以後常量池存放在堆中。3d

第二章 Java內存區域與內存溢出異常對象

1、運行時數據區域blog

一、程序計數器內存

程序計數器是一塊較小的內存空間,它能夠看做是當前線程所執行的字節碼的行號指示器。在虛擬機的概念模型裏,字節碼解釋器工做時就是經過改變這個計數器的值來選取下一條須要執行的字節碼指令,分支、循環、跳轉、異常處理、線程恢復等基礎功能都須要依賴這個計數器來完成。

因爲Java虛擬機的多線程是經過線程輪流切換並分配處理器執行時間的方式來實現的,在任何一個肯定的時刻,一個處理器都會執行一條線程中的指令。所以,爲了線程切換後能恢復到正確的執行位置,每條線程都須要有一個獨立的程序計數器,各條線程之間互不影響,獨立存儲,咱們稱之爲線程私有的內存。此內存區域是Java虛擬機規範中惟一一個沒有規定任何outOfMemoryError狀況的區域。

二、Java虛擬機棧

Java虛擬機棧是線程私有的,它的聲明週期與線程相同。

虛擬機棧描述的是Java方法執行的內存模型:每一個方法在執行的同時都會建立一個棧幀用於存儲局部變量表、操做數棧、動態連接、方法出口等信息。

每一個方法從調用到執行的過程就是一個棧幀在虛擬機棧中入棧到出棧的過程。

局部變量存放着編譯器可知的各類基本數據類型、對象引用類型。

三、本地方法棧與Java虛擬機棧相似

四、Java堆

此內存區域的惟一目的是存放對象實例。

Java堆是垃圾收集器管理的主要區域。

五、方法區

方法區與Java堆同樣,是各個線程共享的內存區域,它用於存儲已被虛擬機加載的信息、常量、靜態變量、即時編譯器編譯後的代碼等數據。方法區也能夠看做是Java堆的一部分。

這部分區域能夠不選擇垃圾回收,這區域的內存回收主要針對常量池的回收和對類型的卸載。

這部分可能會致使未徹底回收而致使內存泄漏。

六、運行時常量池

未完待續...

 

鳴謝:特別感謝做者周志明提供的技術支持!

相關文章
相關標籤/搜索