溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Java內(nèi)存區(qū)域的各自用途是什么

發(fā)布時(shí)間:2021-10-14 16:37:57 來源:億速云 閱讀:126 作者:柒染 欄目:編程語言

Java內(nèi)存區(qū)域的各自用途是什么,針對這個(gè)問題,這篇文章詳細(xì)介紹了相對應(yīng)的分析和解答,希望可以幫助更多想解決這個(gè)問題的小伙伴找到更簡單易行的方法。

  每個(gè)內(nèi)存區(qū)域都有各自的用途,以及創(chuàng)建和銷毀時(shí)間,有的區(qū)域會隨著虛擬機(jī)的啟動而存在,有的區(qū)域依賴用戶線程而建立和銷毀,接下來一次介紹這些內(nèi)存區(qū)域。

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

  程序計(jì)數(shù)器(ProgramCounterRegister)是線程私有的內(nèi)存區(qū)域,是當(dāng)前線程所執(zhí)行的字節(jié)碼的行號指示器,是一塊較小的內(nèi)存空間。

  字節(jié)碼解釋器(java源碼編譯成字節(jié)碼,運(yùn)行時(shí)解釋成機(jī)器碼執(zhí)行)工作時(shí),就是通過改變程序計(jì)數(shù)器的值,來選取下一條要執(zhí)行的字節(jié)碼。分支、循環(huán)、跳轉(zhuǎn)等都依賴程序計(jì)數(shù)器執(zhí)行。

  當(dāng)線程執(zhí)行Java方法時(shí),程序計(jì)數(shù)器記錄的是正在執(zhí)行的虛擬機(jī)字節(jié)碼指令地址;當(dāng)線程執(zhí)行Native方法時(shí),程序計(jì)數(shù)器的值為空(Undefined)。程序計(jì)數(shù)器是唯一一個(gè)在Java虛擬機(jī)規(guī)范中沒有規(guī)定OutOfMemoryError的內(nèi)存區(qū)域。

Java虛擬機(jī)棧

  Java虛擬機(jī)棧(JavaStack)也是線程私有的內(nèi)存區(qū)域,它的生命周期與線程相同。虛擬機(jī)棧描述的是Java方法執(zhí)行的內(nèi)存模型:每個(gè)方法在執(zhí)行時(shí)都會創(chuàng)建一個(gè)棧幀(StackFrame)用以存儲局部變量表、操作數(shù)棧、動態(tài)鏈接、方法出口等信息。每一個(gè)方法從開始調(diào)用到執(zhí)行完成的過程,就對應(yīng)一個(gè)棧幀在虛擬機(jī)棧中從入棧到出棧的過程。

  局部變量表存放了編譯期可知的各種基本數(shù)據(jù)類型(booleanbytecharshortintlongdoublefloat)、對象引用,以及returnAddress類型(指向一條字節(jié)碼指令的地址)。局部變量表所需內(nèi)存空間在編譯期間完成分配,當(dāng)進(jìn)入一個(gè)方法時(shí),需要在棧幀中分配多大的局部變量空間是完全確定的,在方法運(yùn)行期間不會改變局部變量表大小。

  在Java虛擬機(jī)規(guī)范中,Java虛擬機(jī)棧有可能會出現(xiàn)兩種異常:StackOverflowError和OutOfMemoryError。如果線程請求的棧深度大于虛擬機(jī)棧的深度,則會StackOverflowError。如果虛擬機(jī)棧動態(tài)擴(kuò)展時(shí)申請不到足夠的內(nèi)存,則會OutOfMemoryError。

本地方法棧

  本地方法棧(NativeMethodStack)與Java虛擬機(jī)棧的作用一樣,是線程私有的,區(qū)別就是Java虛擬機(jī)棧為執(zhí)行Java方法服務(wù),本地方法棧為Native方法服務(wù),虛擬機(jī)規(guī)范并沒有對本地方法棧做強(qiáng)制規(guī)定,在HotSpot虛擬機(jī)中把本地方法棧和虛擬機(jī)棧合二為一了。此內(nèi)存區(qū)域也會拋出StackOverflowError和OutOfMemoryError。

Java堆

  Java堆(JavaHeap)是一塊被所有線程共享的內(nèi)存區(qū)域,同時(shí)也是Java虛擬機(jī)所管理的內(nèi)存中最大的一塊,在虛擬機(jī)啟動時(shí)創(chuàng)建。此內(nèi)存區(qū)域的唯一目的就是存放對象實(shí)例,幾乎所有的對象實(shí)例都在這里分配內(nèi)存。

  Java堆是垃圾收集器管理堆主要區(qū)域,也被稱做“GC堆”。現(xiàn)在垃圾收集器基本都采用分代收集算法,所以從內(nèi)存回收角度看,Java堆還可以細(xì)分為:新生代和老年代;新生代可以再細(xì)分為Eden空間、FromSurvivor空間、ToSurvivor空間。

關(guān)于Java內(nèi)存區(qū)域的各自用途是什么問題的解答就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注億速云行業(yè)資訊頻道了解更多相關(guān)知識。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI