久久精品五月,日韩不卡视频在线观看,国产精品videossex久久发布 ,久久av综合

站長(zhǎng)資訊網(wǎng)
最全最豐富的資訊網(wǎng)站

Java知識(shí)歸納之JVM詳解

本篇文章給大家?guī)?lái)了關(guān)于java的相關(guān)知識(shí),其中主要整理了JVM的相關(guān)問(wèn)題,包括了JVM內(nèi)存區(qū)域劃分、JVM類(lèi)加載機(jī)制、VM的垃圾回收等等內(nèi)容,下面一起來(lái)看一下,希望對(duì)大家有幫助。

Java知識(shí)歸納之JVM詳解

推薦學(xué)習(xí):《java視頻教程》

一.JVM內(nèi)存區(qū)域劃分

JVM為什么要?jiǎng)澐殖鲞@些區(qū)域呢?JVM內(nèi)存是從操作系統(tǒng)里面申請(qǐng)過(guò)來(lái)的,而JVM就根據(jù)功能需求將這些劃分成了一些小的模塊,這樣一塊大的場(chǎng)地就可以劃分成一些小的模塊,然后每個(gè)模塊就負(fù)責(zé)自己的功能就可以了,那接下來(lái)看看這些區(qū)域的功能到底是什么呢!

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

程序計(jì)數(shù)器是內(nèi)存中最小的區(qū)域,這里面主要保存了下一條要執(zhí)行的指令的地址在哪里(指令就是字節(jié)碼,一般程序要運(yùn)行,JVM就需要把字節(jié)碼加載出來(lái)放到內(nèi)存中,然后程序再把一條一條的指令從內(nèi)存中取出來(lái)放到CPU上去執(zhí)行,所以必須要記住當(dāng)前執(zhí)行到哪一條指令,以及下一條在哪里,因?yàn)镃PU不是只給一個(gè)進(jìn)程提供服務(wù)的,是給所有的進(jìn)程都提供服務(wù),是并發(fā)式的執(zhí)行程序的,又因?yàn)椴僮飨到y(tǒng)是以線(xiàn)程為單位進(jìn)行調(diào)度執(zhí)行的,所以每個(gè)線(xiàn)程都要有自己的執(zhí)行位置,也就是每一個(gè)線(xiàn)程都需要有一個(gè)程序計(jì)數(shù)器來(lái)記錄位置!)

2.棧

棧里面存放的主要是局部變量和方法調(diào)用信息,只要涉及到新方法的調(diào)用,就會(huì)有"入棧"的操作,每執(zhí)行完成一個(gè)方法,就會(huì)有"出棧"的操作,而且棧也是每個(gè)線(xiàn)程都有一份的
Java知識(shí)歸納之JVM詳解
因此對(duì)于遞歸來(lái)說(shuō),一定要控制好遞歸條件,否則很有可能會(huì)出現(xiàn)棧溢出(StackOverflowException)異常的!

3.堆

堆是內(nèi)存中空間最大的區(qū)域,而且堆是每個(gè)進(jìn)程只有一份的,進(jìn)程中的多個(gè)線(xiàn)程公用一個(gè)堆,里面主要存放著new出來(lái)的對(duì)象以及對(duì)象的成員變量,例如String s = new String()如果在方法里面這里的s就是局部變量是在棧上的,如果這個(gè)s是成員變量,就是在堆上的,而后面new String()是對(duì)象的本體,對(duì)象是在堆上的,這是容易混淆的地方,另外堆還有一個(gè)重要的點(diǎn)就是關(guān)于垃圾回收問(wèn)題,這個(gè)后面再詳細(xì)介紹!

4.方法區(qū)

