面試題

JVM

作者:EnjoyMoving
鏈接:https://www.zhihu.com/question/27339390/answer/204653701
來源:知乎
著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請(qǐng)注明出處。
Java的虛擬機(jī)的面試內(nèi)容主要包括三部分:GC、類加載機(jī)制,以及內(nèi)存?! ?br> 一個(gè)GC部分簡(jiǎn)單的連環(huán)炮。面試官可以先問你什么時(shí)候一個(gè)對(duì)象會(huì)被GC?  
接著繼續(xù)問你為什么要在這種時(shí)候?qū)ο蟛艜?huì)被GC?  
接著繼續(xù)問你GC策略都有哪些分類?  
你如果說出來了,繼續(xù)問你這些策略分別都有什么優(yōu)劣勢(shì)?都適用于什么場(chǎng)景?  
你繼續(xù)說出來了以后,給你舉個(gè)實(shí)際的場(chǎng)景,讓你選擇一個(gè)GC策略?  你如果選出來了,繼續(xù)問你,為什么要選擇這個(gè)策略?下面是關(guān)于類加載機(jī)制的簡(jiǎn)單連環(huán)炮。首先肯定是先問你Java的類加載器都有哪些?  
回答了這些以后,可能會(huì)問你每個(gè)類加載器都加載哪些類?  
說完以后,可能會(huì)問你這些類加載之間的父子關(guān)系是怎樣的?  
你在回答的時(shí)候可能會(huì)提到雙親委派模型,那么可以繼續(xù)問你什么是雙親委派模型?  
你解釋完了以后,可能會(huì)繼續(xù)問你,為什么Java的類加載器要使用雙親委派模型?  
你回答完以后,可能會(huì)繼續(xù)問你如何自定義自己的類加載器,自己的類加載器和Java自帶的類加載器關(guān)系如何處理?再來一個(gè)關(guān)于內(nèi)存的連環(huán)炮。首先肯定就是問你JVM內(nèi)存分為哪幾部分,這些部分分別都存儲(chǔ)哪些數(shù)據(jù)?  
然后繼續(xù)問你一個(gè)對(duì)象從創(chuàng)建到銷毀都是怎么在這些部分里存活和轉(zhuǎn)移的?  
接著可能會(huì)問你,內(nèi)存的哪些部分會(huì)參與GC的回收?  
完事以后,可能還會(huì)問你Java的內(nèi)存模型是怎么設(shè)計(jì)的?  
你回答了以后,還會(huì)繼續(xù)問你為什么要這么設(shè)計(jì)?  
問完以后,還可能會(huì)讓你結(jié)合內(nèi)存模型的設(shè)計(jì)談?wù)剉olatile關(guān)鍵字的作用?  
你在談的時(shí)候,肯定會(huì)提到可見性,那么接著可見性這三個(gè)字,還可以繼續(xù)問你并發(fā)的內(nèi)容。

JVM是一種用于計(jì)算設(shè)備的規(guī)范,它是一個(gè)虛構(gòu)出來的計(jì)算機(jī)。

Java語言使用Java虛擬機(jī)屏蔽了與具體平臺(tái)相關(guān)的信息,使得Java語言編譯程序只需生成在Java虛擬機(jī)上運(yùn)行的目標(biāo)代碼(字節(jié)碼)。

Java 虛擬機(jī)執(zhí)行字節(jié)碼的,把字節(jié)碼解釋成具體平臺(tái)上的機(jī)器指令(機(jī)器碼)執(zhí)行。

字節(jié)碼

.class 文件就是字節(jié)碼,包含虛擬機(jī)指令、程序和數(shù)據(jù)片段的二進(jìn)制指令。

為什么叫字節(jié)碼?因?yàn)檫@種類型的代碼以一個(gè)字節(jié)8bit為最小單位儲(chǔ)存。

字節(jié)碼存儲(chǔ)

Class文件格式采用一種類似于C語言結(jié)構(gòu)體的偽結(jié)構(gòu)來存儲(chǔ)數(shù)據(jù),這種偽結(jié)構(gòu)只有2種數(shù)據(jù)類型:無符號(hào)數(shù)和表。

類加載過程

https://zhuanlan.zhihu.com/p/44670213

Java的虛擬機(jī)的面試內(nèi)容主要包括三部分:GC、類加載機(jī)制,以及內(nèi)存。

GC (garbage collection)

  1. 對(duì)象產(chǎn)生過程?

  2. 什么時(shí)候一個(gè)對(duì)象會(huì)被GC?
    http://m.itdecent.cn/p/b1b6eecb6224
    http://m.itdecent.cn/p/4a04fc2a33da

有兩種判斷方式,一種是引用計(jì)數(shù),一種是可達(dá)性算法。

  1. 引用計(jì)數(shù)存在循環(huán)引用,java 沒有采用。
  2. 正向可達(dá)的方式
    通過Roots對(duì)象作為起點(diǎn)進(jìn)行搜索,搜索走過的路徑稱為“引用鏈”,當(dāng)一個(gè)對(duì)象到 Roots 沒有任何的引用鏈相連時(shí)時(shí),證明此對(duì)象不可用

面試常問的問題,Roots對(duì)象有哪些?

  • 引用棧幀中的本地變量表的所有對(duì)象;
  • 引用方法區(qū)中靜態(tài)屬性的所有對(duì)象;
  • 引用方法區(qū)中常量的所有對(duì)象;
  • 引用Native方法的所有對(duì)象。

當(dāng)可達(dá)性算法標(biāo)記一個(gè)對(duì)象將被回收時(shí)候,若對(duì)象覆蓋了finalize() 方法,則會(huì)執(zhí)行 finalize() 方法(若已經(jīng)執(zhí)行過,則不執(zhí)行)。隨后對(duì)象會(huì)被放置到 F-Queue 的隊(duì)列中,由一個(gè)低優(yōu)先級(jí)的線程執(zhí)行。稍后GC將對(duì)F-Queue中的對(duì)象進(jìn)行第二次小規(guī)模的標(biāo)記。若在finalize方法中,對(duì)象重新建立鏈接,則移除 F-Queue 對(duì)象。

  1. 為什么要在這種時(shí)候?qū)ο蟛艜?huì)被GC?
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容