java-初识JVM的内存分配(5个区域)概念--系列(一)
JVM基本概念:
JVM 是可運(yùn)行 Java 代碼的假想計(jì)算機(jī) ,包括一套字節(jié)碼指令集、一組寄存器、一個(gè)棧、一個(gè)垃圾回收,堆 和 一個(gè)存儲(chǔ)方法域。JVM 是運(yùn)行在操作系統(tǒng)之上的,它與硬件沒(méi)有直接的交互。
JVM內(nèi)存劃分:
擁有五類(lèi)(直接內(nèi)存除外):
本地方法棧,方法區(qū),程序計(jì)數(shù)器,堆Heap,虛擬機(jī)棧。
1.程序計(jì)數(shù)器
是每個(gè)線程都擁有的一塊空間,線程私有,存儲(chǔ)當(dāng)前線程執(zhí)行的字節(jié)碼所在的行號(hào)指示器,執(zhí)行方法時(shí),計(jì)數(shù)器存儲(chǔ)執(zhí)行位置(對(duì)應(yīng)字節(jié)碼指令位置),代表了方法的執(zhí)行位置。
2.本地方法棧
是與對(duì)應(yīng)的操作系統(tǒng)OS進(jìn)行操作的方法的集合,是每個(gè)線程都擁有的,為調(diào)用native服務(wù)而存在。
3.方法區(qū)
又稱(chēng)為永久代,是線程共享的,存儲(chǔ)JVM的類(lèi)加載信息(類(lèi)的方法,版本,時(shí)間,方法,接口等),常量,靜態(tài)變量,(非new對(duì)象)編譯器產(chǎn)生的字節(jié)碼文件內(nèi)容。
包含的運(yùn)行時(shí)常量池,是重要組成部分,存儲(chǔ)了在編譯時(shí)產(chǎn)生的各種變量字符引用信息,通常在類(lèi)加載完成后,進(jìn)行存儲(chǔ),是JVM認(rèn)可類(lèi)的主要信息標(biāo)準(zhǔn)。
4.堆
Heap屬于運(yùn)行時(shí)內(nèi)存,被線程共享,存放被java程序通過(guò)new關(guān)鍵字得到的對(duì)象,如數(shù)組,哈希表,自定義類(lèi),等,是GC的重要區(qū)域。
在java的GC中,將此區(qū)域按代劃分,
可分為新生代(存放新new對(duì)象,過(guò)大對(duì)象除外),老年代(存放已被創(chuàng)建一段時(shí)間的new對(duì)象),新生代占1/3區(qū)域,老年代占2/3區(qū)域,
新生代又可細(xì)化分為
Ende,From survivor,to survivor
三個(gè)類(lèi)別。
Ende:當(dāng)此區(qū)域不足時(shí),新生代自動(dòng)開(kāi)啟一次GC,當(dāng)被創(chuàng)建對(duì)象過(guò)大的時(shí)候,直接放入Old區(qū)。
From survivor:上次回收時(shí)的幸存對(duì)象。
To survivor:是上次復(fù)制的幸存對(duì)象,年齡足夠就會(huì)被存入老年代。
5.虛擬機(jī)棧
是線程私有的,用于描述方法執(zhí)行的內(nèi)存模型。
在線程執(zhí)行方法時(shí),會(huì)創(chuàng)建一個(gè)棧幀,入棧,在方法執(zhí)行完后,將對(duì)應(yīng)棧幀出棧。
棧幀包含了:方法局部變量表,操作數(shù)棧,動(dòng)態(tài)鏈接,方法出口(返回地址)。
方法局部變量表:方法內(nèi)變量,執(zhí)行結(jié)束后就銷(xiāo)毀。
操作數(shù)棧:計(jì)算方法執(zhí)行過(guò)程產(chǎn)生的結(jié)果。
動(dòng)態(tài)鏈接:存儲(chǔ)常量池的指針,方便方法動(dòng)態(tài)訪問(wèn)常量池。
方法出口:當(dāng)方法正常結(jié)束,異常結(jié)束,都需要依靠此信息返回對(duì)應(yīng)信息,以便程序能繼續(xù)執(zhí)行。
棧幀示意圖:
java內(nèi)存對(duì)應(yīng)示意圖:
今天開(kāi)始正式了解JVM!
與50位技術(shù)專(zhuān)家面對(duì)面20年技術(shù)見(jiàn)證,附贈(zèng)技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的java-初识JVM的内存分配(5个区域)概念--系列(一)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: matlab-Grefenstette的
- 下一篇: java--JVM--栈帧--JVM及其