方法區(qū)中存放的是"類(lèi)對(duì)象",平常所寫(xiě)的.java代碼經(jīng)過(guò)編譯器翻譯過(guò)后就會(huì)變成.class(二進(jìn)制字節(jié)碼),然后.class就會(huì)被加載到內(nèi)存中,也就被JVM構(gòu)造成了類(lèi)對(duì)象(加載的過(guò)程就是稱(chēng)為"類(lèi)加載"),而這些類(lèi)對(duì)象就會(huì)存放到方法區(qū)中,這里面就具體描述了類(lèi)長(zhǎng)啥樣(類(lèi)的名字,類(lèi)的成員及其成員名成員類(lèi)型,類(lèi)的方法及其方法名方法類(lèi)型,以及一些指令…另外類(lèi)對(duì)象里面還存放了一個(gè)很重要的東西,就是靜態(tài)成員,一般被static修飾的成員就成為了類(lèi)屬性,而普通的方法被稱(chēng)為實(shí)例屬性,這是有很大差別的)!

上面所介紹的是JVM中比較常見(jiàn)的區(qū)域,而一些JVM的內(nèi)存區(qū)域劃分不一定是符合實(shí)際情況的,JVM在實(shí)現(xiàn)的過(guò)程中區(qū)域的劃分是不盡相同的,不同的廠(chǎng)商不同版本的JVM都是有可能存在差異的,不過(guò)對(duì)于我們普通的程序員而講,只要不是去實(shí)現(xiàn)JVM,那么就不需要了解那么深刻,講上面的幾個(gè)常見(jiàn)的區(qū)域加以了解就可以了!


二.JVM類(lèi)加載機(jī)制

類(lèi)加載其實(shí)是設(shè)計(jì)一個(gè)運(yùn)行時(shí)環(huán)境的一個(gè)重要的功核心功能,這是非常重量級(jí)的,因此我這里也就簡(jiǎn)單介紹一下!
Java知識(shí)歸納之JVM詳解
上述就是類(lèi)加載的具體過(guò)程,最后面的Using和Unloading就是使用的過(guò)程就不介紹了,就介紹一下前面的三個(gè)大的步驟:

1.Loading(加載)

在loading階段就會(huì)先找到對(duì)應(yīng)的.class文件,然后打開(kāi)并讀取(根據(jù)字節(jié)流).class文件,同時(shí)初步生成一個(gè)類(lèi)對(duì)象,這個(gè)和完成的類(lèi)加載(class Loading)是不相同的,不要弄混淆了!
class文件的具體格式(如果要實(shí)現(xiàn)一個(gè)Java編譯器就得按照這樣的格式來(lái)構(gòu)造,實(shí)現(xiàn)JVM就得按照這個(gè)格式來(lái)進(jìn)行加載!):
Java知識(shí)歸納之JVM詳解
觀(guān)察這個(gè)格式就可以看到.class文件就把.java文件中的核心信息都表述進(jìn)去了,只不過(guò)組織格式上發(fā)生了轉(zhuǎn)變,所以loading環(huán)節(jié)就會(huì)把讀取到的信息,初步填寫(xiě)到類(lèi)對(duì)象中

2.Linking(連接)

連接一般就是建立好多個(gè)實(shí)體之間的聯(lián)系

2.1.Verification(驗(yàn)證)

Verification就是一個(gè)校驗(yàn)的過(guò)程,主要就是驗(yàn)證讀到的內(nèi)容是不是和規(guī)范中規(guī)定的格式完全匹配,如果發(fā)現(xiàn)讀到的數(shù)據(jù)格式不符合規(guī)范,就會(huì)類(lèi)加載失敗,并且拋出異常!

2.2.Preparation(準(zhǔn)備)

Preparation階段是正式為定義的變量(靜態(tài)變量,就是static修飾的變量)分配內(nèi)存并設(shè)置類(lèi)變量初始值的階段,就會(huì)給每個(gè)靜態(tài)變量分配內(nèi)存,并且設(shè)置為0值!

2.3.Resolution(解析)

