更新時(shí)間:2022-06-02 10:13:48 來(lái)源:動(dòng)力節(jié)點(diǎn) 瀏覽1725次
什么是Java垃圾回收機(jī)制?動(dòng)力節(jié)點(diǎn)小編來(lái)為大家解答。
垃圾收集是一種自動(dòng)收集某個(gè)程序不再需要的內(nèi)存區(qū)域并使該內(nèi)存區(qū)域可供其他程序使用的技術(shù)。
程序的處理在垃圾回收?qǐng)?zhí)行過(guò)程中停止。因此,垃圾收集能否正常運(yùn)行,極大地影響了系統(tǒng)性能。
程序中使用new創(chuàng)建的 Java 對(duì)象,占用 JavaVM 管理的內(nèi)存空間。從創(chuàng)建 Java 對(duì)象到它變得多余的時(shí)間段稱為Java對(duì)象的生命周期。
Java 對(duì)象有兩種類型;壽命短的和壽命長(zhǎng)的。對(duì)于在服務(wù)器上運(yùn)行的 Java 應(yīng)用程序,許多 Java 對(duì)象由請(qǐng)求和響應(yīng)或事務(wù)管理創(chuàng)建。這些 Java 對(duì)象的生命周期很短,因?yàn)樗鼈冊(cè)谔幚斫Y(jié)束時(shí)變得多余。另一方面,在應(yīng)用程序運(yùn)行時(shí)不斷使用的 Java 對(duì)象具有較長(zhǎng)的生命周期。
為了有效地執(zhí)行垃圾回收,您需要通過(guò)對(duì)生命周期短的對(duì)象執(zhí)行垃圾回收來(lái)使內(nèi)存回收有效。避免對(duì)重復(fù)使用的長(zhǎng)壽命對(duì)象進(jìn)行不必要的垃圾回收,有助于防止系統(tǒng)性能下降。這是通過(guò)按代垃圾收集來(lái)實(shí)現(xiàn)的。
在按代垃圾回收中,Java 對(duì)象通過(guò)將它們分成兩個(gè)區(qū)域進(jìn)行管理;存儲(chǔ)壽命短的對(duì)象的 New 區(qū)域和存儲(chǔ)壽命長(zhǎng)的對(duì)象的 Tenured 區(qū)域。New 區(qū)域進(jìn)一步分為 Eden 區(qū)域和 Survivor 區(qū)域,Eden 區(qū)域保存最近使用new創(chuàng)建的對(duì)象,Survivor 區(qū)域保存即使多次運(yùn)行垃圾收集后仍未收集的對(duì)象。執(zhí)行垃圾收集超過(guò)固定次數(shù)的New區(qū)域的Java對(duì)象被認(rèn)為是長(zhǎng)期需要的Java對(duì)象,這些Java對(duì)象移動(dòng)到Tenured區(qū)域。
下圖顯示了內(nèi)存空間和按代垃圾回收管理的 Java 對(duì)象的概覽:
分代垃圾回收?qǐng)?zhí)行的垃圾回收有以下兩種類型:
復(fù)制垃圾收集
復(fù)制垃圾收集僅針對(duì) Eden 區(qū)域和 Survivor 區(qū)域。當(dāng)您使用 Eden 區(qū)域創(chuàng)建 Java 對(duì)象時(shí),會(huì)發(fā)生復(fù)制垃圾收集。
您可以通過(guò)指定 Java HotSpot VM 選項(xiàng)來(lái)選擇串行復(fù)制垃圾收集和并行復(fù)制垃圾收集。
因?yàn)榇袕?fù)制垃圾回收的處理是并行執(zhí)行的,所以可以高速執(zhí)行并行復(fù)制垃圾回收。但是,如果您選擇并行復(fù)制垃圾回收,則無(wú)法使用顯式管理堆功能。
默認(rèn)選擇串行復(fù)制垃圾收集。請(qǐng)注意,本章介紹的內(nèi)容適用于這兩種類型的復(fù)制垃圾回收。
對(duì)一個(gè)對(duì)象執(zhí)行復(fù)制垃圾回收的次數(shù)稱為對(duì)象的年齡。
下圖顯示了一個(gè)對(duì)象的壽命和年齡之間的關(guān)系:
應(yīng)用程序啟動(dòng)后,初始化過(guò)程完成,復(fù)制垃圾回收已經(jīng)執(zhí)行了多次,長(zhǎng)期需要的長(zhǎng)壽命對(duì)象移動(dòng)到Tenured區(qū)。結(jié)果,在啟動(dòng)應(yīng)用程序后不久,Java 堆就達(dá)到了穩(wěn)定狀態(tài),并且大多數(shù)創(chuàng)建的 Java 對(duì)象都是生命周期較短的對(duì)象。特別是,如果新區(qū)域的調(diào)整已經(jīng)適當(dāng)執(zhí)行,那么在 Java 堆穩(wěn)定后,大部分生命周期較短的對(duì)象都會(huì)在第一次復(fù)制垃圾回收期間被回收。
在JavaVM中,執(zhí)行復(fù)制垃圾回收的New區(qū)的內(nèi)存空間被劃分為Eden區(qū)和Survivor區(qū)。Survivor 區(qū)域進(jìn)一步分為 From 空間和 To 空間。From 空間和 To 空間具有相同的內(nèi)存大小。
下圖是New區(qū)域的配置:
Eden 區(qū)域是最初存儲(chǔ)使用new創(chuàng)建的對(duì)象的區(qū)域。當(dāng)在程序中執(zhí)行new時(shí),會(huì)分配來(lái)自 Eden 區(qū)域的內(nèi)存。
當(dāng) Eden 區(qū)域變滿時(shí),將執(zhí)行復(fù)制垃圾回收。復(fù)制垃圾回收中進(jìn)行如下處理:
在 Eden 區(qū)域和 Survivor 區(qū)域的 From 空間中存在的 Java 對(duì)象中,正在使用的對(duì)象被復(fù)制到 Survivor 區(qū)域的 To 空間。未使用的 Java 對(duì)象將被銷毀。
Survivor 區(qū)域的 To 空間和 From 空間被交換。
結(jié)果,Eden 區(qū)域和 To 空間變?yōu)榭眨谑褂玫膶?duì)象保留在 From 空間中。
將那些年齡未達(dá)到閾值的 Java 對(duì)象移動(dòng)到 Tenured 區(qū)域的活動(dòng)稱為Saving。當(dāng) Eden 區(qū)域和 From 空間中正在使用的對(duì)象數(shù)量增加并且這些對(duì)象將被移動(dòng)到的 To 空間的內(nèi)存大小不足以在復(fù)制垃圾回收期間保存這些對(duì)象時(shí),就會(huì)發(fā)生保存。在這種情況下,無(wú)法移動(dòng)到 To 空間的對(duì)象將移動(dòng)到 Tenured 區(qū)域。
當(dāng)對(duì)象被保存時(shí),原本不應(yīng)該保存在Tenured區(qū)的壽命短的對(duì)象,被保存到Tenured區(qū)。如此反復(fù),本應(yīng)通過(guò)復(fù)制垃圾回收來(lái)回收的對(duì)象不斷在內(nèi)存空間中累積,從而增加 Java 堆的內(nèi)存使用量,最終發(fā)生完整的垃圾回收。
在 JavaVM中,除了 Eden 區(qū)域、Survivor 區(qū)域和 Tenured 區(qū)域之外,您還可以使用稱為Explicit heap的區(qū)域。垃圾回收不在顯式堆區(qū)域中執(zhí)行。
使用自動(dòng)分配設(shè)置文件和顯式內(nèi)存管理功能 API 指定要保存在顯式堆區(qū)域中的對(duì)象。在指定對(duì)象從 Survivor 區(qū)域移動(dòng)到 Tenured 區(qū)域的時(shí)刻,指定對(duì)象被移動(dòng)到 Explicit heap 區(qū)域。您可以指定沒(méi)有被復(fù)制垃圾回收回收的長(zhǎng)生命周期的對(duì)象,以減少Tenured區(qū)的內(nèi)存使用,并防止完全垃圾回收的發(fā)生。您還可以使用顯式內(nèi)存管理功能或顯式內(nèi)存管理功能 API 的自動(dòng)分配設(shè)置文件在顯式堆區(qū)域中創(chuàng)建指定對(duì)象。
相關(guān)閱讀
0基礎(chǔ) 0學(xué)費(fèi) 15天面授
有基礎(chǔ) 直達(dá)就業(yè)
業(yè)余時(shí)間 高薪轉(zhuǎn)行
工作1~3年,加薪神器
工作3~5年,晉升架構(gòu)
提交申請(qǐng)后,顧問(wèn)老師會(huì)電話與您溝通安排學(xué)習(xí)