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