java中jdk、jre、jvm之間的關(guān)系可以用一個(gè)圖來(lái)表示
本次主要記錄一下jvm的內(nèi)存區(qū)域
1. 程序計(jì)數(shù)器
- 程序計(jì)數(shù)器是一塊較小的內(nèi)存空間杠愧,它可以看作是當(dāng)前線程所執(zhí)行的字節(jié)碼的行號(hào)指示器句伶。在Java虛擬機(jī)的概念模型里,字節(jié)碼解釋器工作時(shí)就是通過(guò)改變這個(gè)計(jì)數(shù)器的值來(lái)選取下一條需要執(zhí)行的字節(jié)碼指令配猫,它是程序控制流的指示器,分支杏死、循環(huán)泵肄、跳轉(zhuǎn)、異常處理淑翼、線程恢復(fù)等基礎(chǔ)功能都需要依賴這個(gè)計(jì)數(shù)器來(lái)完成腐巢。
- java的線程是通過(guò)輪流切換分配處理器實(shí)現(xiàn)的,每個(gè)線程都有一個(gè)獨(dú)立的程序計(jì)數(shù)器
- 如果java正在執(zhí)行Native(本地方法)玄括,程序計(jì)數(shù)器為undefined
2.java虛擬機(jī)棧
- 棧楨:虛擬機(jī)棧描述的是Java方法執(zhí)行的線程內(nèi)存模型:每個(gè)方法被執(zhí)行的時(shí)候冯丙,Java虛擬機(jī)都會(huì)同步創(chuàng)建一個(gè)棧幀
- 局部變量表:存放了編譯期可知的各種Java虛擬機(jī)基本數(shù)據(jù)類型(boolean、byte遭京、char胃惜、short、int哪雕、float船殉、long、double)斯嚎、對(duì)象引用(reference類型利虫,它并不等同于對(duì)象本身,可能是一個(gè)指向?qū)ο笃鹗嫉刂返囊弥羔樞⒖福部赡苁侵赶蛞粋€(gè)代表對(duì)象的句柄或者其他與此對(duì)象相關(guān)的位置)和returnAddress類型(指向了一條字節(jié)碼指令的地址)
- java中如果線程請(qǐng)求棧的深度大于虛擬機(jī)的所允許時(shí)列吼,拋出StackOverFlowError,寫遞歸時(shí)經(jīng)常見(jiàn)到苦始,如果虛擬機(jī)可以自動(dòng)擴(kuò)展寞钥,但無(wú)法申請(qǐng)到足夠的內(nèi)存空間時(shí),會(huì)出現(xiàn)OutOfMemoryError
3.本地方法棧
- 與虛擬機(jī)棧所發(fā)揮的作用是非常相似的陌选,其區(qū)別只是虛擬機(jī)
棧為虛擬機(jī)執(zhí)行Java方法(也就是字節(jié)碼)服務(wù)理郑,而本地方法棧則是為虛擬機(jī)使用到的本地(Native)方法服務(wù)蹄溉。
4.java堆
- 堆是虛擬機(jī)管理的最大的一塊
- 堆是被所有線程共享的,java中幾乎所有的對(duì)象都是在這分配內(nèi)存的(隨著技術(shù)發(fā)展您炉,Java對(duì)象實(shí)例都分配在堆上也漸漸變得不是那么絕對(duì)了)
- 堆是垃圾回收器(gc)所有管理的內(nèi)存區(qū)
- 如果在Java堆中沒(méi)有內(nèi)存完成實(shí)例分配柒爵,并且堆也無(wú)法再
擴(kuò)展時(shí),Java虛擬機(jī)將會(huì)拋出OutOfMemoryError異常
5.方法區(qū)
- 各線程共享
- 存放虛擬機(jī)加載的類信息{
- 類的版本
- 字段
- 方法
- 接口
- }赚爵,常量棉胀,靜態(tài)變量,即時(shí)編譯器編譯后的代碼
6.運(yùn)行時(shí)常量池
- 運(yùn)行時(shí)常量池(Runtime Constant Pool)是方法區(qū)的一部分冀膝。Class文件中除了有類的版本唁奢、字段、方法窝剖、接口等描述信息外麻掸,還有一項(xiàng)信息是常量池表(Constant Pool Table),用于存放編譯期生成的各種字面量與符號(hào)引用赐纱,這部分內(nèi)容將在類加載后存放到方法區(qū)的運(yùn)行時(shí)常量池中脊奋。