2020-01-09

jvm簡介?

內(nèi)存劃分

java虛擬機(jī)按照運(yùn)行時內(nèi)存使用區(qū)域劃分如圖:



Paste_Image.png

一姨谷、程序計數(shù)器(Program Counter Register)

程序計數(shù)器就是記錄當(dāng)前線程執(zhí)行程序的位置泊柬,改變計數(shù)器的值來確定執(zhí)行的下一條指令,比如循環(huán)讳侨、分支、方法跳轉(zhuǎn)、異常處理,線程恢復(fù)都是依賴程序計數(shù)器來完成妓美。

Java虛擬機(jī)多線程是通過線程輪流切換并分配處理器執(zhí)行時間的方式實現(xiàn)的僵腺。為了線程切換能恢復(fù)到正確的位置鲤孵,每條線程都需要一個獨立的程序計數(shù)器,所以它是線程私有的辰如。

如果線程正在執(zhí)行的是一個Java方法普监,這個計數(shù)器記錄的是正在執(zhí)行的虛擬機(jī)字節(jié)碼指令的地址;如果正在執(zhí)行的是Native方法,這個計數(shù)器值則為空(Undefined)凯正。此內(nèi)存區(qū)域是唯一一個在Java虛擬機(jī)規(guī)范中沒有規(guī)定任何OutOfMemoryError情況的區(qū)域毙玻。

二、java虛擬機(jī)棧(VM Stack)

java虛擬機(jī)棧是線程私有廊散,生命周期與線程相同桑滩。創(chuàng)建線程的時候就會創(chuàng)建一個java虛擬機(jī)棧。

虛擬機(jī)執(zhí)行java程序的時候允睹,每個方法都會創(chuàng)建一個棧幀运准,棧幀存放在java虛擬機(jī)棧中,通過壓棧出棧的方式進(jìn)行方法調(diào)用缭受。

棧幀又分為一下幾個區(qū)域:局部變量表胁澳、操作數(shù)棧、動態(tài)連接米者、方法出口等韭畸。

平時我們所說的變量存在棧中,這句話說的不太嚴(yán)謹(jǐn)蔓搞,應(yīng)該說局部變量存放在java虛擬機(jī)棧的局部變量表中胰丁。

java的8中基本類型的局部變量的值存放在虛擬機(jī)棧的局部變量表中,如果是引用型的變量喂分,則只存儲對象的引用地址隘马。

注意:

[if !supportLists]?[endif]當(dāng)用戶請求web服務(wù)器,每個請求開啟一個線程負(fù)責(zé)用戶的響應(yīng)計算(每個線程分配一個虛擬機(jī)椘薅ィ空間)酸员,如果并發(fā)量大時,可能會導(dǎo)致內(nèi)存溢出(OutOfMemoneyError)讳嘱,可以適當(dāng)?shù)陌衙總€虛擬機(jī)棧的大小適當(dāng)調(diào)小一點幔嗦,減少內(nèi)存的使用量來提高系統(tǒng)的并發(fā)量。

[if !supportLists]?[endif]當(dāng)椓ぬ叮空間調(diào)小以后邀泉,又會引發(fā)方法調(diào)用深度的的問題。因為钝鸽,每個方法都會生成一個棧幀汇恤,如果方法調(diào)用深度很深就意味著,棧里面存放大量的棧幀拔恰,可能導(dǎo)致棧內(nèi)存溢出(StackOverFlowError)因谎。

三、本地方法棧(Native Method Stack)

本地方法棧為虛擬機(jī)使用到本地方法服務(wù)(native)颜懊。本地方法棧為線程私有财岔,功能和虛擬機(jī)棧非常類似风皿。線程在調(diào)用本地方法時,來存儲本地方法的局部變量表匠璧,本地方法的操作數(shù)棧等等信息桐款。

本地方法:是非java語言實現(xiàn)的方法,例如夷恍,java調(diào)用C語言魔眨,來操作某些硬件信息。

四酿雪、堆(Heap):