Resolution階段是Java虛擬機(jī)將常量池內(nèi)的符號(hào)引用替換為直接引用的過(guò)程,也就是初始化常量的過(guò)程,.class文件中常量是集中放置的,每個(gè)常量會(huì)有一個(gè)編號(hào),而在.class文件中的結(jié)構(gòu)體里初始情況就只是記錄的編號(hào),然后就可以根據(jù)這個(gè)編號(hào)找到對(duì)應(yīng)的內(nèi)容,再填充到類(lèi)對(duì)象中!

3.Initialization(初始化)

Initialization階段就是真正的對(duì)類(lèi)對(duì)象進(jìn)行初始化(根據(jù)寫(xiě)的代碼),尤其是針對(duì)靜態(tài)成員

4.典型的面試題

class A {     public A(){         System.out.println("A的構(gòu)造方法");     }     {         System.out.println("A的構(gòu)造代碼塊");     }     static {         System.out.println("A的靜態(tài)代碼塊");     }}class B extends A{     public B(){         System.out.println("B的構(gòu)造方法");     }     {         System.out.println("B的構(gòu)造代碼塊");     }     static {         System.out.println("B的靜態(tài)代碼塊");     }}public class Test extends B{     public static void main(String[] args) {         new Test();         new Test();     }}

可以自己先嘗試寫(xiě)一下輸出的結(jié)果

做這樣的題就需要把握幾個(gè)大的原則:

  • 類(lèi)加載階段就會(huì)進(jìn)行靜態(tài)代碼塊的執(zhí)行,要想創(chuàng)建實(shí)例,勢(shì)必要先進(jìn)行類(lèi)加載

  • 靜態(tài)代碼塊只是類(lèi)加載階段執(zhí)行一次,其他階段都不會(huì)再執(zhí)行

  • 構(gòu)造方法和構(gòu)造代碼塊每次實(shí)例化都會(huì)執(zhí)行,而且構(gòu)造代碼塊會(huì)在構(gòu)造方法前面執(zhí)行~~

  • 父類(lèi)執(zhí)行在前,子類(lèi)執(zhí)行在后!

  • 程序是從main開(kāi)始執(zhí)行的,main的Test的方法,因此要執(zhí)行main就需要先加載Test類(lèi)

  • 只有涉及到這個(gè)類(lèi)了,類(lèi)里面的東西才會(huì)被加載

輸出結(jié)果: A的靜態(tài)代碼塊 B的靜態(tài)代碼塊 A的構(gòu)造代碼塊 A的構(gòu)造方法 B的構(gòu)造代碼塊 B的構(gòu)造方法 A的構(gòu)造代碼塊 A的構(gòu)造方法 B的構(gòu)造代碼塊 B的構(gòu)造方法

5.雙親委派模型

這個(gè)東西是類(lèi)加載中的一個(gè)環(huán)節(jié),處于Loading階段(比較靠前的部分),雙親委派模型描述的就是JVM中的類(lèi)加載器,如何根據(jù)類(lèi)的全限定名(java.lang.String)找到.class文件的過(guò)程。這里的類(lèi)加載器是JVM專(zhuān)門(mén)提供的對(duì)象,主要負(fù)責(zé)進(jìn)行類(lèi)加載,所以找文件的過(guò)程也是由類(lèi)加載器來(lái)負(fù)責(zé)的,.class文件可能放置的位置有很多,有的要放到JDK目錄里面,有的放到項(xiàng)目目錄里面,還有的在其他特定的位置里面,因此JVM提供了多個(gè)類(lèi)加載器,每個(gè)類(lèi)加載器負(fù)責(zé)一個(gè)片區(qū),而默認(rèn)的類(lèi)加載器主要有3個(gè):

  • BootStrapClassLoader:負(fù)責(zé)加載標(biāo)準(zhǔn)庫(kù)中的類(lèi)(String,ArrayList,Random,Scanner…)

  • ExtensionClassLoader:負(fù)責(zé)加載JDK擴(kuò)展的類(lèi)(現(xiàn)在很少用到)

  • ApplicationClassLoader:負(fù)責(zé)加載當(dāng)前項(xiàng)目目錄中的類(lèi)

  • 另外程序員還可以自定義類(lèi)加載器,來(lái)加載其他目錄中的類(lèi),Tomcat就自定義了類(lèi)加載器,用來(lái)專(zhuān)門(mén)加載webapps里面的.class

