欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

JVM中內(nèi)存區(qū)域的作用是什么-創(chuàng)新互聯(lián)

JVM中內(nèi)存區(qū)域的作用是什么,很多新手對(duì)此不是很清楚,為了幫助大家解決這個(gè)難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來(lái)學(xué)習(xí)下,希望你能有所收獲。

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

什么是jvm內(nèi)存區(qū)域劃分?

其實(shí)這個(gè)問(wèn)題非常簡(jiǎn)單,JVM在運(yùn)行我們寫(xiě)好的代碼時(shí),他是必須使用多塊內(nèi)存空間的,不同的內(nèi)存空間用來(lái)放不同的數(shù)據(jù),然后配合我們寫(xiě)的代碼流程,才能讓我們的系統(tǒng)運(yùn)行起來(lái)。

舉個(gè)最簡(jiǎn)單的例子,比如咱們現(xiàn)在知道了JVM會(huì)加載類(lèi)到內(nèi)存里來(lái)供后續(xù)運(yùn)行,那么我問(wèn)問(wèn)大家,這些類(lèi)加載到內(nèi)存以后,放到哪兒去了呢?想過(guò)這個(gè)問(wèn)題嗎?

所以JVM里就必須有一塊內(nèi)存區(qū)域,用來(lái)存放我們寫(xiě)的那些類(lèi)。

包括我們定義的成員變量,類(lèi)變量,方法,局部變量等等,都在jvm內(nèi)存中對(duì)應(yīng)著一塊內(nèi)存來(lái)記錄存儲(chǔ)。

存放類(lèi)的方法區(qū)

在JDK1.8之前的版本里,代表JVM的一塊區(qū)域。在1.8版本以后,這塊區(qū)域的名字改了,叫做“Matespace”,可以認(rèn)為是“元數(shù)據(jù)空間”這樣的意思,當(dāng)然這里主要存放的還是我們自己寫(xiě)的各種類(lèi)的相關(guān)信息。

舉個(gè)栗子。有如下兩個(gè)類(lèi),People類(lèi)沒(méi)有成員變量,而Student類(lèi)有一個(gè)name的類(lèi)變量。

public class Student{  private static String name = "lisi";}public class People{  public static void main(){    Student student = new Student();  }}

這兩個(gè)類(lèi)被加載到JVM,就會(huì)存放在這個(gè)方法區(qū)里面(注意:如果讀過(guò)我之前的章節(jié),就會(huì)明白這里的加載代表的是:加載->驗(yàn)證->準(zhǔn)備->解析->初始化,類(lèi)的所有類(lèi)變量都會(huì)被賦值)。

執(zhí)行代碼指令的程序計(jì)數(shù)器

我們知道,被加載到j(luò)vm的類(lèi)對(duì)象是我們寫(xiě)的.java文件被編譯之后的.class文件。

在編譯過(guò)后會(huì)將我們的代碼編譯成計(jì)算機(jī)能讀懂的字節(jié)碼。而這個(gè).calss文件就是,就是我們代碼編譯好的字節(jié)碼了。

加載到內(nèi)存以后,字節(jié)碼執(zhí)行引擎就開(kāi)始工作了。去執(zhí)行我們編譯出來(lái)的代碼指令,如下圖

此時(shí)問(wèn)題來(lái)了,我們是不是需要一塊內(nèi)存空間來(lái)記錄我們字節(jié)碼執(zhí)行引擎目前執(zhí)行到了哪行代碼?這一塊特殊的內(nèi)存區(qū)域就是“程序計(jì)數(shù)器”

這個(gè)程序計(jì)數(shù)器就是用來(lái)記錄當(dāng)前執(zhí)行的字節(jié)碼指令的位置。

如下圖:

到這里我相信會(huì)有人產(chǎn)生疑惑,就按照當(dāng)前的代碼順序執(zhí)行就行了,為什么要記錄執(zhí)行到哪里了?

因?yàn)槲覀儗?xiě)好的代碼可能會(huì)開(kāi)啟多個(gè)線程并發(fā)的執(zhí)行不同的代碼??赡墚?dāng)前線程這段代碼還沒(méi)有執(zhí)行完畢,就上下文切換到另一段代碼中。

當(dāng)線程再次上下文切換到之前的代碼時(shí),就需要一個(gè)專門(mén)記錄當(dāng)前線程執(zhí)行到了哪一條字節(jié)碼。所以,每一個(gè)線程都有這自己的程序計(jì)數(shù)器。

如下圖:

java虛擬機(jī)棧

java代碼在執(zhí)行的時(shí)候,一定是某個(gè)線程來(lái)執(zhí)行某個(gè)方法中的代碼。

當(dāng)線程執(zhí)行到某個(gè)方法的時(shí)候,如果這個(gè)方法有局部變量,那么就需要一塊區(qū)域來(lái)存放局部變量的數(shù)據(jù)信息。這個(gè)區(qū)域就叫做java虛擬機(jī)棧。

每一個(gè)線程都有一個(gè)自己的java虛擬機(jī)棧,比如說(shuō)當(dāng)執(zhí)行main方法的時(shí)候就會(huì)有一個(gè)main線程,用來(lái)存放main方法中定義的局部變量

public static void main(){  People people = new People();  int i = 9;}

比如上面的main()方法中,其實(shí)就有一個(gè)"people"的局部變量,他是引用一個(gè)People的實(shí)例對(duì)象的,這個(gè)對(duì)象我們先不管他。然后有一個(gè)"i"的局部變量。

如下圖:

