《深入理解JVM虚拟机》读书笔记(一)
此書一共分為5個部分:
這里,我直接跳過第一部分的內容,開始第二部分的內容。此部分包括:
- Java內存區域與內存溢出異常
- 垃圾收集器與內存分配策略
- 虛擬機性能監控與故障處理工具
- 調優案例分析與實戰
開記!!!
首先引用原書中的一句話,“Java與C++之間有一堵由內存動態分配和垃圾收集技術所圍成的“高墻”, 墻外面的人想進去, 墻里面的人卻想出來。”
一. 運行時數據區域
Java虛擬機在執行Java程序的過程中會把它所管理的內存劃分為若干個不同的數據區域。
程序計數器:一塊很小的內存區域,用來記錄程序下一條字節碼指令的地址,如果線程正在執行的是一個Java方法,這個程序計數器記錄的是正在執行的虛擬機字節碼指令地址;如果正在執行的是一個Native方法,這個計數器的值則為空。
此區域是Java虛擬機規范中沒有規定任何OutofMemoryError情況的區域。
虛擬機棧:線程私有,生命周期與線程相同,這個區域描述的是Java方法執行的內存模型:每個方法在執行的時候都會創建一個棧幀(Stack Frame)用于存儲局部變量表,操作數棧,動態鏈接,方法出口等信息。
在虛擬機規范中,這個區域規定了2種異常:一是線程請求的棧深度大于虛擬機所允許的深度將拋出StackOverflowError異常;如果虛擬機棧可以動態擴展,如果申請到足夠的內存,就會拋出OutOfMemoryError異常。
本地方法棧:與虛擬機棧類型,只不過本地方法棧是調用本地的Native方法,與虛擬機棧一樣會拋出StackOverflowError及OutOfMemoryError異常。
Java堆:所有對象實例及數組都要在堆上分配(Java虛擬機規范描述),但是隨著JIT編譯器的發展與逃逸分析技術逐漸成熟,棧上分配,標量替換優化技術將會導致一些微妙的變化。
Java堆可以分為新生代和老年代;再細致一點新生代分為Eden空間,From Survivors空間,To Survivors空間。進一步劃分是為了更好的回收內存,跟回收算法有關系。
虛擬機規范中規定,Java堆可以處于物理上不連續的內存空間中,只要邏輯上是連續的即可。會發生OutOfMemoryError異常。
方法區:跟Java堆一樣是線程共享的內存區域,它用于存儲已被虛擬機加載的類信息,常量,靜態變量,即時編譯器編譯后的代碼等數據。虛擬機規范把這個區域描述為堆的一個邏輯部分,但它有一個別名叫非堆(Non-Heap),會發生OutOfMemoryError異常。
運行時常量池:是方法區的一部分,用來存儲各種字面量及符號引用,這部分內容將在類加載后進入方法區的運行時常量池中存放。
常量池具有動態性,運行期間也可能將新的常量放入池中,這種特性用的比較多的是String的intern()方法。會發生OutOfMemoryError異常。
直接內存:并不是虛擬機運行時數據區的一部分,也不是Java虛擬機規范中定義的內存區域,但這部分也被頻繁的使用,最典型的應用便是JDK1.4新增的NIO通過DirectByteBuffer對象來操作這部分內存,這樣避免了Java堆跟Native堆中數據來回復制數據的開銷。
二. HotSpot虛擬機對象探秘
Java對象的創建過程:只提供一個圖,細節太多。
Java對象的內存分布:
三個區域--對象頭Header,實例數據Instance Data,對齊數據Padding
其中對象頭分為2個部分,分別是Mark word與類型指針(指向它的類元數據)
總結
以上是生活随笔為你收集整理的《深入理解JVM虚拟机》读书笔记(一)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: decimal.JS 快速入门
- 下一篇: 机械--NX2007(UG)有限元分析教