雙親委派模型就描述了這個(gè)找目錄的過(guò)程,也就是上述類(lèi)加載器是如何配合的
考慮找一下java.lang.String:

  • 程序啟動(dòng),就會(huì)先進(jìn)入ApplicationClassLoader類(lèi)加載器

  • ApplicationClassLoader類(lèi)加載器就會(huì)檢查下,它的父加載器是否已經(jīng)加載過(guò)了,如果沒(méi)有,就調(diào)用父 類(lèi)加載器ExtensionClassLoader

  • ExtensionClassLoader類(lèi)加載器就會(huì)檢查下,它的父加載器是否已經(jīng)加載過(guò)了,如果沒(méi)有,就調(diào)用父 類(lèi)加載器BootStrapClassLoader

  • BootStrapClassLoader類(lèi)加載器也會(huì)檢查下,它的父加載器是否已經(jīng)加載過(guò)了,然后發(fā)現(xiàn)沒(méi)有父親,于是就掃描自己負(fù)責(zé)的目錄

  • 然后java.lang.String這個(gè)類(lèi)就在標(biāo)準(zhǔn)庫(kù)中能找到,然后后續(xù)就由BootStrapClassLoader加載器負(fù)責(zé)后續(xù)的加載過(guò)程,查找環(huán)節(jié)就結(jié)束了!
    Java知識(shí)歸納之JVM詳解

考慮找一下自己寫(xiě)的Test類(lèi):

  • 程序啟動(dòng),就會(huì)先進(jìn)入ApplicationClassLoader類(lèi)加載器

  • ApplicationClassLoader類(lèi)加載器就會(huì)檢查下,它的父加載器是否已經(jīng)加載過(guò)了,如果沒(méi)有,就調(diào)用父 類(lèi)加載器ExtensionClassLoader

  • ExtensionClassLoader類(lèi)加載器就會(huì)檢查下,它的父加載器是否已經(jīng)加載過(guò)了,如果沒(méi)有,就調(diào)用父 類(lèi)加載器BootStrapClassLoader

  • BootStrapClassLoader類(lèi)加載器也會(huì)檢查下,它的父加載器是否已經(jīng)加載過(guò)了,然后發(fā)現(xiàn)沒(méi)有父親,于是就掃描自己負(fù)責(zé)的目錄,沒(méi)掃描到,就會(huì)回到子加載器中繼續(xù)掃描

  • ExtensionClassLoader掃描自己負(fù)責(zé)的目錄,也沒(méi)有掃描到,再回到子加載器中繼續(xù)掃描

  • ApplicationClassLoader也掃描自己負(fù)責(zé)的目錄,自己寫(xiě)的類(lèi)就在自己的項(xiàng)目目錄下,因此就能找到,然后后續(xù)的類(lèi)加載就由ApplicationClassLoad完成,此時(shí)查找目錄的環(huán)節(jié)就結(jié)束了~~(另外如果ApplicationClassLoader也沒(méi)有找到們就會(huì)拋出ClassNotFoundException異常)
    Java知識(shí)歸納之JVM詳解

這一套查找規(guī)則就稱(chēng)為雙親委派模型,那為啥JVM要這樣設(shè)計(jì)呢,理由就是一旦程序員自己寫(xiě)的類(lèi)和全限定類(lèi)名重復(fù)了,也能夠成功加載標(biāo)準(zhǔn)庫(kù)中的類(lèi),而不是自己寫(xiě)的類(lèi)!!!
另外如果是自定義的類(lèi)加載器,要不要遵守這個(gè)雙親委派模型呢?
答案是可以遵守也可以不遵守,主要看需求,例如Tomcat加載webapp中的類(lèi),就沒(méi)有遵守,因?yàn)樽袷亓松厦娴念?lèi)加載器也是不可能找到的!

