黄色网址大全免费-黄色网址你懂得-黄色网址你懂的-黄色网址有那些-免费超爽视频-免费大片黄国产在线观看

專(zhuān)注Java教育14年 全國(guó)咨詢(xún)/投訴熱線:400-8080-105
動(dòng)力節(jié)點(diǎn)LOGO圖
始于2009,口口相傳的Java黃埔軍校
首頁(yè) hot資訊 深入了解Java虛擬機(jī)

深入了解Java虛擬機(jī)

更新時(shí)間:2021-05-07 11:40:57 來(lái)源:動(dòng)力節(jié)點(diǎn) 瀏覽1206次

1.為什么要學(xué)習(xí)Java虛擬機(jī)?

這里我們使用舉例來(lái)說(shuō)明為什么要學(xué)習(xí)Java虛擬機(jī),其實(shí)這個(gè)問(wèn)題就和為什么要學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)和算法是一個(gè)道理,工欲善其事,必先利其器。曾經(jīng)的我經(jīng)常害怕處理內(nèi)存溢出的問(wèn)題,因?yàn)椴恢浪麨槭裁磿?huì)出現(xiàn)這個(gè)問(wèn)題,當(dāng)我在看了這本書(shū)以后明白了垃圾回收算法,以及JVM是如何幫助我們處理GC的,這個(gè)時(shí)候當(dāng)出現(xiàn)這個(gè)問(wèn)題的時(shí)候我就明白需要查找GC Root,或者查看GC日志,去查找這個(gè)問(wèn)題的根源,這樣就能處理這些問(wèn)題。還有以前的在理解重載和重構(gòu)的時(shí)候只是在表面去理解,當(dāng)我看完這本書(shū)明白,原來(lái)在方法調(diào)用時(shí)候這些東西就生成處理,另外還有一個(gè)new到底經(jīng)歷那些事情等等一序列問(wèn)題,如果你還在就糾結(jié)一些問(wèn)題為什么是這么處理的時(shí)候那你就去看Java虛擬機(jī)吧,或許會(huì)有不一樣的感悟,以上就是為什么要學(xué)習(xí)Java虛擬機(jī)的原因。

2.需要了解哪些方面?

這里面我們來(lái)談一下GC,要探討這個(gè)問(wèn)題我們需要從3個(gè)方面入手:

(1)JVM是如何分配內(nèi)存的?

1)線程計(jì)數(shù)器,是一塊較小的內(nèi)存空間,用來(lái)指定當(dāng)前線程執(zhí)行字節(jié)碼的行數(shù),每個(gè)線程計(jì)數(shù)器都是私有的,因?yàn)槊總€(gè)線程都需要記錄執(zhí)行的行數(shù);這里解釋一下為什么每個(gè)線程都需要一個(gè)線程計(jì)數(shù)器,JVM的多線程是通過(guò)線程輪流切換分配執(zhí)行時(shí)間來(lái)實(shí)現(xiàn)的,在任何時(shí)刻,每個(gè)處理器都只會(huì)執(zhí)行一個(gè)線程中的指令,當(dāng)線程進(jìn)行切換的時(shí),為了線程能恢復(fù)當(dāng)正確的位置,所以每個(gè)線程必須有個(gè)獨(dú)立的線程計(jì)數(shù)器,這樣才能保證線程之間不互相影響。

這里注意下,如果線程執(zhí)行是一個(gè)Java方法的時(shí)候,計(jì)數(shù)器記錄的是虛擬機(jī)字節(jié)碼指令的地址;當(dāng)執(zhí)行的是Native的方法的時(shí)候,計(jì)數(shù)器指令為空;該內(nèi)存區(qū)域是Java虛擬機(jī)唯一沒(méi)有規(guī)定任何OutOfMemoryError的區(qū)域。

2)Java虛擬棧,這個(gè)也是一個(gè)線程私有的,生命周期與線程是同步的,每個(gè)方法在執(zhí)行的同時(shí),都會(huì)創(chuàng)建一個(gè)棧幀,用于存儲(chǔ)局部變量表,操作數(shù)棧,動(dòng)態(tài)鏈接,方法出入口等信息,每個(gè)方法的調(diào)用到執(zhí)行完成的過(guò)程就是一個(gè)棧幀入棧到出棧的過(guò)程;

