Java 虛擬機內(nèi)存區(qū)域的劃分

1. Java程序的執(zhí)行過程

jvm.png

Java源文件(.java) 首先要經(jīng)過 Java編譯器 編譯生成 Java字節(jié)碼文件(.class) 才能被Java虛擬機(JVM)使用

2. 運行時數(shù)據(jù)區(qū)

運行時數(shù)據(jù)區(qū)就是JVM的內(nèi)存區(qū)域. 通常包括這幾個部分:程序計數(shù)器(Program Counter Register)裆站、Java棧(VM Stack)咧织、本地方法棧(Native Method Stack)、方法區(qū)(Method Area)熟空、堆(Heap)谦秧。

runtime_data_area.png

我們常說的內(nèi)存泄漏與內(nèi)存溢出就是發(fā)生在 , 因此我們的內(nèi)存優(yōu)化也是針對堆內(nèi)存進行的.

3. 運行時數(shù)據(jù)區(qū)的每個部分的作用

  • 程序計數(shù)器(Program Counter Register)
    存放要執(zhí)行的指令地址; 線程私有, 為了防止線程切換回來后仍能繼續(xù)上次位置執(zhí)行, 每個線程都需要有自己的程序計數(shù)器.

  • Java棧
    在棧中包括: 局部變量表(Local Variables)竟纳、操作數(shù)棧(Operand Stack)、指向當前方法所屬的類的運行時常量池的引用(Reference to runtime constant pool)(運行時常量池的概念在方法區(qū)部分會談到)疚鲤、方法返回地址(Return Address)和一些額外的附加信息.
    每個線程都會有一個自己的Java棧锥累,互不干擾

Java棧中存放的是一個個的棧幀,每個棧幀對應(yīng)一個被調(diào)用的方法集歇,在棧幀中包括局部變量表(Local Variables)桶略、操作數(shù)棧(Operand Stack)、指向當前方法所屬的類的運行時常量池(運行時常量池的概念在方法區(qū)部分會談到)的引用(Reference to runtime constant pool)诲宇、方法返回地址(Return Address)和一些額外的附加信息际歼。當線程執(zhí)行一個方法時,就會隨之創(chuàng)建一個對應(yīng)的棧幀焕窝,并將建立的棧幀壓棧蹬挺。當方法執(zhí)行完畢之后,便會將棧幀出棧它掂。因此可知巴帮,線程當前執(zhí)行的方法所對應(yīng)的棧幀必定位于Java棧的頂部溯泣。講到這里,大家就應(yīng)該會明白為什么 在 使用 遞歸方法的時候容易導(dǎo)致棧內(nèi)存溢出的現(xiàn)象了以及為什么棧區(qū)的空間不用程序員去管理了(當然在Java中榕茧,程序員基本不用關(guān)系到內(nèi)存分配和釋放的事情垃沦,因為Java有自己的垃圾回收機制),這部分空間的分配和釋放都是由系統(tǒng)自動實施的用押。對于所有的程序設(shè)計語言來說肢簿,棧這部分空間對程序員來說是不透明的。

局部變量表蜻拨,顧名思義池充,想必不用解釋大家應(yīng)該明白它的作用了吧。就是用來存儲方法中的局部變量(包括在方法中聲明的非靜態(tài)變量以及函數(shù)形參)缎讼。對于基本數(shù)據(jù)類型的變量收夸,則直接存儲它的值,對于引用類型的變量血崭,則存的是指向?qū)ο蟮囊梦韵А>植孔兞勘淼拇笮≡诰幾g器就可以確定其大小了,因此在程序執(zhí)行期間局部變量表的大小是不會改變的夹纫。

操作數(shù)棧咽瓷,想必學(xué)過數(shù)據(jù)結(jié)構(gòu)中的棧的朋友想必對表達式求值問題不會陌生,棧最典型的一個應(yīng)用就是用來對表達式求值舰讹。想想一個線程執(zhí)行方法的過程中茅姜,實際上就是不斷執(zhí)行語句的過程,而歸根到底就是進行計算的過程跺涤。因此可以這么說匈睁,程序中的所有計算過程都是在借助于操作數(shù)棧來完成的。

指向運行時常量池的引用桶错,因為在方法執(zhí)行的過程中有可能需要用到類中的常量航唆,所以必須要有一個引用指向運行時常量。

方法返回地址院刁,當一個方法執(zhí)行完畢之后糯钙,要返回之前調(diào)用它的地方,因此在棧幀中必須保存一個方法返回地址退腥。

