Java垃圾收集器實現了一種按年齡對對象進行分類的分代垃圾收集策略。想深入了解這一特性的同學可以考慮參加java培訓,有系統規范的課程和明確清晰的學習路線,讓你快速掌握java更多知識和技能。
必須標記和壓縮JVM中的所有對象是低效的。隨著越來越多的對象被分配,對象列表會增加,導致垃圾收集時間變長。應用程序的經驗分析表明,Java中的大多數對象都是短期的。這就是為什么Java將對象分類為幾代,并相應地執行垃圾收集。
年輕一代
新創建的對象始于年輕一代。年輕一代進一步細分為:
l 伊甸園空間—所有新對象都從這里開始,初始內存分配給它們
l 幸存者空間(FromSpace和ToSpace)—在經歷了一個垃圾收集周期后,對象從伊甸園移到這里。
當對象被年輕一代垃圾收集時,這是一個小的垃圾收集事件。當伊甸園空間充滿對象時,將執行次要GC。所有死亡對象都被刪除,所有活著的對象都被移動到一個幸存者空間。次要GC還檢查幸存者空間中的對象,并將它們移動到另一個幸存者空間。在java培訓中,有很多關于java內存管理和垃圾收集的課程知識,你還能在實操項目中進行更深入的學習。
以以下順序為例:
1.伊甸園擁有所有對象(活的和死的)
2.小規模的垃圾收集—所有死亡對象都會從伊甸園中移除,所有活動對象都將移動到S1(FromSpace),伊甸園和S2現在是空的。
3.新對象被創建并添加到伊甸園,伊甸園和S1中的一些物體已經死亡。
4.小規模的垃圾收集—所有死亡對象都從伊甸園和S1中移除,所有活動對象都移動到S2(ToSpace),伊甸園和S1現在是空的。
因此,在任何時候,一個幸存者空間總是空的。當幸存物體達到一定的移動閾值時,它們會移動到老一代。你可以使用-Xmn標志來設置年輕一代的大小。
老一代
長壽物體最終會從年輕一代轉移到老年一代,這也被稱為“終身世代”,它包含了在幸存者空間中停留很長時間的對象。為對象的使用期限定義了一個閾值,該閾值決定了在將其移到舊一代之前,它可以存活多少個垃圾收集周期。在java培訓中,有很多關于垃圾收集的學習課程,不僅有理論知識,還有實踐項目訓練,讓你深入淺出地掌握java語言。
當對象從老一代被垃圾收集時,這是一個主要的垃圾收集事件。你可以使用-Xms和-Xmx標志來設置堆內存的初始大小和最大大小。
由于Java使用了分代垃圾收集,對象存活的垃圾收集事件越多,它在堆中的提升就越大。它從年輕一代開始,如果存活時間足夠長,最終會在終身制一代結束。
請考慮以下示例,以了解對象在空間和代之間的升級:
當一個對象被創造時,它首先被放入年輕一代的伊甸園空間。一旦發生一次小的垃圾收集,來自伊甸園的活動對象將被提升到FromSpace。當下一次小垃圾收集發生時,來自伊甸園和FromSpace的活動對象將移動到ToSpace,此循環持續特定次數,如果對象在這一點之后仍在使用,下一個垃圾收集周期將把它移到老一代空間。參加java培訓,可以幫你加深對java垃圾收集的了解,學到更多的技能,提升工作效率。
永久代
類和方法等元數據存儲在永久代中。JVM在運行時根據應用程序使用的類填充它,不再使用的類可能會被永久生成垃圾收集。你可以使用-XX:PermGen和-XX:MaxPermGens標志來設置永久代的初始大小和最大大小。
元空間
從Java 8開始,元空間內存空間取代了PermGen空間。實現與PermGen不同,堆的這個空間現在自動調整大小,這避免了由于堆的PermGen空間有限而導致應用程序內存不足的問題。元空間內存可以被垃圾收集,當元空間達到最大大小時,不再使用的類可以被自動清理。想要學習java更多知識和技能,可以考慮參加java培訓,有經驗豐富的專業講師指導教學,有緊跟市場需求的實時課程,可以讓你快速掌握這門技術,節約時間,少走彎路。