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

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

目前成都創(chuàng)新互聯(lián)已為上千多家的企業(yè)提供了網(wǎng)站建設(shè)、域名、虛擬空間、成都網(wǎng)站托管、企業(yè)網(wǎng)站設(shè)計(jì)、靈石網(wǎng)站維護(hù)等服務(wù),公司將堅(jiān)持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長,共同發(fā)展。

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

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

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

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

  • 虛擬機(jī)棧

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

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

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

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

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

  • 本地方法棧

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

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

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

  • 方法區(qū)

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

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

  • 直接內(nèi)存

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

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運(yùn)行時(shí)的數(shù)據(jù)區(qū)域分別是什么”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!

分享名稱:java運(yùn)行時(shí)的數(shù)據(jù)區(qū)域分別是什么
URL分享:http://muchs.cn/article24/pidoje.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供電子商務(wù)、網(wǎng)站導(dǎo)航、網(wǎng)站內(nèi)鏈、企業(yè)建站、手機(jī)網(wǎng)站建設(shè)、網(wǎng)站設(shè)計(jì)公司

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

小程序開發(fā)