7、垃圾回收——概述


七、垃圾回收——概述

什么是垃圾?

垃圾收集,不是Java語言的半生產物,第一門開始使用內存動態分配和垃圾收集技術的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?

1、對於高級語言來說,一個基本認知是如果不進行垃圾回收,內存遲早都會被消耗完,因為不斷地分配內存空間不進行回收,就好像不停地產生生活垃圾而從來不打掃。

2、除了釋放沒用的對象,垃圾回收也可以清除內存里的記錄碎片。碎片整理將所占用的堆內存移到堆的一端,一邊JVM將整理出的內存分配給新的對象。

3、隨着應用程序所應付的業務越來越龐大、復雜,用戶越來越多,沒有GC將不能保證應用程序的正常進行。而經常造成STW的GC有跟不上實際的需求,所以才會不斷地嘗試對GC進行優化。

Java垃圾回收機制

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

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

自動內存管理機制,將程序員從繁重的內存管理中釋放出來,可以更專心與業務開發

對於Java開發人員而言,自動內存管理就像是一個黑匣子,如果過度依賴於“自動”,那么這將會是一場災難,最嚴重的就會弱化Java開發人員在程序出現內存溢出時定位問題和解決問題的能力。

此時,了解JVM的自動內存分配和內存回收原理就顯得非常重要,只有在真正了解JVM是如何管理內存后,我們才能夠在遇見OutOfMemoryError時,快速地根據錯誤異常日志定位問題和解決問題。

當需要排查各種內存溢出、內存泄漏問題時,當垃圾收集成為系統達到更高並發量的瓶頸時,我們就必須對這些“自動化”的技術實施必要的監控和調節。

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

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

從次數上講:

  • 頻繁收集Young區
  • 較少收集Old區
  • 基本不動Perm區


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM