閱讀原文:https://blog.csdn.net/singc/article/details/108646348
1 JVM內(nèi)存模型
談到垃圾回收娜搂,我們先回顧下JVM的內(nèi)存組成:
線程隔離性 | 內(nèi)存類型 | 用途 |
---|---|---|
線程隔離 | 1.本地方法棧 | 存儲JVM的native方法 |
2.虛擬機棧 | 存儲類方法里的局部變量婿屹、返回結(jié)果鏈接、程序執(zhí)行的字節(jié)位置等鼎姐,其生命周期與線程一致 | |
3.程序計數(shù)器 | 根據(jù)虛擬機棧中存儲的字節(jié)位置,在線程切換后找到上次執(zhí)行位置蜓耻。 | |
線程共享 | 1.堆 | 存儲對象實例和數(shù)組 |
2.方法區(qū)(永久代) | 存儲類加載文件灵嫌、常量、靜態(tài)變量等嗡官。在Java8中永久代被移除,由“元數(shù)據(jù)區(qū)”取代 | |
直接內(nèi)存 | NIO等 | 在JDK1.4時引入了NIO毯焕,可以不通JVM而由Native方法直接在系統(tǒng)內(nèi)存進行IO操作衍腥,顯著提升了效率 |
垃圾回收主要是針對堆內(nèi)存進行!
2 垃圾回收與算法
2.1 回收對象
垃圾回收對象通常是指已死亡的變量纳猫。常用的確認算法有2種:
- 引用計數(shù)法
- 可達性分析法
2.2 回收算法
- 標記算法
- 復制算法
- 標記-整理算法
垃圾回收器按照其算法特性不同婆咸,其在各分代中的使用也不同。
新生代(young generation)有三種GC:
-Serial(串行) : 只會使用1個cpu或線程進行垃圾回收芜辕,而且回收過程中尚骄,其他所有線程都必須暫停,直至回收結(jié)束侵续,被戲稱為“stop the world”倔丈。
應用場景:用戶端,由于是單線程運作状蜗,沒有線程交互的大開銷需五,故而效率很高,回收時間可以控制在毫秒級別轧坎,對于用戶而言幾乎沒有停頓感宏邮。
-ParNew
Paralle Scavenge(scavenge:打掃)老年代(teunred generation)也有三種GC:
CMS(Concurrent Mark Sweep)
Serial Old(MSC)
Paralle Old另外還有一個GC在新生代和老年代都會用到—— G1。
如圖所示共有7種GC缸血,如果有連線則表示二者可以搭配使用蜜氨。
未完待續(xù)...