一歌懒、jvm是什么?
jvm:Java Virtual Machine及皂,Java虛擬機(jī)
JVM是JRE的一部分躲庄。它是一個(gè)虛構(gòu)出來的計(jì)算機(jī),是通過在實(shí)際的計(jì)算機(jī)上仿真模擬各種計(jì)算機(jī)功能來實(shí)現(xiàn)的噪窘。JVM有自己完善的硬件架構(gòu),如處理器倔监、堆棧浩习、寄存器等,還具有相應(yīng)的指令系統(tǒng)谱秽。Java語言最重要的特點(diǎn)就是跨平臺(tái)運(yùn)行疟赊。使用JVM就是為了支持與操作系統(tǒng)無關(guān),實(shí)現(xiàn)跨平臺(tái)驮审。所以,JAVA虛擬機(jī)JVM是屬于JRE的地来,而現(xiàn)在我們安裝JDK時(shí)也附帶安裝了JRE(當(dāng)然也可以單獨(dú)安裝JRE)
二熙掺、jvm包括哪些東西?
java是運(yùn)行在java虛擬機(jī)中(jvm)颂碧,首先我們寫的.java文件會(huì)編譯成 .class字節(jié)碼文件类浪,然后通過類加載器將這些文件加載到j(luò)vm中费就;
類加載器(classLoad)與雙親委派機(jī)制
jvm提供了三層classLoader:(這些加載器并不是父子關(guān)系)
(1)啟動(dòng)類(根)加載器 :bootstrap ClassLoader :主要是負(fù)責(zé)加載核心的類庫(java.lang.*等),構(gòu)造ExtClassLoader和AppClassLoader;
(2)ExtClassLoader: 擴(kuò)展類加載器: 主要負(fù)責(zé) jre/lib/ext/目錄下的一些擴(kuò)展jar;
(3) AppClassLoader: 加載應(yīng)用程序的主函數(shù)睬澡;雙親委派機(jī)制
(1)當(dāng)一個(gè)Hello.class這樣的文件要被加載時(shí)眠蚂。不考慮我們自定義類加載器,首先會(huì)在AppClassLoader中檢查是否加載過昔脯,如果有那就無需再加載了笛臣。如果沒有,那么會(huì)拿到父加載器静陈,然后調(diào)用父加載器的loadClass方法诞丽。父類中同理也會(huì)先檢查自己是否已經(jīng)加載過率拒,如果沒有再往上。注意這個(gè)類似遞歸的過程,直到到達(dá)Bootstrap classLoader之前,都是在檢查是否加載過谒所,并不會(huì)選擇自己去加載沛申。直到BootstrapClassLoader,已經(jīng)沒有父加載器了尖淘,這時(shí)候開始考慮自己是否能加載了著觉,如果自己無法加載,會(huì)下沉到子加載器去加載趁桃,一直到最底層肄鸽,如果沒有任何加載器能加載典徘,就會(huì)拋出ClassNotFoundException。
(2)那么為什么要有這種機(jī)制呢逮诲?
答:其實(shí)是為了防止篡改系統(tǒng)級(jí)別的類汛骂,比如 想要篡改 java.lang.String ,這個(gè)類,那么加載的時(shí)候 首先就會(huì)被 啟動(dòng)類加載器加載淑掌,在一定意義上保證了安全
運(yùn)行時(shí)數(shù)據(jù)(jvm)包括哪些蝶念?
(1) 方法區(qū):存放所有字段 和方法字節(jié)碼以及一些 特殊方法如構(gòu)造函數(shù) 媒殉,接口代碼; 靜態(tài)變量全封、常量、類模板信息(靜態(tài)屬性刹悴,參數(shù)土匀,構(gòu)造方法等)、運(yùn)行時(shí)字符串就轧,也就是常量池妒御;線程共享
(2)棧:一個(gè)線程一個(gè)棧,先進(jìn)后出琢歇,線程結(jié)束就釋放梦鉴;保存基礎(chǔ)數(shù)據(jù)類型的值和對(duì)象以及基礎(chǔ)數(shù)據(jù)的引用;棧分為3個(gè)部分:基本類型變量區(qū)魄宏、執(zhí)行環(huán)境上下文宠互、操作指令區(qū)(存放操作指令)椭坚。
(3)本地方法棧:同棧差不多,也是每執(zhí)行一個(gè)方法善茎,建立一個(gè)棧幀券册,是為執(zhí)行native方法所服務(wù)的,native方法是去調(diào)用底層c語言的庫垂涯;
(4)程序計(jì)數(shù)器 :是一個(gè)記錄著當(dāng)前線程所執(zhí)行的字節(jié)碼的行號(hào)指示器烁焙;
(5)堆:存放的是對(duì)象的地址
堆的組成
- jdk1.6: 包括新生代、老年代耕赘、永久代
- jdk1.7: 包括新生代骄蝇、老年代、永久代操骡,但是永久代慢慢消失九火,方法區(qū)是存在永久代
- jdk1.8 :包括新生代赚窃、老年代、元空間考榨,方法區(qū)是放在元空間跨细,其實(shí)元空間和堆是分開的鹦倚,但是他們共享物理內(nèi)存,所以有時(shí)候也說堆包含元空間冀惭;
(1). 98%的對(duì)象是在新生區(qū)死亡的其中新生代又包括 伊甸園區(qū)(eden)震叙、from、to 散休;這樣做的好處是沒有內(nèi)存的碎片媒楼,幻術(shù)師 浪費(fèi)了內(nèi)存空間,多了一半空間永遠(yuǎn)是空戚丸;當(dāng)伊甸園區(qū)滿了之后划址,會(huì)進(jìn)行輕GC將遺留下來的對(duì)象放入from,當(dāng)from滿了之后,會(huì)放入to區(qū),這時(shí)候限府,to區(qū)變成from區(qū)夺颤,from區(qū)變成to區(qū),這樣反復(fù)之后當(dāng)新生區(qū)滿了之后胁勺,會(huì)進(jìn)行重GC(full GC) 將存活的對(duì)象放入老年代世澜;
(2). 持久代存放的是老年代活下來的對(duì)象,它放的是方法區(qū)和常量池署穗,存放靜態(tài)變量寥裂、常量、類信息案疲、運(yùn)行時(shí)的常量池封恰;
(3) 當(dāng)一個(gè)對(duì)象經(jīng)歷15次gc還沒死,就會(huì)進(jìn)入老年代褐啡;
-XX: -XX:MaxTenuring Threshold=999 //設(shè)置進(jìn)入老年代的時(shí)間
oom的分析工具 MAT诺舔、JProfiler
GC(垃圾回收) 運(yùn)用到的算法
如何找到垃圾: 引用計(jì)數(shù)法
(1)復(fù)制算法:將有用的對(duì)象復(fù)制到另一邊,將剩下的都清理掉春贸,適合對(duì)象少混萝,優(yōu)點(diǎn)是效率高,但是浪費(fèi)空間萍恕;(適合年輕代)
(2)標(biāo)記清除法 :先掃描一遍逸嘀,將不要的對(duì)象標(biāo)記一下,再次掃描允粤,清除不要的對(duì)象崭倘; 缺點(diǎn):兩次掃描翼岁,嚴(yán)重浪費(fèi)時(shí)間,會(huì)產(chǎn)生空間碎片司光,優(yōu)點(diǎn):不需要額外的空間’琅坡,適合對(duì)象多
(3)標(biāo)記壓縮法:也是掃描兩次,第一次先標(biāo)記不用的残家,第二次進(jìn)行清理壓縮榆俺,效率比較低,但是沒有空間碎片
JMM :Java Memory Model
是什么坞淮?
是干嘛的茴晋?
JMM是和多線程相關(guān)的,他描述了一組規(guī)則或規(guī)范回窘,這個(gè)規(guī)范定義了一個(gè)線程對(duì)共享變量的寫入時(shí)對(duì)另一個(gè)線程是可見的诺擅。
如何學(xué)習(xí)?