這里解釋一下局部變量表,局部變量表存儲(chǔ)方法相關(guān)的局部變量,包括基本數(shù)據(jù),對(duì)象引用和返回地址等。在局部變量表中,只有l(wèi)ong和double類(lèi)型會(huì)占用2個(gè)局部變量空間(Slot,對(duì)于32位機(jī)器,一個(gè)Slot就是32個(gè)bit),其它都是1個(gè)Slot。需要注意的是,局部變量表是在編譯時(shí)就已經(jīng)確定好的,方法運(yùn)行所需要分配的空間在棧幀中是完全確定的,在方法的生命周期內(nèi)都不會(huì)改變。這部分東西我還想等下一篇博客的時(shí)候我想仔細(xì)說(shuō)一下字節(jié)碼的執(zhí)行過(guò)程;

虛擬機(jī)棧規(guī)定了2種異常情況,一種是線程請(qǐng)求棧的深度大于虛擬機(jī)棧所允許的深度,這時(shí)候?qū)?huì)拋出StackOverflowError異常,如果當(dāng)Java虛擬機(jī)允許動(dòng)態(tài)擴(kuò)展虛擬機(jī)棧的時(shí)候,當(dāng)擴(kuò)展的時(shí)候沒(méi)辦法分配到內(nèi)存的時(shí)候就會(huì)報(bào)OutOfMemoryError異常;

3)本地方法棧,與虛擬機(jī)棧執(zhí)行的基本相同,唯一的區(qū)別就是虛擬機(jī)棧是執(zhí)行Java方法的,本地方法棧是執(zhí)行native方法的;

4)Java堆,堆區(qū)是Java虛擬機(jī)所管理的內(nèi)存中最大的一塊,Java堆是被所有線程共享的內(nèi)存區(qū)域,主要存儲(chǔ)對(duì)象的實(shí)例。

當(dāng)堆中沒(méi)有內(nèi)存完成實(shí)例分配,并且堆無(wú)法擴(kuò)展的時(shí)候,將會(huì)拋出OutOfMemoryError異常;當(dāng)前虛擬機(jī)都是可以擴(kuò)展的;

5)方法區(qū),這個(gè)也是線程共享的內(nèi)存區(qū)域,存儲(chǔ)被虛擬機(jī)加載的類(lèi)信息、常量、靜態(tài)變量、即時(shí)編譯的代碼數(shù)據(jù)等;

方法區(qū)在物理上也是不需要連續(xù)的,可以選擇固定大小或者擴(kuò)展的大小,還可以選擇不實(shí)現(xiàn)垃圾收集,方法區(qū)的垃圾回收是比較少的,這就是方法區(qū)為什么被稱(chēng)為永久區(qū)的原因,但是方法區(qū)也是可以執(zhí)行回收的,該區(qū)域主要是針對(duì)常量池和類(lèi)型的卸載;在方法區(qū)也規(guī)定當(dāng)方法區(qū)無(wú)法滿足內(nèi)存分布的時(shí)候,將會(huì)拋出OutOfMemoryError異常;

運(yùn)行時(shí)常量是方法區(qū)的一部分,常量池主要用于存放編譯生成的各種字面量和符合引用,由于常量池屬于方法區(qū)的一部分,所以當(dāng)常量池沒(méi)有內(nèi)存空間的時(shí)候就拋出OutOfMemoryError異常;

6)直接內(nèi)存,不是虛擬機(jī)運(yùn)行時(shí)的一部分,可以直接訪問(wèn)堆外的內(nèi)存;所以當(dāng)內(nèi)存空間無(wú)法動(dòng)態(tài)擴(kuò)展的時(shí)候就會(huì)出現(xiàn)OutOfMemoryError異常;

以上基本是JVM內(nèi)存分布的內(nèi)容,簡(jiǎn)單的理解水滿則溢出就是這個(gè)道理,系統(tǒng)的整個(gè)空間是一個(gè)大的容器,分不同的部分或者桶去分擔(dān)整個(gè)容量,當(dāng)那個(gè)桶不夠的時(shí)候自然會(huì)溢出。

(2)如何才能保證正確的回收?

