14-垃圾回收概述
文章目錄
- 垃圾回收概述
- 概念
- 什么是垃圾
- 什么是垃圾?
- 磁盤碎片整理
- 大廠面試題
- 螞蟻金服
- 百度
- 天貓
- 滴滴
- 京東
- 阿里
- 字節跳動
- 為什么需要GC
- 早期垃圾回收
- Java垃圾回收機制
- 優點
- 擔憂
- GC主要關注的區域
垃圾回收概述
概念
這次我們主要關注的是黃色部分,內存的分配與回收
什么是垃圾
在提到什么是垃圾之前,我們先看下面一張圖
從上圖我們可以很明確的知道,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回收停頓了幾次,為什么要停頓兩次?
為什么需要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垃圾回收機制
優點
自動內存管理,無需開發人員手動參與內存的分配與回收,這樣降低內存泄漏和內存溢出的風險
沒有垃圾回收器,java也會和cpp一樣,各種懸垂指針,野指針,泄露問題讓你頭疼不已。
自動內存管理機制,將程序員從繁重的內存管理中釋放出來,可以更專心地專注于業務開發
oracle官網關于垃圾回收的介紹
https://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/toc.html
擔憂
對于Java開發人員而言,自動內存管理就像是一個黑匣子,如果過度依賴于“自動”,那么這將會是一場災難,最嚴重的就會弱化Java開發人員在程序出現內存溢出時定位問題和解決問題的能力。
此時,了解JVM的自動內存分配和內存回收原理就顯得非常重要,只有在真正了解JVM是如何管理內存后,我們才能夠在遇見outofMemoryError時,快速地根據錯誤異常日志定位問題和解決問題。
當需要排查各種內存溢出、內存泄漏問題時,當垃圾收集成為系統達到更高并發量的瓶頸時,我們就必須對這些“自動化”的技術實施必要的監控和調節。
GC主要關注的區域
GC主要關注于 方法區 和堆中的垃圾收集
垃圾收集器可以對年輕代回收,也可以對老年代回收,甚至是全棧和方法區的回收
- 其中,Java堆是垃圾收集器的工作重點
從次數上講:
- 頻繁收集Young區
- 較少收集Old區
- 基本不收集Perm區(元空間)
總結
- 上一篇: 多线程创建
- 下一篇: 13-StringTable