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