回收是已經(jīng)沒(méi)有用的對(duì)象,那怎么判斷一個(gè)對(duì)象沒(méi)用引用?這里需要簡(jiǎn)單介紹2種方法:引用計(jì)數(shù)法和可達(dá)性分析算法;

這里簡(jiǎn)單說(shuō)一下引用計(jì)數(shù)法:對(duì)象中添加一個(gè)引用計(jì)數(shù)器,每當(dāng)有一個(gè)地方引用計(jì)數(shù)器就增加1,引用失效就減少1,計(jì)數(shù)器為0就不可用;缺點(diǎn)就在于無(wú)法處理對(duì)象直接相互引用的問(wèn)題,因?yàn)橄嗷ヒ靡院鬅o(wú)法使計(jì)數(shù)器為0,所以無(wú)法回收;

可達(dá)性分析算法,也就是我們常說(shuō)的GC Root,,當(dāng)一個(gè)對(duì)象沒(méi)有與任何引用鏈相連的時(shí)候,就可以對(duì)該對(duì)象進(jìn)行回收

(3)JVM什么情況下觸發(fā)GC以及GC的方式?

當(dāng)內(nèi)存空間不足的時(shí)候就需要觸發(fā)GC,GC回收的時(shí)候采用的是分代收集的算法,主要分為年輕代和老年代,接下來(lái)我們簡(jiǎn)單介紹一下這2種方式:

年輕代:當(dāng)一個(gè)對(duì)象被創(chuàng)建的時(shí)候,內(nèi)存分配首先分配在年輕代,大部分對(duì)象創(chuàng)建以后都不再使用,對(duì)象很快變得不可達(dá),就是對(duì)象無(wú)用,由于垃圾是被年輕代清理掉的,所以被叫做Minor GC或者Young GC。

老年代:對(duì)象如果在年輕代存活了足夠長(zhǎng)的時(shí)間而沒(méi)有被清理掉(即在幾次Young GC后存活了下來(lái)),則會(huì)被復(fù)制到年老代,年老代的空間一般比年輕代大,能存放更多的對(duì)象,在年老代上發(fā)生的GC次數(shù)也比年輕代少。當(dāng)年老代內(nèi)存不足時(shí),將執(zhí)行Major GC,也叫 Full GC。

以上就是動(dòng)力節(jié)點(diǎn)小編介紹的"深入了解Java虛擬機(jī)"的內(nèi)容,希望對(duì)大家有幫助,如有疑問(wèn),請(qǐng)?jiān)诰€咨詢(xún),有專(zhuān)業(yè)老師隨時(shí)為您服務(wù)。

提交申請(qǐng)后,顧問(wèn)老師會(huì)電話與您溝通安排學(xué)習(xí)

免費(fèi)課程推薦 >>
技術(shù)文檔推薦 >>
主站蜘蛛池模板: 中国美女一级a毛片录像在线 | 岛国在线播放v片免费 | 亚洲国产成人va在线观看 | 久久99国产精品久久 | 成人a视频片在线观看免费 成人a视频高清在线观看 | 亚洲综合图片网 | 456亚洲人成影院在线观 | 日韩大片免费观看 | 欧美a级片在线观看 | 国产成人综合日韩精品无 | 男女羞羞视频免费看 | 二区在线视频 | 免费国产不卡午夜福在线观看 | 国内欧美一区二区三区 | 亚洲一区在线视频观看 | 欧美成人一区二区三区 | 欧美老妇人与禽交 | 成人网视频 | 伊人网久久网 | 人成在线 | 成年网站在线看 | 中日韩精品视频在线观看 | www.色网 | 欧美手机在线视频 | 影音先锋激情 | 日本一区二区在线视频 | 高清一区二区亚洲欧美日韩 | 欧美一区二区三区高清视频 | 天天艹天天艹 | 欧美高清在线视频一区二区 | 一级黄色片在线看 | 亚洲黄色第一页 | 黄色在线播放网站 | 日韩手机在线视频 | 欧美日韩在线观看精品 | 午夜影院黄 | 免费性网站| 久久国产精品亚洲一区二区 | 最近2019中文字幕大全7 | 国产精品12页 | 在线亚洲一区 |