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