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