第 14 章 垃圾回收都不懂,征服面試官!
1、垃圾收集面試題
回顧 JVM 學習路線

關于垃圾收集
- Java 和 C++語言的區別,就在于垃圾收集技術和記憶體動態分配上,C語言沒有垃圾收集技術,需要我們手動的收集,
- 垃圾收集,不是Java語言的伴生產物,早在1960年,第一門開始使用記憶體動態分配和垃圾收集技術的Lisp語言誕生,
- 關于垃圾收集有三個經典問題:
- 哪些記憶體需要回收?
- 什么時候回收?
- 如何回收?
- 垃圾收集機制是Java的招牌能力,極大地提高了開發效率,如今,垃圾收集幾乎成為現代語言的標配,即使經過如此長時間的發展,Java的垃圾收集機制仍然在不斷的演進中,不同大小的設備、不同特征的應用場景,對垃圾收集提出了新的挑戰,這當然也是面試的熱點,

瞅瞅大廠面試題
螞蟻金服
- 你知道哪幾種垃圾回收器,各自的優缺點,重點講一下CMS和G1?
- JVM GC演算法有哪些,目前的JDK版本采用什么回收演算法?
- G1回收器講下回收程序GC是什么?為什么要有GC?
- GC的兩種判定方法?CMS收集器與G1收集器的特點
百度
- 說一下GC演算法,分代回收說下
- 垃圾收集策略和演算法
天貓
- JVM GC原理,JVM怎么回收記憶體
- CMS特點,垃圾回收演算法有哪些?各自的優缺點,他們共同的缺點是什么?
滴滴
- Java的垃圾回收器都有哪些,說下G1的應用場景,平時你是如何搭配使用垃圾回收器的
京東
- 你知道哪幾種垃圾收集器,各自的優缺點,重點講下CMS和G1,
- 包括原理,流程,優缺點,垃圾回收演算法的實作原理
阿里
- 講一講垃圾回收演算法,
- 什么情況下觸發垃圾回收?
- 如何選擇合適的垃圾收集演算法?
- JVM有哪三種垃圾回收器?
位元組跳動
- 常見的垃圾回收器演算法有哪些,各有什么優劣?
- System.gc()和Runtime.gc()會做什么事情?
- Java GC機制?GC Roots有哪些?
- Java物件的回收方式,回收演算法,
- CMS和G1了解么,CMS解決什么問題,說一下回收的程序,
- CMS回收停頓了幾次,為什么要停頓兩次?
2、為什么需要GC
什么是垃圾?
什么是垃圾(Garbage)呢?
-
垃圾是指在運行程式中沒有任何指標指向的物件,這個物件就是需要被回收的垃圾,
-
外文:An object is considered garbage when it can no longer be reached from any pointer in the running program.
-
如果不及時對記憶體中的垃圾進行清理,那么,這些垃圾物件所占的記憶體空間會一直保留到應用程式結束,被保留的空間無法被其他物件使用,甚至可能導致記憶體溢位,
磁盤碎片整理

想要學習GC,首先需要理解為什么需要GC?
- 對于高級語言來說,一個基本認知是如果不進行垃圾回收,記憶體遲早都會被消耗完,因為不斷地分配記憶體空間而不進行回收,就好像不停地生產生活垃圾而從來不打掃一樣,
- 除了釋放沒用的物件,垃圾回收也可以清除記憶體里的記錄碎片,碎片整理將所占用的堆記憶體移到堆的一端,以便JVM將整理出的記憶體分配給新的物件,
- 隨著應用程式所應付的業務越來越龐大、復雜,用戶越來越多,沒有GC就不能保證應用程式的正常進行,而經常造成STW的GC又跟不上實際的需求,所以才會不斷地嘗試對GC進行優化,
3、早期垃圾回收
在早期,開發人員需要手動回收記憶體
- 在早期的C/C++時代,垃圾回識訓本上是手工進行的,開發人員可以使用new關鍵字進行記憶體申請,并使用delete關鍵字進行記憶體釋放,比如以下代碼:
MibBridge *pBridge= new cmBaseGroupBridge();
//如果注冊失敗,使用Delete釋放該物件所占記憶體區域
if(pBridge->Register(kDestroy)!=NO ERROR)
delete pBridge;
- 這種方式可以靈活控制記憶體釋放的時間,但是會給開發人員帶來頻繁申請和釋放記憶體的管理負擔,倘若有一處記憶體區間由于程式員編碼的問題忘記被回收,那么就會產生記憶體泄漏,垃圾物件永遠無法被清除,隨著系統運行時間的不斷增長,垃圾物件所耗記憶體可能持續上升,直到出現記憶體溢位并造成應用程式崩潰,
- 有了垃圾回識訓制后,上述代碼極有可能變成這樣
MibBridge *pBridge=new cmBaseGroupBridge();
pBridge->Register(kDestroy);
- 現在,除了Java以外,C#、Python、Ruby等語言都使用了自動垃圾回收的思想,也是未來發展趨勢,可以說這種自動化的記憶體分配和來及回收方式已經成為了線代開發語言必備的標準,
4、Java 垃圾回識訓制
4.1、自動記憶體管理
自動記憶體管理的優點
Oracle官網關于垃圾回收的介紹
https://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/toc.html
自動記憶體管理的優點
- 自動記憶體管理,無需開發人員手動參與記憶體的分配與回收,這樣降低記憶體泄漏和記憶體溢位的風險
- 沒有垃圾回收器,java也會和cpp一樣,各種懸垂指標,野指標,泄露問題讓你頭疼不已,
- 自動記憶體管理機制,將程式員從繁重的記憶體管理中釋放出來,可以更專心地專注于業務開發
關于自動記憶體管理的擔憂
- 對于Java開發人員而言,自動記憶體管理就像是一個黑匣子,如果過度依賴于"自動",那么這將會是一場災難,最嚴重的就會榷訓Java開發人員在程式出現記憶體溢位時定位問題和解決問題的能力,
- 此時,了解JVM的自動記憶體分配和記憶體回收原理就顯得非常重要,只有在真正了解JVM是如何管理記憶體后,我們才能夠在遇見OutofMemoryError時,快速地根據錯誤例外日志定位問題和解決問題,
- 當需要排查各種記憶體溢位、記憶體泄漏問題時,當垃圾收集成為系統達到更高并發量的瓶頸時,我們就必須對這些"自動化"的技術實施必要的監控和調節,
4.2、GC 的作用域
GC 的作用區域
- 垃圾收集器可以對年輕代回收,也可以對老年代回收,甚至是全堆疊和方法區的回收,其中,Java堆是垃圾收集器的作業重點
- 從次數上講:
- 頻繁收集Young區
- 較少收集Old區
- 基本不收集Perm區(元空間)
- GC主要關注于方法區和堆中的垃圾收集

你只管學習,我來負責記筆記?? 關注公眾號! ,更多筆記,等你來拿,謝謝





轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/172111.html
標籤:Java
上一篇:HTTPS證書知識掃盲
