1. 程式人生 > >深入理解 Java 虛擬機之學習筆記(1)

深入理解 Java 虛擬機之學習筆記(1)

over 信息 hotspot 體系 ima 模塊化 介紹 style 創建

本書結構:
  • 從宏觀的角度介紹了整個Java技術體系、Java和JVM的發展歷程、模塊化,以及JDK的編譯
  • 講解了JVM的自動內存管理,包括虛擬機內存區域的劃分原理以及各種內存溢出異常產生的原因
  • 分析了虛擬機的執行子系統,包括類文件結構、虛擬機類加載機制、虛擬機字節碼執行引擎
  • 講解了程序的編譯與代碼的優化,闡述了泛型、自動裝箱拆箱、條件編譯等語法糖的原理
  • 講解了虛擬機的熱點探測方法、HotSpot的即時編譯器、編譯觸發條件,以及如何從虛擬機外部觀察和分析JIT編譯的數據和結果
  • 探討了Java實現高效並發的原理,包括JVM內存模型的結構和操作,原子性、可見性和有序性在Java內存模型中的體現,先行發生原則的規則和使用,線程在Java語言中的實現原理,虛擬機實現高效並發所做的一些列鎖優化措施。

Java虛擬機運行時數據區如下圖所示:

技術分享

第一個是程序計數器:標識機器碼行號,進行跳轉等操作,只需要修改程序計數器就可以實現。 第二個是虛擬機棧:保存局部變量表,如果訪問超過棧的深度,並且不支持動態擴展,因此報出StackOverFlowError,當前大多數虛擬機均支持虛擬機棧動態擴展,如果沒有足夠空間保存局部變量表則報出OutOfMemoryError. 第三個是本地方法棧:本地方法棧未規定語言、使用方式、數據結構,因此具體的虛擬機可以自由實現它。同樣和虛擬機棧一樣拋出StackOverFlowError和OutOfMemoryError 第四個是Java 堆:
虛擬機啟動時創建,唯一目的是存放對象實例。幾乎所有的對象實例都在這裏分配內存。Java堆是垃圾回收管理的主要區域。因此Java堆也稱為“GC”堆(垃圾堆)。Java堆的細化,新生代和老年代。都是為了更好的回收內存,更快地分配內存。 第五個為方法區:存儲已被虛擬機加載的類信息、常量、靜態變量、即時編譯器編譯後的代碼等數據。別名 Non-Heap(非堆)

六個為運行時常量池:

技術分享

技術分享

第七個是直接內存

技術分享

下一節為演示不同數據區域的OutOfMemoryError以及StackOverflowError異常調試程序。

深入理解 Java 虛擬機之學習筆記(1)