詳細(xì)畫(huà)的jvm模型圖
https://www.processon.com/diagraming/64c8aa11c07d99075d934311
官方網(wǎng)址
https://www.oracle.com/webfolder/technetwork/tutorials/obe/java/gc01/index.html
相關(guān)概念
-
年輕代是所有新對(duì)象被分配和老化的地方。當(dāng)年輕代填滿(mǎn)時(shí),這會(huì)導(dǎo)致minor garbage collection,minor gc會(huì)回收掉很多的游離對(duì)象。游離的年輕代很快就被收集起來(lái)。一些幸存的最終轉(zhuǎn)移到老年代。
-
Stop the World Event(STW),所有minor gc都是STW。這意味著所有應(yīng)用程序線程都將停止,直到操作完成。
-
老年代用于存儲(chǔ)長(zhǎng)期存活的對(duì)象。通常,為年輕代對(duì)象設(shè)置閾值,當(dāng)達(dá)到該年齡時(shí),對(duì)象將移動(dòng)到老年代。最終需要回收老年代。此事件稱(chēng)為major garbage collection。
-
major gc也會(huì)觸發(fā)STW。通常,major gc會(huì)更慢,因?yàn)樗婕八谢顒?dòng)對(duì)象。因此,對(duì)于響應(yīng)式應(yīng)用程序,應(yīng)盡量減少major gc。
分代垃圾回收過(guò)程:
1.首先,任何新對(duì)象都被分配到eden區(qū)。兩個(gè)幸存區(qū)一開(kāi)始都是空的。
2.當(dāng)eden區(qū)填滿(mǎn)時(shí),將觸發(fā)minor gc
3.引用的對(duì)象將移動(dòng)到S0。清除eden,將刪除未引用的對(duì)象。
4.在下一個(gè)minorGC中,eden也會(huì)發(fā)生同樣的事情。未引用的對(duì)象將被刪除,引用的對(duì)象將移動(dòng)到幸存者區(qū)。但是,在這種情況下,它們被移動(dòng)到第二個(gè)幸存者區(qū) (S1)。此外,來(lái)自第一個(gè)幸存者區(qū) (S0) 上最后一次minor GC 的對(duì)象會(huì)增加其年齡并移動(dòng)到 S1。一旦所有幸存的物體都被移動(dòng)到S1,S0和Eden都會(huì)被清除。請(qǐng)注意,我們現(xiàn)在在幸存者區(qū)s1中有不同年齡age的對(duì)象
5.在下一次minor GC 中,重復(fù)相同的過(guò)程。然而,這一次幸存者空間切換了。引用的對(duì)象將移動(dòng)到 S0。幸存的對(duì)象會(huì)老化age+1。eden和S1被清除。
6.這里為了演示,當(dāng)年齡對(duì)象達(dá)到一定的年齡閾值(在本例中為 8)時(shí),它們將從新生代晉升為老年代
7.隨著minor GC 的繼續(xù)出現(xiàn),對(duì)象將繼續(xù)提升到老年代
8.這幾乎涵蓋了年輕代的整個(gè)過(guò)程。最終,將對(duì)老年代進(jìn)行major GC,以清理和壓縮該空間
常用的設(shè)置項(xiàng)
設(shè)置項(xiàng) | 描述 |
---|---|
-Xms | Sets the initial heap size for when the JVM starts. 設(shè)置 JVM 啟動(dòng)時(shí)的初始堆大小 |
-Xmx | Sets the maximum heap size.設(shè)置堆最大值 |
-Xmn | Sets the size of the Young Generation.設(shè)置年輕代最大值 |
-XX:PermSize | Sets the starting size of the Permanent Generation.設(shè)置永久代的起始值 |
-XX:MaxPermSize | Sets the maximum size of the Permanent Generation設(shè)置永久代的最大值 |
案例:下面是一個(gè)簡(jiǎn)單的開(kāi)始Java2Demo的例子:
java -Xmx12m -Xms3m -Xmn1m -XX:PermSize=20m -XX:MaxPermSize=20m -jar c:\javademos\demo\jfc\Java2D\Java2demo.jar
java垃圾回收算法
1.標(biāo)記-清除法:通過(guò)gc root 標(biāo)記所有被程序引用的對(duì)象,然后清理沒(méi)有被標(biāo)記的對(duì)象??偣卜譃閮蓚€(gè)階段:標(biāo)記和清除
缺點(diǎn):
1.效率較低,標(biāo)記和清除兩個(gè)動(dòng)作都需要遍歷所有對(duì)象,并且在GC時(shí),都需要暫停應(yīng)用程序,對(duì)于交互性比較要求比較高的應(yīng)用而言這種體驗(yàn)非常差
2.會(huì)產(chǎn)生內(nèi)存碎片,通過(guò)標(biāo)記清除法清理出來(lái)的內(nèi)存碎片化較為嚴(yán)重,因?yàn)楸磺謇淼膶?duì)象存在于內(nèi)存的各個(gè)角落,所以清理出來(lái)的內(nèi)存不是連貫的
2.標(biāo)記-整理法:是在標(biāo)記清除法的基礎(chǔ)上進(jìn)行了優(yōu)化,和上面的一種算法標(biāo)記階段是一樣的,不同的是在清除階段,不是簡(jiǎn)單的清除未標(biāo)記的對(duì)象,而是將所有的已經(jīng)標(biāo)記的存活對(duì)象移向一端,然后清除該端以為的所有內(nèi)存。
缺點(diǎn):解決了標(biāo)記清除法碎片化問(wèn)題,同時(shí)多了整理的這一步,對(duì)象移動(dòng)內(nèi)存位置的步驟,其效率有一定的影響
3.復(fù)制算法:這是一種將內(nèi)存空間分為兩個(gè)部分的垃圾回收算法,通常稱(chēng)為“From”空間和“To”空間。在分配內(nèi)存時(shí),對(duì)象會(huì)被分配到From空間。當(dāng)From空間占滿(mǎn)一定比例時(shí),觸發(fā)垃圾回收過(guò)程。垃圾回收器會(huì)遍歷From空間,將存活的對(duì)象復(fù)制到To空間,并按照順序排列。然后,回收整個(gè)From空間,將其標(biāo)記為空閑的內(nèi)存,然后將From空間和To空間交換角色
缺點(diǎn):如果內(nèi)存中的垃圾對(duì)象較多,需要復(fù)制的對(duì)象少,這種情況下使用這個(gè)算法比較合適效率較高,反之,不合適。
垃圾回收器的分類(lèi)
分類(lèi)方式:按線程數(shù)分、按照工作模式分、按碎片處理方式分、按工作的內(nèi)存區(qū)間分
按線程數(shù)分
- 可以分為串行垃圾回收器(Serial Collector)和并行垃圾回收器(Parallel Collector)。
- 串行回收指的是在同一時(shí)間段內(nèi)只允許有一個(gè) CPU 用于執(zhí)行垃圾回收操作,此時(shí)工作線程被暫停,直至垃圾收集工作結(jié)束。
- 和串行回收相反,并行收集可以運(yùn)用多個(gè) CPU 同時(shí)執(zhí)行垃圾回收,因此提升了應(yīng)用的吞吐量,不過(guò)并行回收仍然與串行回收一樣,采用獨(dú)占式,使用了 STW 機(jī)制。
按照工作模式分
- 可以分為并發(fā)式垃圾回收器和獨(dú)占式垃圾回收器。
- 并發(fā)式垃圾回收器與應(yīng)用程序線程交替工作,以盡可能減少應(yīng)用程序的停頓時(shí)間。
- 獨(dú)占式垃圾回收器一旦運(yùn)行,就停止應(yīng)用程序中的所有用于線程,直到垃圾回收過(guò)程完全結(jié)束。
按碎片處理方式分
- 可以分為壓縮式垃圾回收器和非壓縮式垃圾回收器。
- 壓縮式垃圾回收器會(huì)在回收完成后,對(duì)存活對(duì)象進(jìn)行壓縮整理,消除回收后的碎片。(再分配對(duì)象空間使用指針碰撞)
- 非壓縮式的垃圾回收器不進(jìn)行這步操作。(再分配對(duì)象空間使用空閑列表)
按工作的內(nèi)存區(qū)間分
- 又可分為年輕代垃圾回收器和老年代垃圾回收器
設(shè)置案例
串行回收器
要啟用串行回收器(Serial Collector)使用,請(qǐng)執(zhí)行以下操作:-XX:+UseSerialGC
下面是用于啟動(dòng)Java2Demo的示例命令行:
java -Xmx12m -Xms3m -Xmn1m -XX:PermSize=20m -XX:MaxPermSize=20m -XX:+UseSerialGC -jar c:\javademos\demo\jfc\Java2D\Java2demo.jar
并行回收器
也稱(chēng)為吞吐量回收器。因?yàn)樗梢允褂枚鄠€(gè) CPU 來(lái)加快應(yīng)用程序吞吐量。當(dāng)需要完成大量工作并且可以接受長(zhǎng)時(shí)間暫停時(shí),應(yīng)使用此回收器。例如,批處理,如打印報(bào)表或帳單,或執(zhí)行大量數(shù)據(jù)庫(kù)查詢(xún)。-XX:+UseParallelGC
使用此命令行選項(xiàng),您將獲得具有單線程老年代回收器的多線程年輕代回收器。該選項(xiàng)還執(zhí)行老年代代的單線程壓縮。
下面是用于啟動(dòng)Java2Demo的示例命令行:
java -Xmx12m -Xms3m -Xmn1m -XX:PermSize=20m -XX:MaxPermSize=20m -XX:+UseParallelGC -jar c:\javademos\demo\jfc\Java2D\Java2demo.jar
-XX:+UseParallelOldGC
通過(guò)該選項(xiàng),GC 既是多線程年輕代回收器,又是多線程老年代收集器。它也是一個(gè)多線程壓縮收集器。HotSpot僅在老一代中進(jìn)行壓縮。熱點(diǎn)中的年輕一代被認(rèn)為是復(fù)制家;因此,不需要壓縮。
壓縮描述了以對(duì)象之間沒(méi)有孔的方式移動(dòng)對(duì)象的行為。垃圾回收掃描后,活動(dòng)對(duì)象之間可能會(huì)留下孔洞。壓實(shí)會(huì)移動(dòng)對(duì)象,以便沒(méi)有剩余的孔。垃圾回收器可能是非壓縮收集器。因此,并行收集器和并行壓縮收集器之間的區(qū)別可能是后者在垃圾回收掃描后壓縮空間。前者不會(huì)。
下面是用于啟動(dòng) 的示例命令行:Java2Demo
java -Xmx12m -Xms3m -Xmn1m -XX:PermSize=20m -XX:MaxPermSize=20m -XX:+UseParallelOldGC -jar c:\javademos\demo\jfc\Java2D\Java2demo.jar
并發(fā)標(biāo)記掃描 (CMS) 回收器
并發(fā)標(biāo)記掃描 (CMS) 回收器(也稱(chēng)為并發(fā)低暫?;厥掌鳎?。它嘗試通過(guò)與應(yīng)用程序線程同時(shí)執(zhí)行大部分垃圾回收工作來(lái)最大程度地減少由于垃圾回收而導(dǎo)致的暫停。通常,并發(fā)低暫?;厥掌鞑粫?huì)復(fù)制或壓縮活動(dòng)對(duì)象。垃圾回收是在不移動(dòng)活動(dòng)對(duì)象的情況下完成的。如果碎片成為問(wèn)題,請(qǐng)分配更大的堆。
注意:年輕代的CMS回收器使用與并行回收器相同的算法。
要啟用 CMS 回收器,請(qǐng)使用:-XX:+UseConcMarkSweepGC
并設(shè)置線程數(shù),請(qǐng)使用:-XX:ParallelCMSThreads=<n>
下面是用于啟動(dòng)Java2Demo的示例命令行:文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-626957.html
java -Xmx12m -Xms3m -Xmn1m -XX:PermSize=20m -XX:MaxPermSize=20m -XX:+UseConcMarkSweepGC -XX:ParallelCMSThreads=2 -jar c:\javademos\demo\jfc\Java2D\Java2demo.jar
G1 垃圾收集器
Garbage First 或 G1 垃圾回收器在 Java 7 中可用,旨在作為 CMS 回收器的長(zhǎng)期替代品。G1 收集器是一個(gè)并行、并發(fā)且增量壓縮的低暫停垃圾回收器,其布局與前面描述的其他垃圾回收器完全不同。
要啟用 G1 收集器,請(qǐng)使用:-XX:+UseG1GC
下面是用于啟動(dòng)Java2Demo的示例命令行:文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-626957.html
java -Xmx12m -Xms3m -XX:+UseG1GC -jar c:\javademos\demo\jfc\Java2D\Java2demo.jar
到了這里,關(guān)于JVM的組件、自動(dòng)垃圾回收的工作原理、分代垃圾回收過(guò)程、可用的垃圾回收器類(lèi)型的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!