1.JVM三個主要子系統(tǒng):類加載子系統(tǒng)诀浪,運行時數(shù)據(jù)區(qū)棋返,執(zhí)行引擎
2.類加載子系統(tǒng):加載、驗證雷猪、準(zhǔn)備睛竣、解析、初始化求摇、使用射沟、卸載
加載:將class文件從磁盤督導(dǎo)內(nèi)存
驗證:驗證字節(jié)碼文件的正確性
準(zhǔn)備:給類的靜態(tài)變量分配內(nèi)存并賦予默認值
解析:類加載器裝入類所引用的其他所有類
初始化:為類的靜態(tài)變量賦予正確的初始值,執(zhí)行類的靜態(tài)代碼塊
3.類加載器種類:①啟動類加載器(Bootstrap Classloader)負責(zé)加載JRE的核心類庫②擴展類加載器(Extension Classloader)負責(zé)加載JRE擴展ext目錄下的包③系統(tǒng)類加載器(Application Classloader)負責(zé)加載classpath路徑下的類包④用戶自定義類加器(User classloader)負責(zé)加載用戶自定義路徑下的類包与境。
4.類加載機制:全盤負責(zé)委托機制验夯、雙親委派機制
全盤負責(zé)委托機制:當(dāng)一個classLoader加載一個類的時候,除非顯示的使用另一個classLoader該類所依賴和引用的類也是用它加載摔刁。
雙親委派機制:指先委托父類加載器尋找目標(biāo)類簿姨,在找不到的情況下再自己的路徑中查找并加載。優(yōu)勢:①沙箱安全機制:比如自己寫的String.class類不會被加載簸搞,這樣可以防止核心類庫被修改②避免類的重復(fù)加載:當(dāng)父classloader已經(jīng)加載了改類的時候,就不需要子類再去加載了准潭。
5.判斷對象是否可用的方法:①引用計數(shù)法:缺點無法解決對象循環(huán)引用的問題②可達性分析算法:通過一系列的成為"GC Roots的對象作為起點趁俊,從這些節(jié)點開始向下搜索,節(jié)點所走過的路徑刑然,當(dāng)一個對象到GC Roots沒有任何引用鏈相連時寺擂,則證明此對象是不可用的。GC Roots根節(jié)點:類加載器泼掠、Thread怔软、虛擬機棧的局部變量表、static成員择镇、常量引用挡逼、本地方法棧的常量等等。
6.如何判斷一個常量是廢棄常量腻豌?
運行時常量池主要回收的是廢棄的常量家坎,那么,我們怎么判斷一個常量是廢棄常量吝梅?假如在常量池中存在字符串"abc",如果當(dāng)前沒有任何string對象引用該字符串常量的話虱疏,就說明常量abc就是廢棄常量。
7.如何判斷一個類是無用的類苏携?
滿足三個條件:①該類的所有實例都已經(jīng)被回收做瞪,也就是java堆中不存在該類的任何實例②加載該類的classLoader已經(jīng)被回收③該類對應(yīng)的java.lang.Class對象沒有字任何地方被引用,無法在任何地方通過反射訪問該類的方法右冻。使類復(fù)活可以重寫finalize()方法装蓬,只能自救一次著拭。
8、垃圾回收算法:①復(fù)制算法(from,to區(qū)使用)②標(biāo)記-清除算法(eden區(qū)使用)③標(biāo)記整理算法(老年代使用)④分代收集算法
9.CMS垃圾收集器
9.怎么選擇垃圾收集器矛物?
①優(yōu)先調(diào)整堆的大小讓服務(wù)器自己來選擇②如果內(nèi)存小于100m,使用串行收集器③如果是單核茫死,并且沒有停頓時間的要求,串行或讓JVM自己來選擇④如果允許停頓時間超過1秒履羞,選擇并行或者JVM自己選擇⑤如果響應(yīng)時間最重要峦萎,并且不能超過1秒,使用并發(fā)收集器忆首。