上海虹口網(wǎng)站建設(shè)公司網(wǎng)站設(shè)計案例
JVM的運行時內(nèi)存也叫做JVM堆,從GC的角度可以將JVM分為新生代、老年代和永久代。
其中新生代默認占1/3堆內(nèi)存空間,老年代默認占2/3堆內(nèi)存空間,永久代占非常少的對內(nèi)存空間。
新生代又分為Eden區(qū)、SurvivorFrom區(qū)和SurvivorTo區(qū), Eden區(qū)默認占8/10新生代空間,SurvivorFrom區(qū)和SurvivorTo區(qū)默認分別占1/10新生代空間;Eden區(qū)最小占3/5新生代空間,SurvivorFrom區(qū)和SurvivorTo區(qū)分別占1/5新生代空間,如下圖所示:

永久代
永久代指內(nèi)存的永久保存區(qū)域,主要存放Class和Meta(元數(shù)據(jù))的信息。Class在類加載時被放入永久。永久代和老年代、新生代不同,GC不會在程序運行期間對永久代的內(nèi)存進行清理,這也導(dǎo)致了永久代的內(nèi)存會隨著加載的Class文件的增加而增加,在加載Class文件過多時會拋出Out Of Memory異常,比如Tomcat引用Jar文件過多會導(dǎo)致JVM內(nèi)存不足而無法啟動。
需要注意的是,在Java 8 中永久代已經(jīng)被元數(shù)據(jù)區(qū)(也叫做元空間)取代。元數(shù)據(jù)區(qū)的作用和永久代類似,二者最大的區(qū)別在于:元數(shù)據(jù)區(qū)并沒有使用虛擬機內(nèi)存,而是直接使用操作系統(tǒng)的本地內(nèi)存。因此,元空間的大小不受JVM內(nèi)存的限制,之和操作系統(tǒng)的內(nèi)存有關(guān)。
在Java 8 中,JVM將類的元數(shù)據(jù)放入本地內(nèi)存(Native Memory)中,將常量池和類的靜態(tài)變量放入Java堆中,這樣JVM能夠加載多少元數(shù)據(jù)信息就不再由JVM的最大可用內(nèi)存(MaxPermSize)空間決定,而由操作系統(tǒng)的實際可用的內(nèi)存空間決定。
原文鏈接:https://blog.csdn.net/qq_45886144/article/details/124083079
一、四大垃圾回收算法
1、引用計數(shù)器算法
原理其實很簡單,給運行的對象添加一個引用計數(shù)器,每當有一個地方引用它時,計數(shù)器+1;當引用失效時,計數(shù)器就-1,任何時刻計數(shù)器為0的對象,就視作不可能再被使用。這一種方式,實現(xiàn)簡單,邏輯也清晰,大部分的情況下,它都可以達到很好的效果,盡管這樣,計數(shù)器算法還是存在但是的,但是它無法解決循環(huán)引用的場景,這也是主流Java虛擬機沒有選用這一算法的原因。
2、復(fù)制算法(Copying)
為了解決標記清除算法的效率問題,有人提出了復(fù)制算法。它將可用內(nèi)存一分為二,每次只用一塊,當這一塊內(nèi)存不夠用時,便觸發(fā) GC,將當前存活對象復(fù)制(Copy)到另一塊上,以此往復(fù)。這種算法高效的原因在于分配內(nèi)存時只需要將指針后移,不需要維護鏈表等。但它最大的問題是對內(nèi)存的浪費,使用率只有 50%。
但這種算法在一種情況下會很高效:Java 對象的存活時間極短。據(jù) IBM 研究,Java 對象高達 98% 是朝生夕死的,這也意味著每次 GC 可以回收大部分的內(nèi)存,需要復(fù)制的數(shù)據(jù)量也很小,這樣它的執(zhí)行效率就會很高。
優(yōu)點:沒有標記和清除的過程,效率高;沒有內(nèi)存碎片,可以利用bump-the-pointer實現(xiàn)快速內(nèi)存分配。
缺點:需要雙倍空間。
3、標記清除算法(Mark Sweep)
該算法很簡單,使用通過可達性分析方法標記出垃圾,然后直接回收掉垃圾區(qū)域。簡單粗暴,即標記刪除的對象,對其進行內(nèi)存回收;它的一個顯著問題是一段時間后,內(nèi)存會出現(xiàn)大量碎片,導(dǎo)致雖然碎片總和很大,但無法滿足一個大對象的內(nèi)存申請,從而導(dǎo)致 OOM,而過多的內(nèi)存碎片(需要類似鏈表的數(shù)據(jù)結(jié)構(gòu)維護),也會導(dǎo)致標記和清除的操作成本高,效率低下。
缺點:兩次掃描,耗時嚴重;會產(chǎn)生內(nèi)存碎片。
可達性算法
此算法的核心思想:通過一系列稱為“GC Roots”的對象作為起始點,從這些節(jié)點開始向下搜索,搜索走過的路徑稱為“引用鏈”,當一個對象到 GC Roots 沒有任何的引用鏈相連時(從 GC Roots 到這個對象不可達)時,證明此對象不可用。
4、標記壓縮算法(Mark Sweep)
只是在標記清除的基礎(chǔ)上,追加了碎片的散落問題,在清除之后進行了碎片的整理,但副作用是增了了GC的時間。
二、七大垃圾回收器
http://www.manongjc.com/detail/62-sjaactrbfltsjah.html