久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

干貨 | 深入了解 Java 內(nèi)存模型

 太極混元天尊 2018-06-08

架構(gòu)干貨,,關(guān)鍵時(shí)刻馬上送達(dá),!


來源:

itfeifei.win/2017/03/13/深入了解Java之虛擬機(jī)內(nèi)存/#0-sqq-1-86202-9737f6f9e09dfaf5d3fd14d775bfee85


在討論JVM內(nèi)存區(qū)域分析之前,,先來看一下Java程序具體執(zhí)行的過程:



Java 程序的執(zhí)行過程:Java 源代碼文件(.Java文件)-> Java Compiler(Java編譯器)->Java 字節(jié)碼文件(.class文件)->類加載器(Class Loader)->Runtime Data Area(運(yùn)行時(shí)數(shù)據(jù))-> Execution Engine(執(zhí)行引擎),。 我們今天就來分析一下Java程序執(zhí)行過程的 Runtime Data Area(運(yùn)行時(shí)數(shù)據(jù)) 這一塊


那么運(yùn)行時(shí)數(shù)據(jù)區(qū)包括哪幾部分呢,?


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

  • Java虛擬機(jī)棧(VM Stack)

  • 本地方法棧(Native Method Stack)

  • 方法區(qū)(method area)

  • 堆(heap)


一、程序計(jì)數(shù)器


用來指示程序執(zhí)行哪一條指令,,這跟匯編語言的程序計(jì)數(shù)器的功能在邏輯上是一樣的,。JVM規(guī)范中規(guī)定,如果線程執(zhí)行的是非native方法,,則程序計(jì)數(shù)器中保存的是當(dāng)前需要執(zhí)行的指令地址,,如果線程執(zhí)行的是native方法,,則程序計(jì)數(shù)器中的值undefined。每個(gè)線程都有自己獨(dú)立的程序計(jì)數(shù)器,。為什么呢,?因?yàn)槎嗑€程下,一個(gè)CPU內(nèi)核只會(huì)執(zhí)行一條線程中的指令,,因此為了使每個(gè)線程在線程切換之后能夠恢復(fù)到切換之前的程序執(zhí)行的位置,,所以每個(gè)線程都有自己獨(dú)立的程序計(jì)數(shù)器。


二,、Java虛擬機(jī)棧


Java虛擬機(jī)棧中存放的是一個(gè)個(gè)棧幀,,當(dāng)程序執(zhí)行一個(gè)方法時(shí),就會(huì)創(chuàng)建一個(gè)棧幀并壓入棧中,,當(dāng)方法執(zhí)行完畢之后,,便會(huì)將棧幀移除棧。我們所說的“?!笔侵窲ava虛擬機(jī)棧,,一個(gè)棧幀中包括:局部變量表、操作數(shù)棧,、動(dòng)態(tài)連接,、方法返回地址、附加信息


局部變量表


主要是存儲(chǔ)方法中的局部變量,,包括方法中局部變量的信息和方法的參數(shù),。如:各種基本數(shù)據(jù)類型(boolean、byte,、char,、short、int,、float,、long、double),、對象引用(reference類型,,它不等同于對象本身,可能是一個(gè)指向?qū)ο笃鹗嫉刂返囊弥羔?,也可能是指向一個(gè)代表對象的句柄或其他與此對象相關(guān)的位置)和returnAddress類型(指向了一條字節(jié)碼指令的地址),其中64位長度的long和double類型的數(shù)據(jù)會(huì)占用2個(gè)局部變量空間(Slot),,其余的數(shù)據(jù)類型只占用1個(gè),。局部變量表的大小在編譯器就可以確定其大小了,因此在程序執(zhí)行期間局部變量表的大小是不會(huì)改變的,。在Java虛擬機(jī)規(guī)范中,,對這個(gè)區(qū)域規(guī)定了兩種異常狀況:如果線程請求的棧深度大于虛擬機(jī)所允許的深度,將拋出StackOverflowError異常;如果虛擬機(jī)??梢詣?dòng)態(tài)擴(kuò)展(當(dāng)前大部分的Java虛擬機(jī)都可動(dòng)態(tài)擴(kuò)展,,只不過Java虛擬機(jī)規(guī)范中也允許固定長度的虛擬機(jī)棧),如果擴(kuò)展時(shí)無法申請到足夠的內(nèi)存,,就會(huì)拋出OutOfMemoryError異常,。


