應用程序創建的Java對象駐留在稱為堆內存的內存中。堆是在JVM啟動時創建的,根據應用程序的可用性,堆的使用率會增加并達到滿堆。當堆使用率已滿,并且進一步請求新對象分配時,當前堆內存中沒有任何可用空間,則會發生垃圾收集。即在當不再使用的對象被刪除后,該為新對象騰出空間的時候。想對java有更深入的了解,可以參加java培訓,有助于進一步提升java知識和技能。
在理解堆內存段之前,我們需要了解Java中分代垃圾收集的概念。
在GC中,對堆內存中所有未引用的對象執行標記、掃描和壓縮。隨著越來越多的對象分配,JVM堆中堆積了大量的對象分配,這就需要更長的時間來進行垃圾收集。然而,對應用程序的經驗或假設分析表明,大多數對象都是短期的。因此,標記和壓縮JVM堆內存中的所有對象既低效又耗時。因此,GC實現了一個分代垃圾收集,它根據對象的年齡(壽命)對對象進行分類。通過這個過程,對象在不同的區域中分配,并相應地進行垃圾收集。
堆內存主要分為兩個區域:新生區(或苗圃)、舊空間
1.新生區(或苗圃)
無論何時創建新對象,都會將其分配給新生區。在java培訓中,有很多關于堆內存的學習課程,不僅有理論知識,還有實踐項目訓練,讓你深入淺出地掌握java語言。新生區基本上由兩部分組成。
A) Eden Space
所有新對象首先在Eden Space中分配。
B) Survivor Space
在一個GC循環之后,所有來自Eden Space的活物體都被移動到Survivor Space。Survivor Space進一步分為兩部分,s1和s2空間,也稱為FromSpace和ToSpace。當JVM啟動時,兩個Survivor Space總是空的。
2.舊空間
當對象在具有多個GC周期的新生區長期存在時,它們將在Survivor Space中標記為“生存”。在完成GC周期的閾值后,他們將有資格晉升到舊空間。這些長壽命的物體被進一步移入舊空間。舊空間也被稱為終身制的一代。此區域中的垃圾收集事件稱為主要收集。
完全GC執行所有代(新生區+舊空間)的清理。它執行從新生區到舊空間的所有活動對象的升級,以及舊空間的壓縮。完全GC是停止世界暫停,這將確保沒有分配新對象,并且在GC執行時對象不會突然變得不可訪問。
堆內存是java的一種內存分配機制,作為一名java 程序員,必須要搞懂Java的內存分配問題,這樣在工作中就可以避免出現很多錯誤。參加java培訓,可以幫你加深對java的了解,學到更多的技能,提升工作效率。