篇幅的原因,面試答案分次發(fā)送。
一、請介紹一下JVM內存模型??用過(guò)什么垃圾回收器都說(shuō)說(shuō)唄!
1.JVM內存模型:棧和堆
a.棧:Java棧是與每一個(gè)線(xiàn)程關(guān)聯(lián)的,JVM在創(chuàng )建每一個(gè)線(xiàn)程的時(shí)候,會(huì )分配一定的??臻g給線(xiàn)程。存儲局部變量、引用、方法、返回值等。
StackOverflowError:如果在線(xiàn)程執行的過(guò)程中,??臻g不夠用,那么JVM就會(huì )拋出此異常,這種情況一般是死遞歸造成的。
b.堆:Java中堆是由所有的線(xiàn)程共享的一塊內存區域,堆用來(lái)保存各種JAVA對象,比如數組,線(xiàn)程對象等。
2.棧與堆的比較
a.棧是運行時(shí)的單位,而堆是存儲的單位。
b.棧解決程序的運行問(wèn)題,即程序如何執行,或者說(shuō)如何處理數據;堆解決的是數據存儲的問(wèn)題,即數據怎么放、放在哪兒。在Java中一個(gè)線(xiàn)程就會(huì )相應有一個(gè)線(xiàn)程棧與之對應,這點(diǎn)很容易理解,因為不同的線(xiàn)程執行邏輯有所不同,因此需要一個(gè)獨立的線(xiàn)程棧。而堆則是所有線(xiàn)程共享的。
c.對象存放在堆中,對象引用和基本類(lèi)型存放在棧中;對象的屬性存放在堆中,對象的方法存在棧中。
d.程序運行永遠都是在棧中進(jìn)行的,因而參數傳遞時(shí),只存在傳遞基本類(lèi)型和對象引用的問(wèn)題。不會(huì )直接傳對象本身。
e.在JVM中,靜態(tài)屬性保存在Stack指令內存區,動(dòng)態(tài)屬性保存在Heap數據內存區
3.幾種垃圾回收機制
a.標記-清除收集器
這種收集器首先遍歷對象圖并標記可到達的對象,然后掃描堆棧以尋找未標記對象并釋放它們的內存。這種收集器一般使用單線(xiàn)程工作并停止其他操作。
b.標記-壓縮收集器
有時(shí)也叫標記-清除-壓縮收集器,與標記-清除收集器有相同的標記階段。在第二階段,則把標記對象復制到堆棧的新域中以便壓縮堆棧。這種收集器也停止其他操作。
c.復制收集器
這種收集器將堆棧分為兩個(gè)域,常稱(chēng)為半空間。每次僅使用一半的空間,jvm生成的新對象則放在另一半空間中。gc運行時(shí),它把可到達對象復制到另一半空間,從而壓縮了堆棧。這種方法適用于短生存期的對象,持續復制長(cháng)生存期的對象則導致效率降低。
d.增量收集器
增量收集器把堆棧分為多個(gè)域,每次僅從一個(gè)域收集垃圾。這會(huì )造成較小的應用程序中斷。
e.分代收集器
這種收集器把堆棧分為兩個(gè)或多個(gè)域,用以存放不同壽命的對象。jvm生成的新對象一般放在其中的某個(gè)域中。過(guò)一段時(shí)間,繼續存在的對象將獲得使用期并轉入更長(cháng)壽命的域中。分代收集器對不同的域使用不同的算法以?xún)?yōu)化性能。
f.并發(fā)收集器
并發(fā)收集器與應用程序同時(shí)運行。這些收集器在某點(diǎn)上(比如壓縮時(shí))一般都不得不停止其他操作以完成特定的任務(wù),但是因為其他應用程序可進(jìn)行其他的后臺操作,所以中斷其他處理的實(shí)際時(shí)間大大降低。
g.并行收集器
并行收集器使用某種傳統的算法并使用多線(xiàn)程并行的執行它們的工作。在多cpu機器上使用多線(xiàn)程技術(shù)可以顯著(zhù)的提高java應用程序的可擴展性。
下篇解答問(wèn)題:
二、線(xiàn)上發(fā)送頻繁full gc如何處理? CPU 使用率過(guò)高怎么辦?如何定位問(wèn)題?如何解決說(shuō)一下解決思路和處理方法
三、知道字節碼嗎?字節碼都有哪些?Integer x =5,int y =5,比較x =y 都經(jīng)過(guò)哪些步驟?
四、講講類(lèi)加載機制唄都有哪些類(lèi)加載器,這些類(lèi)加載器都加載哪些文件?手寫(xiě)一下類(lèi)加載Demo
五、知道osgi嗎? 他是如何實(shí)現的???
聯(lián)系客服