JVM內(nèi)存模型-備忘錄

??生命不息膨桥,學(xué)習(xí)不止!
??JVM內(nèi)存模型由:堆某残、棧国撵、方法區(qū)、本地方法棧玻墅、程序計數(shù)器構(gòu)成了JVM運行時數(shù)據(jù)區(qū)介牙。

JVM內(nèi)存模型,如下圖:


JVM內(nèi)存模型
Java堆內(nèi)存(Heap)

??Java堆內(nèi)存是JVM啟動時創(chuàng)建的一塊重要的內(nèi)存區(qū)澳厢,該區(qū)域是所有線程共享的區(qū)域环础。Java堆內(nèi)存主要的作用就是為所有的對象實例數(shù)組分配內(nèi)存空間囚似,創(chuàng)建的對象實例和數(shù)組都被存在Java堆內(nèi)存中。
??Java堆內(nèi)存也是JVM GC收集器管理內(nèi)存區(qū)域线得,在Hotspot虛擬機中堆內(nèi)存分為兩部分新生代老年代饶唤,而新生代可劃分為eden區(qū)survivor區(qū),其中Survivor區(qū)又可分為:FromTo兩個區(qū)域贯钩,Java堆內(nèi)存之所以會這么劃分募狂,主要是方便堆對內(nèi)存的管理。
??Java 堆內(nèi)存大小可以通過:``-Xms和-Xmx來分配java堆內(nèi)存的最小和最大內(nèi)存角雷,可以使用-Xmn來調(diào)整年輕代的內(nèi)存大小祸穷。
堆內(nèi)存結(jié)構(gòu),如下圖:

Java堆內(nèi)存結(jié)構(gòu)

方法區(qū)(Method Area)

??Java方法區(qū)是JVM線程共享的一個內(nèi)存區(qū)域勺三,Java方法區(qū)主要適用于存放雷滚,被JVM加載的類型信息、常量吗坚、靜態(tài)變量祈远、即時編譯器編譯后的代碼緩存等信息。
??在JDK8以前方法區(qū)的數(shù)據(jù)都存儲在"永久代"中商源,可以通過-XX:PermSize-XX:MaxPermSize指定JVM中的永久代(方法區(qū))的大小车份,永久代是在JVM中實現(xiàn)的,并且永久代被占用的內(nèi)存只有在FullGC的時候有可能被回收牡彻,而且回收的表現(xiàn)也一般躬充。正因為這樣方法區(qū)的內(nèi)存沒有得到很好的管理,在使用的時候讨便,對方法區(qū)內(nèi)存控制不當(dāng)會出現(xiàn)java.lang.OutOfMemoryError: PermGen space,字符串量池過大以政、靜態(tài)變量過多都會導(dǎo)致方法區(qū)內(nèi)存空間不足霸褒。例如:我們的業(yè)務(wù)需要動態(tài)通過網(wǎng)絡(luò)加載類信息,隨著時間的延長加載類的信息逐漸變多盈蛮,方法區(qū)內(nèi)存得不到回收废菱,也會出現(xiàn)OOM。
??到了JDK8抖誉,方法區(qū)的內(nèi)存通過元空間替換掉永久代殊轴,元空間和永久代沒有太多的區(qū)別,他們的作用都是方法區(qū)的實現(xiàn)袒炉。元空間永久代的最大區(qū)別就是旁理,元空間不在虛擬機內(nèi)存中,而是直接使用本地內(nèi)存來存儲方法區(qū)數(shù)據(jù)我磁。
??在默認(rèn)情況下孽文,元空間的大小僅受本地內(nèi)存限制驻襟,但可以通過:-XX:MetaspaceSize(初始空間大小)和-XX:MaxMetaspaceSize(最大空間)參數(shù)來指定元空間的大小,默認(rèn)是不限制元空間的大小的芋哭。元空間還有兩個與 GC 相關(guān)的參數(shù):

  • -XX:MinMetaspaceFreeRatio:在GC之后沉衣,最小的元空間剩余空間容量的百分比
  • -XX:MaxMetaspaceFreeRatio:在GC之后,最大的元空間剩余空間容量的百分比
JVM棧(Java Virtual Machine Stacks)

?? JVM棧是JVM線程私有的內(nèi)存區(qū)域减牺,棧的生命會周期和Java線程一樣豌习。JVM棧描述的是Java方法執(zhí)行的線程模型。每一個java方法被執(zhí)行的時候拔疚,JVM都會同步創(chuàng)建一個棧幀用于存儲局部變量表肥隆、操作數(shù)棧、動態(tài)鏈接草雕、方法出口等巷屿。
?? 每一個Java方法在被調(diào)用一直到執(zhí)行結(jié)束的過程,都會對應(yīng)著一個棧幀在JVM棧中的入棧出棧的過程墩虹。
??局部變量表存放了編譯時期可知的JVM基本數(shù)據(jù)類型(boolean嘱巾、byte、char诫钓、short旬昭、int、 float菌湃、long袋哼、double)、對象引用 和 returnAddress 類型宦赠。
??這些數(shù)據(jù)類型在局部變量表中的存儲空間以局部變量槽(Slot)來表示锻拘,其中64位長度的longdouble類型的數(shù)據(jù)會占用兩個變量槽,其余的數(shù)據(jù)類型只占用一個下愈。
??局部變量表所需的內(nèi)存空間在編譯期間完成分配纽绍,當(dāng)進入一個方法時,這個方法需要在棧幀中分配多大的局部變量空間是完全確定的势似,方法運行期間不會改變局部變量表的大小
java虛擬機棧結(jié)構(gòu):