三.JVM的垃圾回收

JVM中的垃圾回收機(jī)制(GC),一般在寫(xiě)代碼的時(shí)候,經(jīng)常就會(huì)涉及到申請(qǐng)內(nèi)存,例如創(chuàng)建一個(gè)變量,new一個(gè)對(duì)象,調(diào)用一個(gè)方法,加載類(lèi)…而申請(qǐng)內(nèi)存的時(shí)機(jī)一般是明確的(需要保存某個(gè)或某些數(shù)據(jù)就需要申請(qǐng)內(nèi)存),但是釋放內(nèi)存的時(shí)機(jī),卻是不那么清楚的,釋放的早了也不行(如果還是要使用的,結(jié)果已經(jīng)被釋放了這就讓其無(wú)內(nèi)存可用了,就讓這些數(shù)據(jù)"無(wú)處可去"),釋放的晚了也不行(釋放晚了,大量的囤積很有可能讓可用內(nèi)存逐漸變少,很有可能會(huì)出現(xiàn)內(nèi)存泄漏問(wèn)題,就是無(wú)內(nèi)存可以使用),因此內(nèi)存的釋放要恰到好處才好!
而垃圾回收的本職是靠運(yùn)行時(shí)環(huán)境額外做了很多的工作來(lái)完成釋放內(nèi)存操作的,這讓程序員的心智負(fù)擔(dān)大大降低了,但是垃圾回收也是有劣勢(shì)的:①消耗額外的開(kāi)銷(xiāo)(消耗資源耕

贊(0)
分享到: 更多 (0)
?
網(wǎng)站地圖   滬ICP備18035694號(hào)-2    滬公網(wǎng)安備31011702889846號(hào)
久久精品五月,日韩不卡视频在线观看,国产精品videossex久久发布 ,久久av综合
最新国产拍偷乱拍精品| 亚洲女人av| 国产精品mv在线观看| 免费在线观看一区| 亚洲女同av| 夜夜嗨一区二区| 亚洲免费资源| 国产精品videosex极品| а√天堂中文在线资源8| 99久久久久| 伊人久久大香线蕉av不卡| av一区二区高清| 亚洲区第一页| 国产精品yjizz视频网| 欧美福利在线| 91综合久久爱com| 在线天堂中文资源最新版| 黄色免费成人| 欧美日韩99| 久久人人精品| 午夜亚洲福利| 中文av在线全新| 综合激情视频| 激情中国色综合| 国产视频一区免费看| 国产丝袜一区| 亚洲性视频h| 日韩不卡免费视频| 91精品精品| 国产毛片精品| 欧美日韩国产欧| 国产精品4hu.www| 亚洲欧美激情诱惑| 精品九九在线| 日本一区中文字幕| 亲子伦视频一区二区三区| 日本v片在线高清不卡在线观看| a天堂资源在线| 亚洲有吗中文字幕| 久久久久一区| 欧美性www| 欧美~级网站不卡| 国产精品免费99久久久| 99久久亚洲精品蜜臀| 国产乱人伦丫前精品视频| 午夜久久影院| 97在线精品| 国产调教精品| 玖玖精品视频| 在线日韩中文| 日韩精品专区| 久久亚洲黄色| 日韩精品欧美精品| 国内精品99| 中文av在线全新| 日韩精品a在线观看91| 伊人影院久久| 亚洲精品在线影院| 精品国产欧美日韩| 国产精品久久久一区二区| 亚洲制服一区| 午夜欧美精品| 欧美亚洲精品在线| 日韩一区三区| av资源中文在线天堂| 国产精品久久久久久久久久白浆 | 国产va在线视频| 国产欧美日韩影院| 亚洲综合福利| 亚洲欧美日本视频在线观看| 欧美日韩亚洲在线观看| 精品国产第一福利网站| 国产极品模特精品一二| 97久久亚洲| 69堂精品视频在线播放| 首页亚洲欧美制服丝腿| 欧美片第1页| 老司机精品在线| 青草久久视频| 青草av.久久免费一区| 免费精品视频最新在线| av不卡在线看| 日韩午夜精品| 99在线|亚洲一区二区| 国产真实久久| 国产99精品一区| 欧美成人基地| 亚洲午夜电影| 日韩视频一区| 午夜在线一区二区| 国产精品日韩| 黄色国产精品| 99在线精品免费视频九九视| 蜜桃精品在线| 三级精品视频| 欧美日韩尤物久久| 欧美肉体xxxx裸体137大胆| 久久久久国产| 在线视频观看日韩| 亚洲欧洲一区| 亚洲日本国产| 欧美久久精品| 另类综合日韩欧美亚洲| 精品三级在线| 日韩免费视频| 影音先锋国产精品| 亚洲一区免费| 亚洲免费专区| 国产精品观看| 日韩在线精品| 亚洲一区成人| 日本中文字幕视频一区| 国产精品综合色区在线观看| 精品久久网站| 不卡一区2区| 亚洲资源网站| 欧美激情五月| 久久久久国产精品一区二区| 午夜国产精品视频免费体验区| 免费日韩视频| 国产精品视频首页| 国产一区一一区高清不卡| 日韩国产专区| 性欧美长视频| 国产精品chinese| 日韩三区在线| 久久aⅴ国产紧身牛仔裤| 欧美另类中文字幕 | 国产综合亚洲精品一区二| 免费人成精品欧美精品| 国产精品天天看天天狠| 亚洲天堂1区| 水野朝阳av一区二区三区| 91精品视频一区二区| 在线手机中文字幕| 天使萌一区二区三区免费观看| 91国内精品| 偷拍精品精品一区二区三区| 亚洲精品在线国产| 久久精品国产999大香线蕉| 国产精品视频一区二区三区综合| 国产精品久久久免费| 久久高清免费| 日韩精品a在线观看91| 国产欧洲在线| 男人的天堂久久精品| 国产极品一区| 97国产成人高清在线观看| 亚洲一区欧美激情| 久久这里只有| 日韩专区欧美专区| 中文在线а√天堂| 日韩在线观看中文字幕| 吉吉日韩欧美| 日本欧美韩国一区三区| 久久久夜夜夜| 久久av影视| 亚洲乱码视频| 日韩欧美精品综合| 欧美一区影院| 欧美~级网站不卡| 国产精品一区二区三区www| 日韩不卡在线| 国产精品一线天粉嫩av| 亚洲中午字幕| 在线天堂资源www在线污| 中文字幕av亚洲精品一部二部| 日韩欧美一区二区三区免费观看| 亚洲欧美日韩视频二区| 国产一区二区精品久| 午夜久久久久| 另类综合日韩欧美亚洲| 午夜久久av| 午夜欧美在线| 老牛影视精品| 日韩在线一区二区| 国产精品xx| 亚洲三级观看| 国产亚洲一区在线| 日本亚州欧洲精品不卡| 欧美在线资源| 性欧美精品高清| 亚洲福利专区| 蜜臀av性久久久久蜜臀aⅴ四虎 | 日韩高清二区| 国产精品欧美在线观看| 国产在线欧美| 91欧美在线| 国产精品22p| 蜜臀av一区二区在线免费观看| 亚洲伦乱视频| 伊伊综合在线| 欧美激情 亚洲a∨综合| 国产日韩1区| 亚洲人成网站在线在线观看| 99国产精品久久久久久久| 亚洲午夜av| 国产综合视频| 久久一级电影| 激情综合在线|