我想大家應(yīng)該都知道棧的數(shù)據(jù)結(jié)構(gòu),后進(jìn)先出。當(dāng)方法執(zhí)行完畢以后,這個(gè)棧楨就會(huì)出棧,里面的局部變量信息就會(huì)從內(nèi)存刪除。所以局部變量是線程安全的。因?yàn)橹挥挟?dāng)前線程能獲取到這個(gè)值。

為什么要用后進(jìn)先出的數(shù)據(jù)結(jié)構(gòu)?

假設(shè)a方法當(dāng)中同步調(diào)用b方法,此時(shí)a方法的棧楨先入棧,然后再是b方法的棧楨入棧。b方法執(zhí)行完畢后,b方法的棧楨出棧,繼續(xù)執(zhí)行a方法。所以使用一個(gè)后進(jìn)先出的棧結(jié)構(gòu)是非常完美的。

此時(shí)jvm的內(nèi)存模型圖如下:

java堆內(nèi)存

這一塊內(nèi)存是非常非常重要的。

我們實(shí)例化的所有對(duì)象都是存放在這個(gè)內(nèi)存中。這個(gè)實(shí)例化的對(duì)象里面會(huì)包含一些數(shù)據(jù),我們用上面的代碼來(lái)做栗子。

public class Student{  private String name = "lisi";  public String getNmae(){    return name;  }}public class People{  public static void main(){    Student student = new Student();    student.getName();  }}

還是這個(gè)代碼,當(dāng)main線程執(zhí)行main()方法的時(shí)候,首先在堆內(nèi)存中實(shí)例化Student對(duì)象,然后在局部變量中創(chuàng)建student,student存的是實(shí)例化Student對(duì)象的內(nèi)存地址。然后執(zhí)行Student對(duì)象的getName()方法。

如下圖:

由上圖可以看出來(lái),棧空間是封閉的,是線程安全的,而堆內(nèi)存中是我們主要發(fā)生線程不安全的地方,因?yàn)槎褍?nèi)存的空間所有的線程其實(shí)都是能共享的。

此時(shí)jvm的內(nèi)存劃分的最終模型為:

其他內(nèi)存區(qū)域

很多java程序猿對(duì)這一塊區(qū)域的接觸是非常少的。

其實(shí)在JDK的很多底層代碼API中,比如NIO。

如果你去看源碼會(huì)發(fā)現(xiàn)很多地方的代碼不是java寫(xiě)的,而是走的native方法去調(diào)用本地操作系統(tǒng)里面的一些方法,可能調(diào)用的都是c語(yǔ)言寫(xiě)的方法。

比如說(shuō):public native int hashCode();

在調(diào)用這種native方法的時(shí)候,就會(huì)有線程對(duì)應(yīng)的本地方法棧,這個(gè)其實(shí)類(lèi)似于java虛擬機(jī)棧。也是存放各種native方法的局部變量表之類(lèi)的信息。

還有一塊區(qū)域,是不是jvm的,通過(guò)NIO中的allocateDirect這種API,可以在jva堆外分配內(nèi)存空間,然后通過(guò)java虛擬機(jī)棧里的DirectByteBuffer來(lái)引用和操作堆外內(nèi)存空間。

看完上述內(nèi)容是否對(duì)您有幫助呢?如果還想對(duì)相關(guān)知識(shí)有進(jìn)一步的了解或閱讀更多相關(guān)文章,請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝您對(duì)創(chuàng)新互聯(lián)網(wǎng)站建設(shè)公司,的支持。

當(dāng)前名稱:JVM中內(nèi)存區(qū)域的作用是什么-創(chuàng)新互聯(lián)
文章位置:http://aaarwkj.com/article6/csojog.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供App開(kāi)發(fā)、域名注冊(cè)、搜索引擎優(yōu)化、品牌網(wǎng)站設(shè)計(jì)網(wǎng)站制作、靜態(tài)網(wǎng)站

廣告

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

網(wǎng)站建設(shè)網(wǎng)站維護(hù)公司
国产福利传媒在线观看| 欧美电影剧情av在线| 欧美内射专区精品一区| 亚洲成人午夜激情在线| 亚洲七七久久精品中文国产| 日韩欧美亚洲精品中文字幕αv | 日韩国产一区二区三区精品| 亚洲一区欧美二区日韩三区| 极品美女被插到高潮喷水| 久久久久久国产精彩视频| 日韩精品毛片在线看| 国产区精品福利在线熟女| 2020亚洲欧美日韩在线| 精品亚洲美无人区乱码| 精品亚洲一区二区三区四区| 一级丰满少妇av大片| 日韩欧美中文字幕区| 日本的一级片一区二区| 日本熟人妻中文字幕在线| 久久男女激情免费视频| 国产原创av剧情在线观看| 成人免费在线视频不卡| 给我搜一个一级黄色片| 亚洲丰满性感美女av| 91精品啪在线观看国产日本| 国产偷人伦激情在线观看| 手机黄色av免费在线网址| 亚洲日本韩国在线免费| 久久免费看少妇高潮免费| 亚洲色图综合在线观看| 亚洲精品国产高清久久| 欧美中文字幕内射合集| 人人妻人人澡人人爽人人dvd| 亚洲精品污一区二区三区| 日韩黄色资源在线观看| 日本成人在线播放网站| 国产一区日本二区欧美三区| 成年女人毛片免费观看不卡| 亚洲乱码中文字幕在线观看| 欧美日韩亚洲精品三级| 精品国产91久久粉嫩|