溫馨提示×

溫馨提示×

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

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

java運行時的數(shù)據(jù)區(qū)域分別是什么

發(fā)布時間:2021-08-26 17:08:27 來源:億速云 閱讀:113 作者:chen 欄目:大數(shù)據(jù)

本篇內(nèi)容介紹了“java運行時的數(shù)據(jù)區(qū)域分別是什么”的有關(guān)知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

Java運行時數(shù)據(jù)區(qū)域

  • 程序計數(shù)器

主要用來作為當(dāng)前線程所執(zhí)行的字節(jié)碼的行號指示器,就是通過它來知道需要執(zhí)行的字節(jié)碼指令地址。這塊區(qū)域是線程私有的,你看如果是線程共享的那切換線程之后誰知道下一條執(zhí)行該執(zhí)行哪里。如果執(zhí)行的Native方法的話,計數(shù)器的值就不是需要執(zhí)行的字節(jié)碼指令地址了,而是Undefined。

在內(nèi)存區(qū)域中計數(shù)器是唯一一個沒有規(guī)定OutOfMemoryError情況的區(qū)域。

  • 虛擬機(jī)棧

虛擬機(jī)棧是線程私有的,也就是每個線程它自身有一個虛擬機(jī)棧,棧里面放的是一個一個棧幀,每一個棧幀對應(yīng)著一個方法的調(diào)用,也就是一個方法的調(diào)用就是一個棧幀的入棧,方法執(zhí)行結(jié)束就是一個棧幀的出棧。

棧幀主要用來存儲局部變量、操作數(shù)棧、動態(tài)鏈接、方法出口等信息。所以多線程操作方法內(nèi)部的局部變量就不需要擔(dān)心出什么可見性或者原子性問題了,因為它是線程私有的!

其中的局部變量表存放的是編譯期就已知的各種基本數(shù)據(jù)類型、對象的引用和returnAddress類型(為字節(jié)碼指令jsr、jsr_w和wet服務(wù)的,它指向了一條字節(jié)碼指令的地址)。

除了long和double占用兩個局部變量空間(slot),其他數(shù)據(jù)類型都只占用1個空間,其所需的內(nèi)存空間在編譯器已確定。

當(dāng)線程請求的棧深度大于虛擬機(jī)所允許的深度(例如遞歸深度太深了),將拋出StackOverflowError?;蛘呷绻摂M機(jī)棧允許動態(tài)擴(kuò)展那當(dāng)擴(kuò)展到無法申請需要的內(nèi)存時候則拋出OutOfMemoryError。

  • 本地方法棧

和虛擬機(jī)棧很相似,主要區(qū)別就在于它是服務(wù)于Native方法,虛擬機(jī)棧服務(wù)于Java方法。有些虛擬機(jī)把本地方法棧和虛擬機(jī)棧合二為一例如(HotSpot)虛擬機(jī)。并且和虛擬機(jī)棧一樣會拋出StackOverflowError和OutOfMemoryError。

絕大部分情況下,堆是這幾部分中所占內(nèi)存最大的一塊。它是所有線程共享的內(nèi)存區(qū)域,隨著虛擬機(jī)的啟動而創(chuàng)建,它的目的就是存放對象實例!所有的對象實例以及數(shù)組都要在堆上面分配。

并且堆也是垃圾收集器的主要管理區(qū)域。根據(jù)垃圾處理器的分代收集算法,在堆中分為新生代和老年代。當(dāng)內(nèi)存不足的時候?qū)伋鯫utOfMemoryError。

  • 方法區(qū)

和堆一樣,是所有線程共享的內(nèi)存區(qū)域,用來存放已經(jīng)被虛擬機(jī)加載的類信息、常量、靜態(tài)變量、JIT編譯后的代碼等。編譯器時就將各種生成的字面量和符合引用放入常量池,在運行期間也有可能有新的常量加入例如用了String的intern()方法。

根據(jù)垃圾處理器的分代收集算法,永久代就在這里。當(dāng)內(nèi)存不足的時候?qū)伋鯫utOfMemoryError。

  • 直接內(nèi)存

直接內(nèi)存不是虛擬機(jī)運行時的數(shù)據(jù)區(qū)域的一部分,但是這里還是來說說。因為它還是很頻繁的被使用的!

NIO(New Input/Output),是通過通道和緩沖區(qū)的I/O方式,它使用Native函數(shù)庫直接分配堆外內(nèi)存,然后通過堆中的DirectByteBuffer對象作為引用來操作這塊內(nèi)存。

正常的內(nèi)存流應(yīng)該是本地IO-->直接內(nèi)存-->非直接內(nèi)存-->直接內(nèi)存-->本地IO。

而直接內(nèi)存就是本地IO-->直接內(nèi)存-->本地IO。

所以它能在一些通用的場景顯著的提高性能。直接內(nèi)存的大小受本機(jī)的總內(nèi)存限制!


“java運行時的數(shù)據(jù)區(qū)域分別是什么”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實用文章!

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

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

AI