由于每個線程正在執(zhí)行的方法可能不同任岸,因此每個線程都會有一個自己的Java棧,互不干擾狡刘。

  • 本地方法棧
    本地方法棧與Java棧的作用和原理非常相似享潜。區(qū)別只不過是Java棧是為執(zhí)行Java方法服務(wù)的,而本地方法棧則是為執(zhí)行本地方法(Native Method)服務(wù)的嗅蔬。在JVM規(guī)范中剑按,并沒有對本地方發(fā)展的具體實現(xiàn)方法以及數(shù)據(jù)結(jié)構(gòu)作強制規(guī)定疾就,虛擬機可以自由實現(xiàn)它。在HotSopt虛擬機中直接就把本地方法棧和Java棧合二為一艺蝴。


  • 用來存放對象本身以及數(shù)組(數(shù)組也是對象); 堆是被所有線程共享的猬腰,在JVM中只有一個堆。

  • 方法區(qū)
    在方法區(qū)中猜敢,存儲了每個類的信息(包括類的名稱姑荷、方法信息、字段信息)缩擂、靜態(tài)變量鼠冕、常量以及編譯器編譯后的代碼等; 被所有線程共享的,在JVM中只有一個方法區(qū).

在Class文件中除了類的字段胯盯、方法供鸠、接口等描述信息外,還有一項信息是常量池陨闹,用來存儲編譯期間生成的字面量和符號引用。

在方法區(qū)中有一個非常重要的部分就是運行時常量池薄坏,它是每一個類或接口的常量池的運行時表示形式趋厉,在類和接口被加載到JVM后,對應(yīng)的運行時常量池就被創(chuàng)建出來胶坠。當然并非Class文件常量池中的內(nèi)容才能進入運行時常量池君账,在運行期間也可將新的常量放入運行時常量池中,比如String的intern()方法(如果池中已經(jīng)包含了一個等于該String對象的字符串,則反回該String 對象, 否則將此String對象的字符串添加到常量池中并返回該String對象)沈善。

在JVM規(guī)范中乡数,沒有強制要求方法區(qū)必須實現(xiàn)垃圾回收。很多人習(xí)慣將方法區(qū)稱為“永久代”闻牡,是因為HotSpot虛擬機以永久代來實現(xiàn)方法區(qū)净赴,從而JVM的垃圾收集器可以像管理堆區(qū)一樣管理這部分區(qū)域,從而不需要專門為這部分設(shè)計垃圾回收機制罩润。不過自從JDK7之后玖翅,Hotspot虛擬機便將運行時常量池從永久代移除了。

參考文章

http://www.cnblogs.com/hf-cherish/p/4970267.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末割以,一起剝皮案震驚了整個濱河市金度,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌严沥,老刑警劉巖猜极,帶你破解...
    沈念sama閱讀 216,997評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異消玄,居然都是意外死亡跟伏,警方通過查閱死者的電腦和手機丢胚,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,603評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來酬姆,“玉大人嗜桌,你說我怎么就攤上這事〈巧” “怎么了骨宠?”我有些...
    開封第一講書人閱讀 163,359評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長相满。 經(jīng)常有香客問我层亿,道長,這世上最難降的妖魔是什么立美? 我笑而不...
    開封第一講書人閱讀 58,309評論 1 292
  • 正文 為了忘掉前任匿又,我火速辦了婚禮,結(jié)果婚禮上建蹄,老公的妹妹穿的比我還像新娘碌更。我一直安慰自己,他們只是感情好洞慎,可當我...
    茶點故事閱讀 67,346評論 6 390
  • 文/花漫 我一把揭開白布痛单。 她就那樣靜靜地躺著,像睡著了一般劲腿。 火紅的嫁衣襯著肌膚如雪旭绒。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,258評論 1 300
  • 那天焦人,我揣著相機與錄音挥吵,去河邊找鬼。 笑死花椭,一個胖子當著我的面吹牛忽匈,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播矿辽,決...
    沈念sama閱讀 40,122評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼脉幢,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了嗦锐?” 一聲冷哼從身側(cè)響起嫌松,我...
    開封第一講書人閱讀 38,970評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎奕污,沒想到半個月后萎羔,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,403評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡碳默,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,596評論 3 334
  • 正文 我和宋清朗相戀三年贾陷,在試婚紗的時候發(fā)現(xiàn)自己被綠了缘眶。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,769評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡髓废,死狀恐怖巷懈,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情慌洪,我是刑警寧澤顶燕,帶...
    沈念sama閱讀 35,464評論 5 344
  • 正文 年R本政府宣布,位于F島的核電站冈爹,受9級特大地震影響涌攻,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜频伤,卻給世界環(huán)境...
    茶點故事閱讀 41,075評論 3 327
  • 文/蒙蒙 一恳谎、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧憋肖,春花似錦因痛、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,705評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至坐慰,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間用僧,已是汗流浹背结胀。 一陣腳步聲響...
    開封第一講書人閱讀 32,848評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留责循,地道東北人糟港。 一個月前我還...
    沈念sama閱讀 47,831評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像院仿,于是被迫代替她去往敵國和親秸抚。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,678評論 2 354

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