java虛擬機棧

程序計數(shù)器(Program Counter Register)

??程序計數(shù)器是JVM線程私有的拌夏,是一塊內(nèi)存較小的空間÷囊颍可以把程序計數(shù)器看作是當(dāng)前線程執(zhí)行字節(jié)碼行號的指示器障簿。
??字節(jié)碼解釋器在工作的時候就是通過改變程序計數(shù)器的值來選取下一條要執(zhí)行的字節(jié)碼指令。
??Java虛擬機的多線程是通過線程輪流切換栅迄、分配處理器執(zhí)行時間的方式來實現(xiàn)的站故,在任何一 個確定的時刻,一個處理器都只會執(zhí)行一條線程中的指令霞篡。因此世蔗,為了線程切換后能恢復(fù)到正確的執(zhí)行位置端逼,每條線程都需要有一個獨立的程序計數(shù)器,各條線程之間計數(shù)器互不影響污淋,獨立存儲顶滩。

本地方法棧(Native M ethod Stacks)

??本地方法棧JVM棧非常相似,其區(qū)別是JVM棧為虛擬機執(zhí)行Java方法服務(wù)寸爆,而本地方法棧則是為虛擬機使用到的本地方法服務(wù).

運行時常量池(Runtime Constant Pool)

??運行時常量池是方法區(qū)的一部分礁鲁。Class文件中除了有類的版本、字 段赁豆、方法仅醇、接口等描述信息外,還有一項信息是常量池表(Constant Pool Table)魔种,用于存放編譯期生成的各種字面量與符號引用析二,這部分內(nèi)容將在類加載后存放到方法區(qū)的運行時常量池中。

??致此节预,JVM內(nèi)存結(jié)構(gòu)介紹結(jié)束叶摄!
??生命不息,學(xué)習(xí)不止安拟!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蛤吓,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子糠赦,更是在濱河造成了極大的恐慌会傲,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,402評論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件拙泽,死亡現(xiàn)場離奇詭異淌山,居然都是意外死亡,警方通過查閱死者的電腦和手機顾瞻,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評論 3 392
  • 文/潘曉璐 我一進店門艾岂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人朋其,你說我怎么就攤上這事〈嘌祝” “怎么了梅猿?”我有些...
    開封第一講書人閱讀 162,483評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長秒裕。 經(jīng)常有香客問我袱蚓,道長,這世上最難降的妖魔是什么几蜻? 我笑而不...
    開封第一講書人閱讀 58,165評論 1 292
  • 正文 為了忘掉前任喇潘,我火速辦了婚禮体斩,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘颖低。我一直安慰自己絮吵,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,176評論 6 388
  • 文/花漫 我一把揭開白布忱屑。 她就那樣靜靜地躺著蹬敲,像睡著了一般。 火紅的嫁衣襯著肌膚如雪莺戒。 梳的紋絲不亂的頭發(fā)上伴嗡,一...
    開封第一講書人閱讀 51,146評論 1 297
  • 那天,我揣著相機與錄音从铲,去河邊找鬼瘪校。 笑死,一個胖子當(dāng)著我的面吹牛名段,可吹牛的內(nèi)容都是我干的阱扬。 我是一名探鬼主播,決...
    沈念sama閱讀 40,032評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼吉嫩,長吁一口氣:“原來是場噩夢啊……” “哼价认!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起自娩,我...
    開封第一講書人閱讀 38,896評論 0 274
  • 序言:老撾萬榮一對情侶失蹤用踩,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后忙迁,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體脐彩,經(jīng)...
    沈念sama閱讀 45,311評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,536評論 2 332
  • 正文 我和宋清朗相戀三年姊扔,在試婚紗的時候發(fā)現(xiàn)自己被綠了惠奸。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,696評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡恰梢,死狀恐怖佛南,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情嵌言,我是刑警寧澤嗅回,帶...
    沈念sama閱讀 35,413評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站摧茴,受9級特大地震影響绵载,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,008評論 3 325
  • 文/蒙蒙 一娃豹、第九天 我趴在偏房一處隱蔽的房頂上張望焚虱。 院中可真熱鬧,春花似錦懂版、人聲如沸鹃栽。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽谍咆。三九已至,卻和暖如春私股,著一層夾襖步出監(jiān)牢的瞬間摹察,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評論 1 269
  • 我被黑心中介騙來泰國打工倡鲸, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留供嚎,地道東北人。 一個月前我還...
    沈念sama閱讀 47,698評論 2 368
  • 正文 我出身青樓峭状,卻偏偏與公主長得像克滴,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子优床,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,592評論 2 353