3.Java垃圾回收机制面试题
3.1 判斷對(duì)象是否為垃圾的算法
對(duì)象被判定為垃圾的標(biāo)準(zhǔn):沒有被其他對(duì)象引用。
1. 引用計(jì)數(shù)算法:通過判斷對(duì)象的引用數(shù)量來決定對(duì)象是否可以被回收;每個(gè)對(duì)象實(shí)例都有一個(gè)引用計(jì)數(shù)器,被引用則+1,完成引用則-1。優(yōu)點(diǎn)︰執(zhí)行效率高,程序執(zhí)行受影響較小;缺點(diǎn)∶無法檢測(cè)出循環(huán)引用的情況,導(dǎo)致內(nèi)存泄露。
2. 可達(dá)性分析算法:通過判斷對(duì)象的引用鏈?zhǔn)欠窨蛇_(dá)來決定對(duì)象是否可以被回收??梢宰鳛镚C Root的對(duì)象①虛擬機(jī)棧中引用的對(duì)象(棧幀中的本地變量表)②方法區(qū)中的常量引用的對(duì)象③方法區(qū)中的類靜態(tài)屬性引用的對(duì)象④本地方法棧中JNI ( Native方法)的引用對(duì)象⑤活躍線程的引用對(duì)象。
3.2 談?wù)勀懔私獾睦厥账惴?/span>
標(biāo)記-清除算法(Mark and Sweep):標(biāo)記∶從根集合進(jìn)行掃描,對(duì)存活的對(duì)象進(jìn)行標(biāo)記;清除∶對(duì)堆內(nèi)存從頭到尾進(jìn)行線性遍歷,回收不可達(dá)對(duì)象內(nèi)存。缺點(diǎn):碎片化。
復(fù)制算法:分為對(duì)象面和空閑面,對(duì)象在對(duì)象面上創(chuàng)建,存活的對(duì)象被從對(duì)象面復(fù)制到空閑面,然后將對(duì)象面的所有對(duì)象內(nèi)存清除。優(yōu)點(diǎn):解決碎片化問題,順序分配內(nèi)存,適用于對(duì)象存活率低的場(chǎng)景。
?
?
標(biāo)志-整理算法:是在標(biāo)記-清除算法的基礎(chǔ)上,增加了整理的步驟。標(biāo)記︰從根集合進(jìn)行掃描,對(duì)存活的對(duì)象進(jìn)行標(biāo)記;整理∶移動(dòng)所有存活的對(duì)象,且按照內(nèi)存地址次序依次排列,然后將末端內(nèi)存地址以后的內(nèi)存全部回收。
分代收集算法:
?
Minor GC:用于年輕代(生命周期短);Full GC:用于年輕代+老年代;Major GC:有的地方等同于Full GC,有的地方單單指老年代的GC。
對(duì)象如何變?yōu)槔夏甏?#xff1f;
經(jīng)歷一定Minor次數(shù)依然存活的對(duì)象;Survivor區(qū)域放不下的對(duì)象;新生成的大對(duì)象。
常見的性能調(diào)優(yōu)參數(shù):①SurvivorRatio:Eden和Survivor的比值,默認(rèn)8:1;②NewRatio:老年代和年輕代的內(nèi)存大小比例;③MaxTenuringThreshold:對(duì)象從年輕代晉升到老年代經(jīng)過的GC次數(shù)的最大閾值。
觸發(fā)Full GC的條件
1.老年代空間不足 2.永久代空間不足:針對(duì)JDK8以前的版本3.調(diào)用System.gc()調(diào)用了程序來決定要不要回收。(回答這三條基本足夠)
4. 使用遠(yuǎn)程方式管理的JDK應(yīng)用,每小時(shí)執(zhí)行1次Full Gc 5. CMS GC時(shí)出現(xiàn)promotion failed, concurrent mode failure 6. Minor GC晉升到老年代的平均大小大于老年代的剩余空間調(diào)用。
3.3 常見的垃圾收集器
Stop-the-World:發(fā)生時(shí),除了GC所在的線程,其他線程都處于停頓狀態(tài)
Safepoint:安全點(diǎn),到達(dá)安全點(diǎn)停頓下來,一般在方法調(diào)用、循環(huán)跳轉(zhuǎn)、異常跳轉(zhuǎn)等地方。
JAVA的運(yùn)行模式有兩種,Server與Client 可以通過java -version 來獲取。
垃圾收集器圖-連線表示可以并存
Serial收集器:單線程收集,進(jìn)行垃圾收集時(shí),必須暫停所有工作線程簡(jiǎn)單高效,Client模式下默認(rèn)的年輕代收集器。
ParNew收集器:多線程,其他和Serial一樣,單核效率不如Serial。
Parallel Scavenge收集器:吞吐量=運(yùn)行用戶代碼時(shí)間/(運(yùn)行用戶代碼時(shí)間+垃圾收集時(shí)間),更關(guān)注系統(tǒng)的吞吐量。在多核下執(zhí)行才有優(yōu)勢(shì),Server模式下默認(rèn)的年輕代收集器。
老年代:
Serial Old收集器:單線程收集,進(jìn)行垃圾收集時(shí),必須暫停所有工作線程;簡(jiǎn)單高效,Client模式下默認(rèn)的老年代收集器;采用標(biāo)記-整理算法。
Parallel Old收集器:多線程,吞吐量?jī)?yōu)先。
CMS收集器:標(biāo)記-清除算法,會(huì)帶來內(nèi)存空間碎片化的問題。①初始標(biāo)記: stop-the-world②并發(fā)標(biāo)記∶并發(fā)追溯標(biāo)記,程序不會(huì)停頓③并發(fā)預(yù)清理:查找執(zhí)行并發(fā)標(biāo)記階段從年輕代晉升到老年代的對(duì)象⑤重新標(biāo)記︰暫停虛擬機(jī),掃描CMS堆中的剩余對(duì)象⑥并發(fā)清理∶清理垃圾對(duì)象,程序不會(huì)停頓。
Garbage First:并行和并發(fā);分代收集;標(biāo)記-整理算法,空間整合;可預(yù)測(cè)停頓;年輕代和老年代不再物理隔離
3.4 Object的finalize()方法的作用是否與C++的析構(gòu)函數(shù)作用相同
finalize方法是在垃圾回收時(shí),用于確認(rèn)該對(duì)象是否確認(rèn)被回收的一個(gè)標(biāo)記過程。確認(rèn)一個(gè)對(duì)象真正被回收需要經(jīng)歷兩次標(biāo)記過程:可達(dá)性分析沒有引用,這是第一次標(biāo)記,放入F-Queue隊(duì)列中;finalize()方法是對(duì)象逃脫死亡命運(yùn)的最后一次機(jī)會(huì),稍后GC將對(duì)F-Queue中的對(duì)象進(jìn)行第二次小規(guī)模的標(biāo)記。finalize方法不是一定會(huì)執(zhí)行,對(duì)象可以在finalize方法中獲得自救,避免自己被垃圾回收,同樣自救也只能一次。
不相同,析構(gòu)函數(shù)調(diào)用確定,而finalize()方法是不確定的。
3.5 Java中的強(qiáng)引用,軟引用,弱引用,虛引用有什么用
強(qiáng)引用(Strong Reference):
Object obj =new Object();
拋出OutOfMemoryError終止程序也不會(huì)回收具有強(qiáng)引用的對(duì)象;通過將對(duì)象設(shè)置為null來弱化引用,使其被回收。
軟引用(Soft Reference):
String str =new String("ABC");//強(qiáng)引用
SoftReference<String> softRef =new SoftReference<String>(str);
對(duì)象處在有用但是非必須的狀態(tài),只有當(dāng)內(nèi)存空間不足時(shí),GC才會(huì)回收該對(duì)象的內(nèi)存,可以實(shí)現(xiàn)高速緩存。
弱引用(Weak Reference ):
String str =new String("ABC");//強(qiáng)引用
WeakReference<String> softRef =new WeakReference<String>(str);
非必須的對(duì)象,比軟引用更弱一些;GC時(shí)會(huì)被回收;回收的概率也不大,因?yàn)镚C線程優(yōu)先級(jí)比較低;適用于引用偶爾被使用且不影響垃圾收集的對(duì)象。
虛引用(PhantomReference ):
String str =new String("ABC");//強(qiáng)引用
ReferenceQueue queue =new ReferenceQueue<>();
PhantomReference ref =new PhantomReference<>(str,queue);
不會(huì)決定對(duì)象的生命周期;任何時(shí)候都可能被垃圾收集器回收;跟蹤對(duì)象被垃圾收集器回收的活動(dòng),起哨兵作用;必須和引用隊(duì)列ReferenceQueue聯(lián)合使用.
?
?
總結(jié)
以上是生活随笔為你收集整理的3.Java垃圾回收机制面试题的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: VS2005调试时变慢解决办法
- 下一篇: Java 垃圾回收机制原理