日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

jvm垃圾回收机制_JVM 垃圾回收机制之堆的分代回收

發(fā)布時(shí)間:2024/7/23 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 jvm垃圾回收机制_JVM 垃圾回收机制之堆的分代回收 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

JVM垃圾回收機(jī)制之堆的分代回收

前言

前文我們了解了Java的GC機(jī)制,對(duì)于堆中的對(duì)象,JVM采用引用計(jì)數(shù)和可達(dá)性分析兩種算法來(lái)標(biāo)記對(duì)象是否可以清除,本文中我們還會(huì)了解到JVM將對(duì)分成了不同的區(qū)域,以便于更好的回收對(duì)象。

堆的分代

Java的堆是JVM中最大的一塊內(nèi)存區(qū)域,主要保存Java中各種類(lèi)的實(shí)例。為了更好的管理堆中各個(gè)對(duì)象的內(nèi)存,包括分配內(nèi)存和回收內(nèi)存。

JVM將堆分成了幾塊區(qū)域:

新生代(Young)

新生代又分為:

Eden

From Survivor

To Survivor

老年代(Old)

其中新生代占堆的1/3空間,老年代占堆的2/3空間。

而新生代中的Eden占新生代的8/10,From Survivor和To Survivor各占新生代的1/10。

堆模型如圖:

從上圖中我們可以看出:堆是由新生代和老年代組成,默認(rèn)情況下,新生代 ( Young ) 與老年代 ( Old ) 的比例為 1:2 。其中,新生代 ( Young ) 又分為 Eden 和 From Survivor 、To Survivor區(qū)域。默認(rèn)情況下,Eden 和from、to的比例為 :8 : 1 : 1 。JVM 每次只會(huì)使用 Eden 和其中的一塊 Survivor 區(qū)域來(lái)為對(duì)象服務(wù),所以無(wú)論什么時(shí)候,總是有一塊 Survivor 區(qū)域是空閑著的。因此,新生代實(shí)際可用的內(nèi)存空間為 9/10 ( 即90% )的新生代空間。

堆的GC機(jī)制

堆中的GC分為兩種:

Minor GC

Full GC

Minor GC發(fā)生在新生代,采用的算法是復(fù)制算法。

Java中新創(chuàng)建的對(duì)象都在新生代中,當(dāng)對(duì)象被判定為死亡時(shí)(也就是無(wú)法訪問(wèn)),就會(huì)被GC回收內(nèi)存,發(fā)生Minor GC時(shí),會(huì)將Eden和From Survivor區(qū)域中的存活的對(duì)象復(fù)制到To Survivor區(qū)域中,然后將Eden和From survivor區(qū)域進(jìn)行清理。

當(dāng)一個(gè)對(duì)象活過(guò)了一次Minor GC后,它的年齡就加1,當(dāng)對(duì)象的年齡達(dá)到了15時(shí),對(duì)象就會(huì)被放入老年代。

Full GC發(fā)生在老年代,采用的是標(biāo)記-清除算法。

標(biāo)記:標(biāo)記的過(guò)程其實(shí)就是,遍歷所有的GC Roots,然后將所有GC Roots可達(dá)的對(duì)象標(biāo)記為存活的對(duì)象。

清除:清除的過(guò)程將遍歷堆中所有的對(duì)象,將沒(méi)有標(biāo)記的對(duì)象全部清除掉。

當(dāng)程序運(yùn)行期間,若可以使用的內(nèi)存被耗盡的時(shí)候,GC線程就會(huì)被觸發(fā)并將程序暫停,隨后將依舊存活的對(duì)象標(biāo)記一遍,最終再將堆中所有沒(méi)被標(biāo)記的對(duì)象全部清除掉,接下來(lái)便讓程序恢復(fù)運(yùn)行。

標(biāo)記-清除算法存在比較大的缺點(diǎn):

進(jìn)行GC時(shí)需要暫停應(yīng)用程序,所以導(dǎo)致用戶體驗(yàn)變差

會(huì)產(chǎn)生許多不連續(xù)的內(nèi)存空間

所以我們一般會(huì)避免出現(xiàn)Full GC。

JVM參數(shù)

堆的初始大小、新生代、老年代的大小都可以通過(guò)JVM的參數(shù)進(jìn)行配置。

下面是一些常用的JVM參數(shù):

-Xms初始堆大小。如:-Xms256m-Xmx最大堆大小。如:-Xmx512m-Xmn新生代大小。通常為 Xmx 的 1/3 或 1/4。新生代 = Eden + 2 個(gè) Survivor 空間。實(shí)際可用空間為 = Eden + 1 個(gè) Survivor,即 90%-Xss線程的堆棧大小-XX:NewRatio新生代與老年代的比例,如 –XX:NewRatio=2,則新生代占整個(gè)堆空間的1/3,老年代占2/3-XX:SurvivorRatio新生代中 Eden 與 Survivor 的比值。默認(rèn)值為 8。即 Eden 占新生代空間的 8/10,另外兩個(gè) Survivor 各占 1/10-XX:PermSize永久代(方法區(qū))的初始大小-XX:MaxPermSize永久代(方法區(qū))的最大值-XX:+PrintGCDetails打印 GC 信息

下面是Eclipse的JVM參數(shù)配置方法:

Window --- Preferences --- Java --- Installed JREs --- 點(diǎn)擊Edit

在Default VM arguments中添加參數(shù):

總結(jié)

本文我們學(xué)習(xí)了JVM堆GC的分代機(jī)制,堆分為新生代和老年代,新生代中采用Minor GC,使用的是復(fù)制算法,老年代中采用Full GC,使用的是標(biāo)記-清除算法。

總結(jié)

以上是生活随笔為你收集整理的jvm垃圾回收机制_JVM 垃圾回收机制之堆的分代回收的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。