1.什么是JVM?
Java文件à字節(jié)碼(.class file)à虛擬機(jī)加載.class文件饥瓷,翻譯成0101碼àjvm在Windows和linux的版本不同(還是平臺(tái)有關(guān)的正林,可移植性有jvm實(shí)現(xiàn))
JVM的功能
-軟件層面的翻譯醉拓,映射了人可以認(rèn)知的代碼蕾总,即class文件到機(jī)器指令
-內(nèi)存管理囤屹,可以讓人專注于業(yè)務(wù)代碼(對(duì)比c++,要申請(qǐng)釋放空間笑跛,java幫我們做了這件事付魔,內(nèi)存管理)
JVM學(xué)習(xí)的必要:
??內(nèi)存管理中內(nèi)存泄露溢出的時(shí)候要了解jvm
2.運(yùn)行時(shí)數(shù)據(jù)區(qū)
為什么要講運(yùn)行時(shí)數(shù)據(jù)區(qū):描述了java代碼在運(yùn)行時(shí)的狀態(tài)
分區(qū):數(shù)據(jù) 指令
數(shù)據(jù):方法區(qū)heap
程序計(jì)數(shù)器:當(dāng)前線程正在執(zhí)行的字節(jié)碼的地址 行號(hào)(為什么要記錄下來當(dāng)前指令?因?yàn)镃PU執(zhí)行線程通過時(shí)間片飞蹂,線程可能被搶占掛起几苍,當(dāng)前的指令不一定可以執(zhí)行完成,所以要保存下來)
虛擬機(jī)棧:存儲(chǔ)當(dāng)前線程運(yùn)行方法所需要的指令陈哑,數(shù)據(jù)妻坝,返回地址
???????????????????? 進(jìn)出虛擬機(jī)棧的最小單元叫棧幀(主要是局部變量,操作數(shù)棧惊窖,動(dòng)態(tài)刽宪,出口)
本地方法棧
方法區(qū): 類信息,常量界酒,靜態(tài)變量圣拄,JIT(即時(shí)編譯,動(dòng)態(tài)代理毁欣,動(dòng)態(tài)生成類的時(shí)候會(huì)生成class文件加載到j(luò)vm中)(靜態(tài)變量以及常量為什么存儲(chǔ)在堆中庇谆?)
Heap:內(nèi)存模型JMM
三代(新生代,老年代署辉,永久代)
為什么分為三代族铆?:
Metaspace規(guī)避了永久代會(huì)溢出的問題,可以自己動(dòng)態(tài)擴(kuò)容哭尝。不屬于堆哥攘。它的不足是無限擴(kuò)容,堆外內(nèi)存太大。所以需要對(duì)其進(jìn)行管制逝淹,定義metaspace的大小耕姊。
新生代為什么是8:1:1?新生代里的回收算法是復(fù)制回收算法(把空間分為2塊栅葡,一塊分配空間使用茉兰,另一塊不分配⌒来兀回收時(shí)將無法刪除的放入另一塊规脸,其他的刪除。)實(shí)踐出真知 熊咽,通過統(tǒng)計(jì)學(xué)莫鸭,對(duì)象的生命周期不同,用分代方式分配空間横殴。而98%的對(duì)象被因,在一次minor gc的過程中就會(huì)被回收,不能回收就放到s1衫仑。所以分為811梨与,可以利用的空間就有90%。Eden8M,s01M中一次minor gc后存活的對(duì)象基本都會(huì)被放到s1M文狱。
如果s1放不下粥鞋,分配擔(dān)保,老年代給出空間如贷。
新生代與老年代是1:2
什么樣的對(duì)象應(yīng)當(dāng)被GC陷虎?
-判斷算法:引用計(jì)數(shù)法(循環(huán)引用,A引用B杠袱,B引用A尚猿,計(jì)數(shù)不是0是1,所以jvm沒有使用引用計(jì)數(shù)法)楣富,可達(dá)性分析(GCroot指向A凿掂,A指向B)
如果從GCRoot可以有路徑到達(dá),則不回收纹蝴,若有獨(dú)立的節(jié)點(diǎn)庄萎,如C則,回收塘安。
哪些可以成為GCroot糠涛?
為什么可以成為GCroot?因?yàn)樵贕C的時(shí)候兼犯,線程在運(yùn)行某個(gè)方法忍捡,所有變量都不被回收集漾。而GCRoot本身要求自己不會(huì)被回收,所以可以做GCroot砸脊。
不可達(dá)是不是一定會(huì)被回收具篇?新生代與老年代有交叉。不是凌埂,finalize()可以在下次GC之前進(jìn)行挽救(使用GCroot指向?qū)⒒厥盏墓?jié)點(diǎn))
靜態(tài)變量如何回收驱显?靜態(tài)變量在方法區(qū)。
運(yùn)行方法時(shí)要壓棧瞳抓,(可能調(diào)用多次方法棧)