十四、垃圾回收概述

1、什麼是垃圾

 

  • 垃圾收集,不是Java語言的伴生產物。早在1960年,第一門開始使用內存動態分配和垃圾收集技術的Lisp語言誕生。
  • 關於垃圾收集有三個經典問題:
  1. 哪些內存需要回收?
  2. 什麼時候回收?
  3. 如何回收?
  • 垃圾收集機制是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回收停頓了幾次,爲什麼要停頓兩次。

  • ( Garbage)呢?

             >  垃圾是指在運行程序中沒有任何指針指向的對象,這個對象就是需要被回收的垃圾。

             >  外文: An object is considered garbage when it can no longer be reached from any pointer in the running program.

  • ,那麼,這些垃圾對象所佔的內存空間會一直保留到應用程序結束,被保留的空間無法被其他對象使用。甚至可能導致內存溢出

2、爲什麼需要GC

想要學習GC ,首先需要理解爲什麼需要GC?

  • ,一個基本認知是如果不進行垃圾回收,內存遲早都會被消耗完,因爲不斷地分配內存空間而不進行回收,就好像不停地生產生活垃圾而從來不打掃一樣。
  • ,垃圾回收也可以清除內存裏的記錄碎片。碎片整理將所佔用的堆內存移到堆的一端,以便JVM將整理出的內存分配給新的對象
  • ,用戶越來越多,沒有GC就不能保證應用程序的正常進行。而經常造成STW的GC又跟不上實際的需求,所以纔會不斷地嘗試對GC進行優化。

3、早期垃圾回收

  • C/C++時代,垃圾回收基本上是手工進行的。開發人員可以使用new關鍵字進行內存申請,並使用delete關鍵字進行內存釋放。比如以下代碼:

  • ,但是會給開發人員帶來頻繁申請和釋放內存的管理負擔。倘若有一處內存區間由於程序員編碼的問題忘記被回收,那麼就會產生內存泄漏,垃圾對象永遠無法被清除,隨着系統運行時間的不斷增長,垃圾對象所耗內存可能持續上升,直到出現內存溢出並造成應用程序崩潰。

在有了垃圾回收機制後,上述代碼塊極有可能變成這樣:

現在,除了Java以外, C#、Python、Ruby等語言都使用了自動垃圾回收的思想,也是未來發展趨勢。可以說,這種自動化的內存分配和垃圾回收的方式已經成爲現代開發語言必備的標準。

4、Java垃圾回收機制

  • ,無需開發人員手動參與內存的分配與回收,這樣降低內存泄漏和內存溢出的風險

               > 沒有垃圾回收器, java也會和cpp一樣,各種懸垂指針,野指針,泄露問題讓你頭疼不已。

  • ,將程序員從繁重的內存管理中釋放出來,可以更專心地專注於業務開發
  1. 官網關於垃圾回收的介紹

               https://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/toc.html

擔憂

  • Java開發人員而言, 自動內存管理就像是一個黑匣子,如果過度依賴於“自動”,那麼這將會是一場災難,最嚴重的就會弱化Java開發人員在程序出現內存溢出時定位問題和解決問題的能力
  • ,瞭解JVM的自動內存分配和內存回收原理就顯得非常重要,只有在真正瞭解JVM是如何管理內存後,我們才能夠在遇見OutOfMemoryError時,快速地根據錯誤異常日誌定位問題和解決問題。
  • ,當垃圾收集成爲系統達到更高併發量的瓶頸時,我們就必須對這些“自動化”的技術實施必要的監控和調節

應該關心哪些區域的回收 ?

  • ,也可以對老年代回收,甚至是全堆和方法區的回收。

                >  其中, Java堆是垃圾收集器的工作重點。

:

                   >  頻繁收集Young區

                   >  較少收集Old區

                   >  基本不動Perm區(或元空間)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章