第 14 章 垃圾回收都不懂,征服面試官!
一、垃圾收集面試題
回顧 JVM 學習路線html
關於垃圾收集java
- Java 和 C++語言的區別,就在於垃圾收集技術和內存動態分配上,C語言沒有垃圾收集技術,須要咱們手動的收集。
- 垃圾收集,不是Java語言的伴生產物。早在1960年,第一門開始使用內存動態分配和垃圾收集技術的Lisp語言誕生。
- 關於垃圾收集有三個經典問題:
- 垃圾收集機制是Java的招牌能力,極大地提升了開發效率。現在,垃圾收集幾乎成爲現代語言的標配,即便通過如此長時間的發展,Java的垃圾收集機制仍然在不斷的演進中,不一樣大小的設備、不一樣特徵的應用場景,對垃圾收集提出了新的挑戰,這固然也是面試的熱點。
瞅瞅大廠面試題c++
螞蟻金服程序員
- 你知道哪幾種垃圾回收器,各自的優缺點,重點講一下CMS和G1?
- JVM GC算法有哪些,目前的JDK版本採用什麼回收算法?
- G1回收器講下回收過程GC是什麼?爲何要有GC?
- GC的兩種斷定方法?CMS收集器與G1收集器的特色
百度面試
- 說一下GC算法,分代回收說下
- 垃圾收集策略和算法
天貓算法
- JVM GC原理,JVM怎麼回收內存
- CMS特色,垃圾回收算法有哪些?各自的優缺點,他們共同的缺點是什麼?
滴滴併發
- Java的垃圾回收器都有哪些,說下G1的應用場景,平時你是如何搭配使用垃圾回收器的
京東oracle
- 你知道哪幾種垃圾收集器,各自的優缺點,重點講下CMS和G1,
- 包括原理,流程,優缺點。垃圾回收算法的實現原理
阿里ide
- 講一講垃圾回收算法。
- 什麼狀況下觸發垃圾回收?
- 如何選擇合適的垃圾收集算法?
- JVM有哪三種垃圾回收器?
字節跳動高併發
- 常見的垃圾回收器算法有哪些,各有什麼優劣?
- System.gc()和Runtime.gc()會作什麼事情?
- Java GC機制?GC Roots有哪些?
- Java對象的回收方式,回收算法。
- CMS和G1瞭解麼,CMS解決什麼問題,說一下回收的過程。
- CMS回收停頓了幾回,爲何要停頓兩次?
二、爲何須要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進行優化。
三、早期垃圾回收
在早期,開發人員須要手動回收內存
- 在早期的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等語言都使用了自動垃圾回收的思想,也是將來發展趨勢,能夠說這種自動化的內存分配和來及回收方式已經成爲了線代開發語言必備的標準。
四、Java 垃圾回收機制
4.一、自動內存管理
自動內存管理的優勢
Oracle官網關於垃圾回收的介紹
https://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/toc.html
自動內存管理的優勢
- 自動內存管理,無需開發人員手動參與內存的分配與回收,這樣下降內存泄漏和內存溢出的風險
- 沒有垃圾回收器,java也會和cpp同樣,各類懸垂指針,野指針,泄露問題讓你頭疼不已。
- 自動內存管理機制,將程序員從繁重的內存管理中釋放出來,能夠更專心地專一於業務開發
關於自動內存管理的擔心
- 對於Java開發人員而言,自動內存管理就像是一個黑匣子,若是過分依賴於"自動",那麼這將會是一場災難,最嚴重的就會弱化Java開發人員在程序出現內存溢出時定位問題和解決問題的能力。
- 此時,瞭解JVM的自動內存分配和內存回收原理就顯得很是重要,只有在真正瞭解JVM是如何管理內存後,咱們纔可以在碰見OutofMemoryError時,快速地根據錯誤異常日誌定位問題和解決問題。
- 當須要排查各類內存溢出、內存泄漏問題時,當垃圾收集成爲系統達到更高併發量的瓶頸時,咱們就必須對這些"自動化"的技術實施必要的監控和調節。
4.二、GC 的做用域
GC 的做用區域
- 垃圾收集器能夠對年輕代回收,也能夠對老年代回收,甚至是全棧和方法區的回收,其中,Java堆是垃圾收集器的工做重點
- 從次數上講:
- 頻繁收集Young區
- 較少收集Old區
- 基本不收集Perm區(元空間)
- GC主要關注於方法區和堆中的垃圾收集
你只管學習,我來負責記筆記😲 關注公衆號! ,更多筆記,等你來拿,謝謝