欧美free性护士vide0shd,老熟女,一区二区三区,久久久久夜夜夜精品国产,久久久久久综合网天天,欧美成人护士h版

目錄

柚子快報(bào)邀請(qǐng)碼778899分享:java JVM的深入理解

柚子快報(bào)邀請(qǐng)碼778899分享:java JVM的深入理解

http://yzkb.51969.com/

1、JVM(Java虛擬機(jī)):我們java編譯時(shí)候,下通過把a(bǔ)vac把.java文件轉(zhuǎn)換成.class文件(字節(jié)碼文件),之后我們通過jvm把字節(jié)碼文件轉(zhuǎn)換成對(duì)應(yīng)的cpu能識(shí)別的機(jī)器指令(翻譯官角色),我們發(fā)布一個(gè)Java程序,我們只需要發(fā)布.class文件即可,不同平臺(tái)上的jvm是有差異的,對(duì)java提供的內(nèi)容是一致的,但是對(duì)不同的操作系統(tǒng)來(lái)說(shuō)是可能不一致的

一、JVM中的內(nèi)存區(qū)域劃分

1、jvm其實(shí)也是一個(gè)進(jìn)程(任務(wù)管理器中看到的java進(jìn)程),進(jìn)程運(yùn)行過程中要從操作系統(tǒng)這里申請(qǐng)一些資源(內(nèi)存就是其中典型的資源),JVM從系統(tǒng)中申請(qǐng)了一大塊內(nèi)存,這一大塊內(nèi)存給Java程序使用的時(shí)候,又根據(jù)實(shí)際的使用用途劃分出不同的空間

(1)堆:代碼中new出來(lái)的對(duì)象,都是在堆里,對(duì)象中持有的非靜態(tài)成員變量,也就是在堆里

(2)棧:本地方法棧(jvm內(nèi)部的調(diào)用關(guān)系和局部變量)/虛擬機(jī)棧(java代碼的調(diào)用關(guān)系和局部變量)包含了方法的調(diào)用關(guān)系和局部變量(一般不會(huì)關(guān)注本地方法棧,默認(rèn)只得是虛擬機(jī)棧)此處中的堆和棧和數(shù)據(jù)結(jié)構(gòu)中的堆和棧是不一樣的

(3)程序計(jì)數(shù)器:這個(gè)區(qū)域比較小的空間,專門用來(lái)存儲(chǔ)下一條要執(zhí)行的java指令地址

(4)元數(shù)據(jù)區(qū)(以前叫方法區(qū)):往往只的是一些輔助性質(zhì)的,描述性質(zhì)的屬性(例如:文件大小,文件的位置等,這些信息成為元數(shù)據(jù))最主要的是保存類的信息,方法的信息,一個(gè)程序有哪些類,每個(gè)類里有哪些方法,每個(gè)方法里面要包含哪些指令,我們寫的Java代碼if,while,for各種邏輯運(yùn)算都會(huì)被轉(zhuǎn)換成字節(jié)碼,最后將這些字節(jié)碼存儲(chǔ)到元數(shù)據(jù)區(qū)中,接下來(lái)就會(huì)按照上述元數(shù)據(jù)區(qū)里記錄的字節(jié)碼依次執(zhí)行了,帶有static變量的就是在類對(duì)象中,就存儲(chǔ)在元數(shù)據(jù)區(qū)中

(5)堆只有一份,元數(shù)據(jù)區(qū)只有一份,棧和程序計(jì)數(shù)器可能由N份(每個(gè)線程都有自己的棧和程序計(jì)數(shù)器)

2、JVM的類加載機(jī)制

1、類加載指的是Java進(jìn)程運(yùn)行的時(shí)候,需要把.class文件從硬盤讀到內(nèi)存,并進(jìn)行一系列的校驗(yàn)和解析的過程(從.class文件到類對(duì)象,從硬盤到內(nèi)存)類加載分5步

(1)加載:把硬盤上的.class文件找到打開文件,讀取到文件內(nèi)容(認(rèn)為讀到的是二進(jìn)制數(shù)據(jù))

(2)驗(yàn)證:確保讀到的文件內(nèi)容是合法的.class文件(字節(jié)碼文件)格式

(3)準(zhǔn)備:給類對(duì)象申請(qǐng)內(nèi)存空間(空間內(nèi)什么都沒有,是默認(rèn)值全是零)

(4)解析:主要是針對(duì)類中的字符串常量進(jìn)行處理,字符引用轉(zhuǎn)換成直接引用:比如要存儲(chǔ)字符串s=“hello”

因?yàn)槲募胁淮嬖诘刂愤@樣的概念,地址是內(nèi)存的地址但是我們這里是硬盤,所以我們需要用偏移量(這就叫符號(hào)引用)來(lái)找到文件中的hello,之后我們轉(zhuǎn)換到內(nèi)存上是此時(shí)就有地址(直接引用)了就不需要再用偏移量了

(5)初始化:針對(duì)類對(duì)象完成后續(xù)的初始化(還需要執(zhí)行講臺(tái)代碼的邏輯,還可能出發(fā)父類的加載)

3、雙親委派模型(描述了如何查找.class文件的策略)

1、JVM中進(jìn)行類加載操作,是有一個(gè)專門的模塊,稱為“類加載器”,類加載器的作用,給他一個(gè)全限定類名,java.lang.String給定全限定類名之后找到對(duì)應(yīng)的.class文件,下面是三類加載器,實(shí)際上類加載器只是一個(gè)父親,也可以叫單親