操作數(shù)棧


虛擬機(jī)把操作數(shù)棧作為它的工作區(qū),程序中的所有計(jì)算過程都是在借助于操作數(shù)棧來完成的,,大多數(shù)指令都要從這里彈出數(shù)據(jù),,執(zhí)行運(yùn)算,然后把結(jié)果壓回操作數(shù)棧,。


動(dòng)態(tài)連接


每個(gè)棧幀都包含一個(gè)指向運(yùn)行時(shí)常量池中該棧幀所屬方法的引用(指向運(yùn)行時(shí)常量池:在方法執(zhí)行的過程中有可能需要用到類中的常量),,持有這個(gè)引用是為了支持方法調(diào)用過程中的動(dòng)態(tài)連接


方法返回地址


當(dāng)一個(gè)方法執(zhí)行完畢之后,要返回之前調(diào)用它的地方,,因此在棧幀中必須保存一個(gè)方法返回地址,。


附加信息


虛擬機(jī)規(guī)范允許具體的虛擬機(jī)實(shí)現(xiàn)增加一些規(guī)范里沒有描述的信息到棧幀中,例如與高度相關(guān)的信息,,這部分信息完全取決于具體的虛擬機(jī)實(shí)現(xiàn),。在實(shí)際開發(fā)中,一般會(huì)把動(dòng)態(tài)連接,,方法返回地址與其它附加信息全部歸為一類,,稱為棧幀信息。


三,、本地方法棧


本地方法棧(Native Method Stack)與虛擬機(jī)棧所發(fā)揮的作用是非常相似的,,它們之間的區(qū)別不過是虛擬機(jī)棧為虛擬機(jī)執(zhí)行Java方法(也就是字節(jié)碼)服務(wù),而本地方法棧則為虛擬機(jī)使用到的Native方法服務(wù),。與虛擬機(jī)棧一樣,,本地方法棧區(qū)域也會(huì)拋出StackOverflowError和OutOfMemoryError異常。


四,、堆(heap)


在C語言中,,程序員可以通過malloc函數(shù)和free函數(shù)在堆上申請和釋放空間。那么在Java中是怎么樣的呢,?Java中的堆是用來存儲(chǔ)對象本身的以及數(shù)組(當(dāng)然,,數(shù)組引用是存放在Java棧中的),幾乎所有的對象實(shí)例都在這里分配內(nèi)存,。在Java中,,程序員基本不用去關(guān)心空間釋放的問題,Java的垃圾回收機(jī)制會(huì)自動(dòng)進(jìn)行處理,。另外,,堆是被所有線程共享的,,在JVM中只有一個(gè)堆。


五,、方法區(qū)


方法區(qū)(Method Area)與Java堆一樣,,是各個(gè)線程共享的內(nèi)存區(qū)域,它用于存儲(chǔ)已被虛擬機(jī)加載的類信息,、常量,、靜態(tài)變量、以及編譯器編譯后的代碼等,。運(yùn)行時(shí)常量池(Runtime Constant Pool)是方法區(qū)的一部分,。Class文件中除了有類的版本、字段,、方法,、接口等描述信息外,還有一項(xiàng)信息是常量池(Constant Pool Table),,用于存放編譯期生成的各種字面量和符號(hào)引用,,這部分內(nèi)容將在類加載后進(jìn)入方法區(qū)的運(yùn)行時(shí)常量池中存放。在JVM規(guī)范中,,沒有強(qiáng)制要求方法區(qū)必須實(shí)現(xiàn)垃圾回收,。很多人習(xí)慣將方法區(qū)稱為“永久代”,是因?yàn)镠otSpot虛擬機(jī)以永久代來實(shí)現(xiàn)方法區(qū),,從而JVM的垃圾收集器可以像管理堆區(qū)一樣管理這部分區(qū)域,,從而不需要專門為這部分設(shè)計(jì)垃圾回收機(jī)制。不過自從JDK7之后,,Hotspot虛擬機(jī)便將運(yùn)行時(shí)常量池從永久代移除了,。


老鐵們,Java 8 內(nèi)存模型都有什么新變化,?歡迎在下方拍磚留言,。順便點(diǎn)點(diǎn)文章底部的小廣告,給小姐姐掙支口紅錢吧,!么么噠


看完本文有收獲,?請轉(zhuǎn)發(fā)分享給更多人

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點(diǎn),。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,,謹(jǐn)防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報(bào),。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多