堆是被所有線程共享的區(qū)域冰沙,實在虛擬機(jī)啟動時創(chuàng)建的。堆里面存放的都是對象的實例(new出來的對象都存在堆中)执虹。

我們平常所說的垃圾回收拓挥,主要回收的就是堆區(qū)。為了提升垃圾回收的性能袋励,又把堆分成兩塊區(qū)新生代(young)和年老代(old)侥啤,更細(xì)一點劃分新生代又可劃分為Eden區(qū)和2個Survivor區(qū)(From Survivor和To Survivor)。

如下圖結(jié)構(gòu):


Paste_Image.png

[if !supportLists]?[endif]Eden:新創(chuàng)建的對象存放在Eden區(qū)

[if !supportLists]?[endif]From Survivor和To Survivor:保存新生代gc后還存活的對象茬故。(使用復(fù)制算法盖灸,導(dǎo)致有一個Survivor空間浪費)Hotspot虛擬機(jī)新生代Eden和Survivor的大小比值為4:1,因為有兩個Survivor磺芭,所以Eden:From Survivor:To Survivor比值為8:1:1赁炎。

[if !supportLists]?[endif]老年代:對象存活時間比較長(經(jīng)過多次新生代的垃圾收集,默認(rèn)是15次)的對象則進(jìn)入老年的钾腺。

當(dāng)堆中分配的對象實例過多徙垫,且大部分對象都在使用,就會報內(nèi)存溢出異常(OutOfMemoneyError)放棒。

五姻报、方法區(qū)

方法區(qū)是被所有線程共享區(qū)域,用于存放已被虛擬機(jī)加載的類信息间螟,常量吴旋,靜態(tài)變量等數(shù)據(jù)。被Java虛擬機(jī)描述為堆的一個邏輯部分厢破。習(xí)慣是也叫它永久代(permanment generation)

永久代也會垃圾回收荣瑟,主要針對常量池回收,類型卸載(比如反射生成大量的臨時使用的Class等信息)摩泪。

常量池用于存放編譯期生成的各種字節(jié)碼和符號引用笆焰,常量池具有一定的動態(tài)性,里面可以存放編譯期生成的常量加勤;運(yùn)行期間的常量也可以添加進(jìn)入常量池中仙辟,比如string的intern()方法。

當(dāng)方法區(qū)滿時鳄梅,無法在分配空間叠国,就會拋出內(nèi)存溢出的異常(OutOfMemoneyError)。

java8中已經(jīng)沒有方法區(qū)了戴尸,取而代之的是元空間(Metaspace)粟焊。

六:直接內(nèi)存

直接內(nèi)存(Direct Memory)并不是虛擬機(jī)運(yùn)行時數(shù)據(jù)區(qū)的一部分,也不是Java虛擬機(jī)規(guī)范中定義的內(nèi)存區(qū)域孙蒙,但是這部分內(nèi)存也被頻繁地使用项棠,而且也可能導(dǎo)致OutOfMemoryError異常出現(xiàn)。

JDK1.4加的NIO中挎峦,ByteBuffer有個方法是allocateDirect(int capacity) 香追,這是一種基于通道(Channel)與緩沖區(qū)(Buffer)的I/O方式,它可以使用Native函數(shù)庫直接分配堆外內(nèi)存坦胶,然后通過一個存儲在Java堆里面的DirectByteBuffer對象作為這塊內(nèi)存的引用進(jìn)行操作透典。這樣能在一些場景中顯著提高性能,因為避免了在Java堆和Native堆中來回復(fù)制數(shù)據(jù)顿苇。

