JVM面試題
2018-07-31 來(lái)源:importnew

1、你知道哪些或者你們線上使?什么GC策略?它有什么優(yōu)勢(shì),適?于什么場(chǎng)景?
參考?觸發(fā)JVM進(jìn)行Full GC的情況及應(yīng)對(duì)策略。
2、Java類(lèi)加載器包括?種?它們之間的??關(guān)系是怎么樣的?雙親委派機(jī)制是什么意思?有什么好處?
啟動(dòng)Bootstrap類(lèi)加載、擴(kuò)展Extension類(lèi)加載、系統(tǒng)System類(lèi)加載。
父子關(guān)系如下:
- 啟動(dòng)類(lèi)加載器 ,由C++ 實(shí)現(xiàn),沒(méi)有父類(lèi);
- 擴(kuò)展類(lèi)加載器,由Java語(yǔ)言實(shí)現(xiàn),父類(lèi)加載器為null;
- 系統(tǒng)類(lèi)加載器,由Java語(yǔ)言實(shí)現(xiàn),父類(lèi)加載器為擴(kuò)展類(lèi)加載器;
- 自定義類(lèi)加載器,父類(lèi)加載器肯定為AppClassLoader。
雙親委派機(jī)制:類(lèi)加載器收到類(lèi)加載請(qǐng)求,自己不加載,向上委托給父類(lèi)加載,父類(lèi)加載不了,再自己加載。
優(yōu)勢(shì)避免Java核心API篡改。詳細(xì)查看:深入理解Java類(lèi)加載器(ClassLoader)
3、如何?定義?個(gè)類(lèi)加載器?你使?過(guò)哪些或者你在什么場(chǎng)景下需要?個(gè)?定義的類(lèi)加載器嗎?
自定義類(lèi)加載的意義:
- 加載特定路徑的class文件
- 加載一個(gè)加密的網(wǎng)絡(luò)class文件
- 熱部署加載class文件
4、堆內(nèi)存設(shè)置的參數(shù)是什么?
- -Xmx 設(shè)置堆的最大空間大小
- -Xms 設(shè)置堆的最小空間大小
5、Perm Space中保存什么數(shù)據(jù)?會(huì)引起OutOfMemory嗎?
加載class文件。
會(huì)引起,出現(xiàn)異?梢栽O(shè)置 -XX:PermSize 的大小。JDK 1.8后,字符串常量不存放在永久帶,而是在堆內(nèi)存中,JDK8以后沒(méi)有永久代概念,而是用元空間替代,元空間不存在虛擬機(jī)中,二是使用本地內(nèi)存。
詳細(xì)查看Java8內(nèi)存模型—永久代(PermGen)和元空間(Metaspace)
6、做GC時(shí),?個(gè)對(duì)象在內(nèi)存各個(gè)Space中被移動(dòng)的順序是什么?
標(biāo)記清除法,復(fù)制算法,標(biāo)記整理、分代算法。
新生代一般采用復(fù)制算法 GC,老年代使用標(biāo)記整理算法。
垃圾收集器:串行新生代收集器、串行老生代收集器、并行新生代收集器、并行老年代收集器。
CMS(Current Mark Sweep)收集器是一種以獲取最短回收停頓時(shí)間為目標(biāo)的收集器,它是一種并發(fā)收集器,采用的是Mark-Sweep算法。
詳見(jiàn)?Java GC機(jī)制。
7、你有沒(méi)有遇到過(guò)OutOfMemory問(wèn)題?你是怎么來(lái)處理這個(gè)問(wèn)題的?處理 過(guò)程中有哪些收獲?
permgen space、heap space 錯(cuò)誤。
常見(jiàn)的原因
- 內(nèi)存加載的數(shù)據(jù)量太大:一次性從數(shù)據(jù)庫(kù)取太多數(shù)據(jù);
- 集合類(lèi)中有對(duì)對(duì)象的引用,使用后未清空,GC不能進(jìn)行回收;
- 代碼中存在循環(huán)產(chǎn)生過(guò)多的重復(fù)對(duì)象;
- 啟動(dòng)參數(shù)堆內(nèi)存值小。
詳見(jiàn)?Java 內(nèi)存溢出(java.lang.OutOfMemoryError)的常見(jiàn)情況和處理方式總結(jié)。
8、JDK 1.8之后Perm Space有哪些變動(dòng)? MetaSpace??默認(rèn)是?限的么? 還是你們會(huì)通過(guò)什么?式來(lái)指定???
JDK 1.8后用元空間替代了 Perm Space;字符串常量存放到堆內(nèi)存中。
MetaSpace大小默認(rèn)沒(méi)有限制,一般根據(jù)系統(tǒng)內(nèi)存的大小。JVM會(huì)動(dòng)態(tài)改變此值。
- -XX:MetaspaceSize:分配給類(lèi)元數(shù)據(jù)空間(以字節(jié)計(jì))的初始大。∣racle邏輯存儲(chǔ)上的初始高水位,the initial high-water-mark)。此值為估計(jì)值,MetaspaceSize的值設(shè)置的過(guò)大會(huì)延長(zhǎng)垃圾回收時(shí)間。垃圾回收過(guò)后,引起下一次垃圾回收的類(lèi)元數(shù)據(jù)空間的大小可能會(huì)變大。
- -XX:MaxMetaspaceSize:分配給類(lèi)元數(shù)據(jù)空間的最大值,超過(guò)此值就會(huì)觸發(fā)Full GC,此值默認(rèn)沒(méi)有限制,但應(yīng)取決于系統(tǒng)內(nèi)存的大小。JVM會(huì)動(dòng)態(tài)地改變此值。
9、jstack 是?什么的? jstat 呢?如果線上程序周期性地出現(xiàn)卡頓,你懷疑可 能是 GC 導(dǎo)致的,你會(huì)怎么來(lái)排查這個(gè)問(wèn)題?線程?志?般你會(huì)看其中的什么 部分?
jstack 用來(lái)查詢 Java 進(jìn)程的堆棧信息。
jvisualvm 監(jiān)控內(nèi)存泄露,跟蹤垃圾回收、執(zhí)行時(shí)內(nèi)存、cpu分析、線程分析。
詳見(jiàn)Java jvisualvm簡(jiǎn)要說(shuō)明,可參考?線上FullGC頻繁的排查。
10、StackOverflow異常有沒(méi)有遇到過(guò)??般你猜測(cè)會(huì)在什么情況下被觸發(fā)?如何指定?個(gè)線程的堆棧????般你們寫(xiě)多少?
棧內(nèi)存溢出,一般由棧內(nèi)存的局部變量過(guò)爆了,導(dǎo)致內(nèi)存溢出。出現(xiàn)在遞歸方法,參數(shù)個(gè)數(shù)過(guò)多,遞歸過(guò)深,遞歸沒(méi)有出口。
答案如有不正確,還請(qǐng)各位指正。
標(biāo)簽: ssl 代碼 數(shù)據(jù)庫(kù) 網(wǎng)絡(luò)
版權(quán)申明:本站文章部分自網(wǎng)絡(luò),如有侵權(quán),請(qǐng)聯(lián)系:west999com@outlook.com
特別注意:本站所有轉(zhuǎn)載文章言論不代表本站觀點(diǎn)!
本站所提供的圖片等素材,版權(quán)歸原作者所有,如需使用,請(qǐng)與原作者聯(lián)系。