溫馨提示×

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

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

什么是運(yùn)行時(shí)數(shù)據(jù)區(qū)

發(fā)布時(shí)間:2021-10-11 17:56:18 來(lái)源:億速云 閱讀:162 作者:iii 欄目:編程語(yǔ)言

這篇文章主要講解了“什么是運(yùn)行時(shí)數(shù)據(jù)區(qū)”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“什么是運(yùn)行時(shí)數(shù)據(jù)區(qū)”吧!

前言

本節(jié)主要講的是運(yùn)行時(shí)數(shù)據(jù)區(qū),也就是下圖這部分,它是在類加載完成后的階段

什么是運(yùn)行時(shí)數(shù)據(jù)區(qū)

當(dāng)我們通過(guò)前面的:類的加載-> 驗(yàn)證 -> 準(zhǔn)備 -> 解析 -> 初始化 這幾個(gè)階段完成后,就會(huì)用到執(zhí)行引擎對(duì)我們的類進(jìn)行使用,同時(shí)執(zhí)行引擎將會(huì)使用到我們運(yùn)行時(shí)數(shù)據(jù)區(qū)

什么是運(yùn)行時(shí)數(shù)據(jù)區(qū)

也就是大廚做飯,我們把大廚后面的東西(切好的菜,刀,調(diào)料),比作是運(yùn)行時(shí)數(shù)據(jù)區(qū)。而廚師可以類比于執(zhí)行引擎,將通過(guò)準(zhǔn)備的東西進(jìn)行制作成精美的菜品

什么是運(yùn)行時(shí)數(shù)據(jù)區(qū)

內(nèi)存是非常重要的系統(tǒng)資源,是硬盤和CPU的中間倉(cāng)庫(kù)及橋梁,承載著操作系統(tǒng)和應(yīng)用程序的實(shí)時(shí)運(yùn)行JVM內(nèi)存布局規(guī)定了Java在運(yùn)行過(guò)程中內(nèi)存申請(qǐng)、分配、管理的策略,保證了JVM的高效穩(wěn)定運(yùn)行。不同的JVM對(duì)于內(nèi)存的劃分方式和管理機(jī)制存在著部分差異(主要針對(duì)方法區(qū))。結(jié)合JVM虛擬機(jī)規(guī)范,來(lái)探討一下經(jīng)典的JVM內(nèi)存布局。

我們通過(guò)磁盤或者網(wǎng)絡(luò)IO得到的數(shù)據(jù),都需要先加載到內(nèi)存中,然后CPU從內(nèi)存中獲取數(shù)據(jù)進(jìn)行讀取,也就是說(shuō)內(nèi)存充當(dāng)了CPU和磁盤之間的橋梁

運(yùn)行時(shí)數(shù)據(jù)區(qū)的完整圖

什么是運(yùn)行時(shí)數(shù)據(jù)區(qū)

  • Java虛擬機(jī)定義了若干種程序運(yùn)行期間會(huì)使用到的運(yùn)行時(shí)數(shù)據(jù)區(qū),其中有一些會(huì)隨著虛擬機(jī)啟動(dòng)而創(chuàng)建,隨著虛擬機(jī)退出而銷毀。另外一些則是與線程一一對(duì)應(yīng)的,這些與線程對(duì)應(yīng)的數(shù)據(jù)區(qū)域會(huì)隨著線程開(kāi)始和結(jié)束而創(chuàng)建和銷毀。

  • 灰色的為單獨(dú)線程私有的,紅色的為多個(gè)線程共享的。即:

    • 每個(gè)線程:獨(dú)立包括程序計(jì)數(shù)器、棧、本地棧。

    • 線程間共享:堆、堆外內(nèi)存(永久代或元空間(理解為方法區(qū))、代碼緩存) 

什么是運(yùn)行時(shí)數(shù)據(jù)區(qū)

關(guān)于線程間共享的說(shuō)明:

什么是運(yùn)行時(shí)數(shù)據(jù)區(qū)

每個(gè)JVM只有一個(gè)Runtime實(shí)例。即為運(yùn)行時(shí)環(huán)境,相當(dāng)于內(nèi)存結(jié)構(gòu)的中間的那個(gè)框框:運(yùn)行時(shí)環(huán)境

線程

  • 線程是一個(gè)程序里的運(yùn)行單元。JVM允許一個(gè)應(yīng)用有多個(gè)線程并行的執(zhí)行。 

  • 在Hotspot JVM里,每個(gè)線程都與操作系統(tǒng)的本地線程直接映射。

    • 當(dāng)一個(gè)Java線程準(zhǔn)備好執(zhí)行以后,此時(shí)一個(gè)操作系統(tǒng)的本地線程也同時(shí)創(chuàng)建。Java線程執(zhí)行終止后,本地線程也會(huì)回收。

  • 操作系統(tǒng)負(fù)責(zé)所有線程的安排調(diào)度到任何一個(gè)可用的CPU上。一旦本地線程初始化成功,它就會(huì)調(diào)用Java線程中的run()方法。

JVM系統(tǒng)線程

  • 如果你使用jconsole或者是任何一個(gè)調(diào)試工具,都能看到在后臺(tái)有許多線程在運(yùn)行。這些后臺(tái)線程不包括調(diào)用public static void main(String[])的main線程以及所有這個(gè)main線程自己創(chuàng)建的線程。

  • 這些主要的后臺(tái)系統(tǒng)線程在Hotspot JVM里主要是以下幾個(gè):

    • 虛擬機(jī)線程:這種線程的操作是需要JVM達(dá)到安全點(diǎn)才會(huì)出現(xiàn)。這些操作必須在不同的線程中發(fā)生的原因是他們都需要JVM達(dá)到安全點(diǎn),這樣堆才不會(huì)變化。這種線程的執(zhí)行類型包括"stop-the-world"的垃圾收集,線程棧收集,線程掛起以及偏向鎖撤銷。

    • 周期任務(wù)線程:這種線程是時(shí)間周期事件的體現(xiàn)(比如中斷),他們一般用于周期性操作的調(diào)度執(zhí)行。

    • GC線程:這種線程對(duì)在JVM里不同種類的垃圾收集行為提供了支持。

    • 編譯線程:這種線程在運(yùn)行時(shí)會(huì)將字節(jié)碼編譯成到本地代碼。

    • 信號(hào)調(diào)度線程:這種線程接收信號(hào)并發(fā)送給JVM,在它內(nèi)部通過(guò)調(diào)用適當(dāng)?shù)姆椒ㄟM(jìn)行處理。

感謝各位的閱讀,以上就是“什么是運(yùn)行時(shí)數(shù)據(jù)區(qū)”的內(nèi)容了,經(jīng)過(guò)本文的學(xué)習(xí)后,相信大家對(duì)什么是運(yùn)行時(shí)數(shù)據(jù)區(qū)這一問(wèn)題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!

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

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

AI