jvm內(nèi)存模型 就是這么簡單峭咒,如果看完還不太理解的,就多看幾遍纪岁,把 jvm 內(nèi)存模型背下來凑队,記到腦子里。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末幔翰,一起剝皮案震驚了整個濱河市漩氨,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌遗增,老刑警劉巖才菠,帶你破解...
    沈念sama閱讀 218,858評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異贡定,居然都是意外死亡赋访,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評論 3 395
  • 文/潘曉璐 我一進(jìn)店門缓待,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蚓耽,“玉大人,你說我怎么就攤上這事旋炒〔接疲” “怎么了?”我有些...
    開封第一講書人閱讀 165,282評論 0 356
  • 文/不壞的土叔 我叫張陵瘫镇,是天一觀的道長鼎兽。 經(jīng)常有香客問我答姥,道長,這世上最難降的妖魔是什么谚咬? 我笑而不...
    開封第一講書人閱讀 58,842評論 1 295
  • 正文 為了忘掉前任鹦付,我火速辦了婚禮,結(jié)果婚禮上择卦,老公的妹妹穿的比我還像新娘敲长。我一直安慰自己,他們只是感情好秉继,可當(dāng)我...
    茶點故事閱讀 67,857評論 6 392
  • 文/花漫 我一把揭開白布祈噪。 她就那樣靜靜地躺著,像睡著了一般尚辑。 火紅的嫁衣襯著肌膚如雪辑鲤。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,679評論 1 305
  • 那天杠茬,我揣著相機(jī)與錄音遂填,去河邊找鬼。 笑死澈蝙,一個胖子當(dāng)著我的面吹牛吓坚,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播灯荧,決...
    沈念sama閱讀 40,406評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼礁击,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了逗载?” 一聲冷哼從身側(cè)響起哆窿,我...
    開封第一講書人閱讀 39,311評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎厉斟,沒想到半個月后挚躯,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,767評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡擦秽,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年码荔,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片感挥。...
    茶點故事閱讀 40,090評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡缩搅,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出触幼,到底是詐尸還是另有隱情硼瓣,我是刑警寧澤,帶...
    沈念sama閱讀 35,785評論 5 346
  • 正文 年R本政府宣布置谦,位于F島的核電站堂鲤,受9級特大地震影響亿傅,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜瘟栖,卻給世界環(huán)境...
    茶點故事閱讀 41,420評論 3 331
  • 文/蒙蒙 一葵擎、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧慢宗,春花似錦坪蚁、人聲如沸奔穿。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽贱田。三九已至缅茉,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間男摧,已是汗流浹背蔬墩。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留耗拓,地道東北人拇颅。 一個月前我還...
    沈念sama閱讀 48,298評論 3 372
  • 正文 我出身青樓,卻偏偏與公主長得像乔询,于是被迫代替她去往敵國和親樟插。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,033評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 內(nèi)存溢出和內(nèi)存泄漏的區(qū)別 內(nèi)存溢出:out of memory竿刁,是指程序在申請內(nèi)存時黄锤,沒有足夠的內(nèi)存空間供其使用,...
    Aimerwhy閱讀 743評論 0 1
  • 第二部分 自動內(nèi)存管理機(jī)制 第二章 java內(nèi)存異常與內(nèi)存溢出異常 運(yùn)行數(shù)據(jù)區(qū)域 程序計數(shù)器:當(dāng)前線程所執(zhí)行的字節(jié)...
    小明oh閱讀 1,172評論 0 2
  • 《深入理解Java虛擬機(jī)》筆記_第一遍 先取看完這本書(JVM)后必須掌握的部分食拜。 第一部分 走近 Java 從傳...
    xiaogmail閱讀 5,097評論 1 34
  • 一鸵熟、運(yùn)行時數(shù)據(jù)區(qū)域 Java虛擬機(jī)管理的內(nèi)存包括幾個運(yùn)行時數(shù)據(jù)內(nèi)存:方法區(qū)、虛擬機(jī)棧负甸、本地方法棧流强、堆、程序計數(shù)器呻待,...
    加油小杜閱讀 1,519評論 1 15
  • 1.1 概述 Java優(yōu)點: 1煮盼、結(jié)構(gòu)嚴(yán)謹(jǐn),面向?qū)ο?2带污、擺脫硬件平臺束縛僵控,實現(xiàn)了“一次編寫,到處運(yùn)行”的理想; ...
    viciyforever閱讀 1,172評論 1 9