如果最后ApplicationClassLoader沒有找到,因?yàn)锳pplicationClassLoader沒有孩子最后就會(huì)拋出ClassNotFoundException異常

(1)這樣的操作也避免了我們自己寫了類與標(biāo)準(zhǔn)類名重復(fù),導(dǎo)致標(biāo)準(zhǔn)庫(kù)類的功能失效

(2)我們也可以自己寫類加載器,此時(shí)就不會(huì)涉及到雙親委派了

4、垃圾回收機(jī)制(GC)(避免內(nèi)存泄漏問題)

(1)垃圾回收中有一個(gè)很重要的問題:STW問題,出發(fā)垃圾回收的時(shí)候,很可能會(huì)是當(dāng)前程序和其他業(yè)務(wù)暫停,JAVA現(xiàn)在已經(jīng)可以把STW的時(shí)間控制在1ms之內(nèi),影響就很小了

(2)垃圾回收是回收內(nèi)存,程序計(jì)數(shù)器和棧不需要GC他們可以自行釋放內(nèi)存,元數(shù)據(jù)區(qū)一般不需要GC一般涉及到類加載,很少涉及到類卸載,堆是主要的GC區(qū)域(主要的就是回收對(duì)象)

4.1、垃圾回收我們要分兩部展開:

(1)識(shí)別出垃圾(1.1-1.4)

(2)把標(biāo)記為垃圾的對(duì)象的內(nèi)存空間進(jìn)行釋放(2.1-)

識(shí)別出垃圾:

(1.1)在Java中,適用對(duì)象都需要通過引用的方式來(lái)使用(匿名對(duì)象是例外)

如果一個(gè)對(duì)象沒有任何引用指向他,就是為無(wú)法被代碼使用,就可以作為垃圾了

簡(jiǎn)單情況:

(1.2)

當(dāng)我們局部變量t執(zhí)行完,也就沒有引用指向new Test()了此時(shí)new Test()就被認(rèn)定成垃圾了

較復(fù)雜的情況(1.3)(1.4):

(1.3)引用計(jì)數(shù):這種思想方法,并沒有在JVM中使用,但是他的思想我們需要了解(給對(duì)象安排一個(gè)額外的空間,空間里要保存當(dāng)前這個(gè)對(duì)象有多少個(gè)引用)

垃圾回收的時(shí)候,如果發(fā)現(xiàn)他的引用計(jì)數(shù)器為0了就定義為垃圾

引用計(jì)數(shù)器存在兩個(gè)關(guān)鍵問題:

1)消耗額外的內(nèi)存空間

2)引用計(jì)數(shù)可能產(chǎn)生循環(huán)引用問題,此時(shí)引用計(jì)數(shù)就無(wú)法工作了,這個(gè)問題就是可能會(huì)兩個(gè)對(duì)象在內(nèi)部分別對(duì)對(duì)方進(jìn)行引用,導(dǎo)致計(jì)數(shù)器一直不為零

(1.4)可達(dá)性分析:本質(zhì)上使用時(shí)間換空間,相比于引用計(jì)數(shù),需要消耗額外的時(shí)間,是可控的,不會(huì)長(zhǎng)生循環(huán)引用的問題,例如二叉樹那樣遍歷訪問,訪問不到的就是垃圾

(2.1)把標(biāo)記為垃圾的對(duì)象進(jìn)行內(nèi)存空間的釋放

(2.2)標(biāo)記-清除

(2.3)復(fù)制算法

將左邊不是垃圾的對(duì)象復(fù)制到內(nèi)存的另一邊(內(nèi)存碎片問題沒了,但是使用的空間小了,而且如果數(shù)據(jù)很多復(fù)制兩會(huì)很大,會(huì)增加很多開銷)

(2.4)標(biāo)記-整理,也能解決內(nèi)存碎片問題

將后面的元素往前移將釋放的垃圾覆蓋掉,能解決內(nèi)存碎片問題,但是移動(dòng)復(fù)制成本依然很大

(2.5)分代回收(取長(zhǎng)補(bǔ)短,非常好的回收方式,現(xiàn)在應(yīng)用的 )

引入對(duì)象的年齡,JVM中有專門負(fù)責(zé)周期想掃面的線程,一個(gè)對(duì)象掃描一次,能掃描到就不是垃圾,年齡加1,不能掃描到就直接釋放掉

第一輪掃描在伊甸區(qū)會(huì)有很多對(duì)象被消滅掉,剩下的線程年齡加1,轉(zhuǎn)移到生存區(qū),第二輪掃描伊甸區(qū)和上一輪一樣,生存區(qū)左邊掃描去掉大部分剩下的年齡加1轉(zhuǎn)移到生存區(qū)的右邊,如果經(jīng)過若干輪的對(duì)象仍然健在,之后我們就轉(zhuǎn)移到老年區(qū),老年區(qū)不是不掃描,老年區(qū)的掃描頻率會(huì)降低很多,如果掃描到為引用的對(duì)象直接也消滅掉掉

柚子快報(bào)邀請(qǐng)碼778899分享:java JVM的深入理解

http://yzkb.51969.com/

好文閱讀

評(píng)論可見,查看隱藏內(nèi)容

本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場(chǎng)。

轉(zhuǎn)載請(qǐng)注明,如有侵權(quán),聯(lián)系刪除。

本文鏈接:http://m.gantiao.com.cn/post/19185699.html

發(fā)布評(píng)論

您暫未設(shè)置收款碼

請(qǐng)?jiān)谥黝}配置——文章設(shè)置里上傳

掃描二維碼手機(jī)訪問

文章目錄