日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
一文看懂JVM內(nèi)存分布與作用

一文看懂JVM內(nèi)存分布與作用

作者: bingfeng 2021-06-06 13:06:34

云計(jì)算

虛擬化 如果線程正在執(zhí)行一個(gè)Java方法,那么它記錄的是正在執(zhí)行虛擬機(jī)字節(jié)碼指令的地址,如果是一個(gè)本地方法那么它的值為空。

我們提供的服務(wù)有:網(wǎng)站設(shè)計(jì)制作、成都做網(wǎng)站、微信公眾號(hào)開發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、玉門ssl等。為上千企事業(yè)單位解決了網(wǎng)站和推廣的問(wèn)題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的玉門網(wǎng)站制作公司

本文轉(zhuǎn)載自微信公眾號(hào)「一個(gè)程序員的成長(zhǎng)」,作者bingfeng 。轉(zhuǎn)載本文請(qǐng)聯(lián)系一個(gè)程序員的成長(zhǎng)公眾號(hào)。

那么我們?cè)陂_始介紹Java內(nèi)存區(qū)域之前,我們先放一張內(nèi)存區(qū)域的圖,方便我們后面介紹的時(shí)候可以對(duì)照著看。

「須知」,本文是根據(jù)JDK8來(lái)介紹的。

Java內(nèi)存區(qū)域圖

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

首先它是線程私有的,它也稱為代碼的行號(hào)指示器,字節(jié)碼解釋器就是通過(guò)改變程序計(jì)數(shù)器的位置來(lái)確定下一行要執(zhí)行的代碼,它不存在OOM。

如果線程正在執(zhí)行一個(gè)Java方法,那么它記錄的是正在執(zhí)行虛擬機(jī)字節(jié)碼指令的地址,如果是一個(gè)本地方法那么它的值為空。

Java虛擬機(jī)棧

它也是線程私有的,它的聲明周期和線程一致。每個(gè)線程創(chuàng)建時(shí)都會(huì)創(chuàng)建一個(gè)虛擬機(jī)棧,內(nèi)部保存了一個(gè)個(gè)的棧幀,每個(gè)棧幀就對(duì)應(yīng)著一次方法的調(diào)用。既然知道了虛擬機(jī)棧里面存放的是一個(gè)個(gè)的棧幀,那么也不難猜出虛擬機(jī)棧里面都存儲(chǔ)了什么東西。

Java虛擬機(jī)棧是存在OOM的,當(dāng)線程所請(qǐng)求的棧的深度大于虛擬機(jī)棧的深度或者虛擬機(jī)??梢詣?dòng)態(tài)擴(kuò)容,當(dāng)棧擴(kuò)展時(shí)無(wú)法申請(qǐng)到足夠的內(nèi)存時(shí),就會(huì)拋出OOM。

  • 「虛擬機(jī)棧內(nèi)部結(jié)構(gòu)」:

虛擬機(jī)棧內(nèi)部結(jié)構(gòu)

  • 「局部變量表」:

主要存儲(chǔ)方法的參數(shù),所有的基本類型數(shù)據(jù)和對(duì)象地址,以及返回地址類型(return address)。它以變量槽為最小的存儲(chǔ)單位,Java虛擬機(jī)并沒(méi)有規(guī)定一個(gè)變量槽占用多少內(nèi)存空間,但是規(guī)定了一個(gè)變量槽可以存放一個(gè)32位以內(nèi)的數(shù)據(jù)類型。如果存儲(chǔ)的數(shù)據(jù)類型超過(guò)32位,比如long、double,那么就使用兩個(gè)變量槽進(jìn)行存儲(chǔ)。

  • 「操作數(shù)?!梗?/li>

操作數(shù)棧是一個(gè)先進(jìn)后出的操作數(shù)棧,當(dāng)一個(gè)方法剛開始執(zhí)行的時(shí)候,一個(gè)新的棧幀也會(huì)隨之被創(chuàng)建出來(lái),這個(gè)方法的操作數(shù)棧是空的,它主要用于保存計(jì)算過(guò)程的中間結(jié)果,同時(shí)作為計(jì)算過(guò)程中變量臨時(shí)的存儲(chǔ)空間。如果被調(diào)用的方法有返回值,那么返回值將會(huì)被壓入當(dāng)前棧幀的操作數(shù)棧中。操作數(shù)棧并非采用索引的方式進(jìn)行數(shù)據(jù)訪問(wèn),而是通過(guò)入棧(push)和出棧(pop)操作來(lái)完成數(shù)據(jù)的訪問(wèn)。

  • 「動(dòng)態(tài)鏈接」:

大白話就是,棧幀中保存了一個(gè)方法的引用,當(dāng)執(zhí)行方法的時(shí)候,可以拿著這個(gè)引用到運(yùn)行時(shí)常量池中找到這個(gè)方法。

動(dòng)態(tài)鏈接的作用就是將這些方法的符號(hào)引用轉(zhuǎn)換為調(diào)用方法的直接引用。

  • 「方法返回地址」:

就是在方法執(zhí)行結(jié)束之后,要返回下一條要執(zhí)行代碼位置的值,也就是程序計(jì)數(shù)器的值。

那么除了方法正常執(zhí)行結(jié)束退出外,還有另外一種情況就是異常導(dǎo)致的方法退出,那么這種情況下是不會(huì)返回任何值的。對(duì)于拋出的異常,棧幀中不會(huì)做任何記錄,但是會(huì)記錄在一個(gè)異常表中。

本地方法棧

Java虛擬機(jī)棧為虛擬機(jī)執(zhí)行Java方法服務(wù),本地方法棧則為虛擬機(jī)使用到的本地方法服務(wù)。像JVM就有好多C語(yǔ)言寫的方法,這個(gè)就需要本地方法棧來(lái)執(zhí)行。

Java堆

Java堆是虛擬機(jī)中最大的一塊內(nèi)存空間,它被所有的線程共享,在虛擬機(jī)啟動(dòng)時(shí)創(chuàng)建。它唯一的目的就是存放對(duì)象實(shí)例。

如果面試被問(wèn)到,所有的對(duì)象實(shí)例都是在堆中分配內(nèi)存嗎?這個(gè)時(shí)候你一定要回答,不是。

隨著即時(shí)編譯技術(shù)的發(fā)展進(jìn)步,尤其是逃逸分析技術(shù)的日漸強(qiáng)大,棧上分配、變量替換等優(yōu)化手段,讓實(shí)例在”只在堆“中分配不再成為絕對(duì)。

Java堆是垃圾收集的主要區(qū)域,Java堆中也經(jīng)常出現(xiàn)新生代、老年代、永久代等等,這里需要注意,這些并不是Java堆物理上的內(nèi)存布局,它是作為垃圾收集器而劃分一種內(nèi)存布局。

方法區(qū)

方法區(qū)也是線程共享的區(qū)域,它主要用于存儲(chǔ)被虛擬機(jī)加載的類型信息、常量、靜態(tài)變量、即時(shí)編譯器編譯后的代碼緩存等數(shù)據(jù)。

方法區(qū)它是可以被垃圾收集器進(jìn)行回收的,主要針對(duì)類型的卸載和常量池的回收。

方法區(qū)也可以產(chǎn)生OOM,當(dāng)方法區(qū)無(wú)法滿足新的內(nèi)存分配需求時(shí),將拋出OutOfMemoryError異常。

運(yùn)行時(shí)常量池

運(yùn)行時(shí)常量池是方法區(qū)的一部分。Class文件中除了有類的版本、字段、方法、接口等信息外,還有一項(xiàng)信息是常量池表,它用來(lái)存儲(chǔ)編譯期生成的各種字面量和符號(hào)引用。

如果動(dòng)態(tài)鏈接那塊沒(méi)看懂,那么看了運(yùn)行常量池再翻回去看看是不是好理解了。


標(biāo)題名稱:一文看懂JVM內(nèi)存分布與作用
文章網(wǎng)址:http://www.5511xx.com/article/cdhhjgi.html