亚洲日本欧美日韩高观看,性高湖久久久久久久久,亚洲av成人噜噜无码网站,亚洲欧美日韩国产一区二区动图,亚洲欧美日韩国产精品一区二区


學(xué)AI,好工作 就找北大青鳥
關(guān)注小青 聽課做題,輕松學(xué)習(xí)
周一至周日
4000-9696-28

垃圾回收,從JVM開始

來源:北大青鳥總部 2023年07月05日 11:43

摘要: 在互聯(lián)網(wǎng)程序的世界里也存在垃圾回收的概念,那便是我們中大型應(yīng)用開發(fā)必用、使用的應(yīng)用程序占比超過80%的開發(fā)語言JAVA了。

關(guān)于垃圾回收分類,相信大家還是比較有感觸的。在垃圾回收條例中,從之前的可回收垃圾、不可回收垃圾,升級為把垃圾明確分為了廚余垃圾、可回收垃圾、有害垃圾、其它垃圾四大類。每個(gè)人都要養(yǎng)成垃圾分類、垃圾回收的意識(shí)。事實(shí)上在互聯(lián)網(wǎng)程序的世界里也存在垃圾回收的概念,那便是我們中大型應(yīng)用開發(fā)必用、使用的應(yīng)用程序占比超過80%的開發(fā)語言JAVA了。

所有的Java程序都是運(yùn)行在JVM(JAVAVirtualMachine,Java虛擬機(jī))中的,在Java程序運(yùn)行時(shí),JVM會(huì)為每個(gè)對象創(chuàng)建一塊內(nèi)存,并維護(hù)管理這塊內(nèi)存。現(xiàn)在最新的JDK版本(JAVADevelopmentKit,Java開發(fā)工具包,JVM運(yùn)行在JDK上)已到JDK13及以上了,因此通過下圖(JDK1.8)可以來看看JVM的內(nèi)存模型。在內(nèi)存模型中包含堆、虛擬機(jī)棧本地方法棧、方法區(qū)、程序計(jì)數(shù)器等等元素,堆主要用于存放所有的對象實(shí)例,實(shí)例創(chuàng)建后在此分配內(nèi)存;虛擬機(jī)棧是Java方法執(zhí)行的內(nèi)存模型,每個(gè)Java方法在執(zhí)行時(shí)都會(huì)同時(shí)創(chuàng)建一個(gè)棧幀,來存儲(chǔ)局部變量表、操作棧、動(dòng)態(tài)鏈接、方法返回地址等;本地方法棧則是服務(wù)于虛擬機(jī)使用到的Native方法;方法區(qū)是存儲(chǔ)虛擬機(jī)加載的元數(shù)據(jù)信息;元數(shù)據(jù)區(qū)主要是存儲(chǔ)方法名、方法變量等元數(shù)據(jù)信息;程序計(jì)數(shù)器主要是指明當(dāng)前線程所執(zhí)行的字節(jié)碼。因?yàn)镴ava對象主要在Heap堆區(qū)中運(yùn)行,因此總的來說,JVM管控的內(nèi)存就是Heap內(nèi)存、Non-Heap內(nèi)存。



一個(gè)Java程序的執(zhí)行如下圖所示,通過編譯成class文件,調(diào)用JVM的類加載子系統(tǒng),在內(nèi)存空間中創(chuàng)建對象、執(zhí)行對象,執(zhí)行結(jié)束后,進(jìn)行對象的內(nèi)存回收,也就是垃圾回收(GarbageCollection)



所謂垃圾回收,指的是JVM釋放掉那些沒有引用對象做占用的內(nèi)存空間,給新的對象使用。參照垃圾分類的思想,在JVM中也會(huì)根據(jù)對象的存活周期將對象分代,包含年輕代、老年代、持久代,通過內(nèi)存分代,可以更好的執(zhí)行垃圾回收,提高效率。年輕代用來存儲(chǔ)最近新創(chuàng)建的對象,在年輕代中存在的對象死亡是非??斓模瑸榱颂岣吣贻p代中的垃圾回收效率,年輕代又會(huì)劃分出Eden、Survivorfrom、Survivorto三個(gè)區(qū)域,年輕代的垃圾回收成為MinorGC;老年代用來存儲(chǔ)存活很久的對象,老年代的垃圾回收成為MajorGC;持久代存儲(chǔ)JVM運(yùn)行時(shí)的需要的Java庫的類和方法,一般由Java廠商指定,在JDK1.8之后,改名為metaspace元空間。



在JVM中內(nèi)存回收過程大概如下:對象在年輕代EdenSpace創(chuàng)建,當(dāng)EdenSpace內(nèi)存空間滿的時(shí)候,垃圾回收器就把所有在EdenSpace中的對象都掃描一次,把有效的對象復(fù)制到第一個(gè)SurvivorSpace(即Survivorfrom),無效的對象所占用的空間進(jìn)行釋放。當(dāng)EdenSpace再次變滿的時(shí)候,把EdenSpace中有效的對象移動(dòng)到第二個(gè)SurvivorSpace(即Survivorto),同時(shí)第一個(gè)SurvivorSpace的數(shù)據(jù)也會(huì)移動(dòng)到第二個(gè)SurvivorSpace。如果填充到Survivorto的對象被Survivorfrom或EdenSpace中的對象引用,那么系統(tǒng)會(huì)認(rèn)為它們生命周期比較長,就會(huì)把它們移動(dòng)到老年代。經(jīng)過年輕代和老年代來來回回的新建、回收(MinorGC、MajorGC),不斷的釋放內(nèi)存給程序用,如果不能夠釋放足夠的內(nèi)存空間,就會(huì)執(zhí)行FullGC,把所有在堆中運(yùn)行的線程清除。

那么年輕代和老年代又是使用什么算法進(jìn)行垃圾回收的呢?在年輕代中使用的是復(fù)制-清除算法,所謂復(fù)制清除算法指的是在執(zhí)行MinorGC時(shí),先將應(yīng)用程序掛起,將Eden和Survivorfrom中存活的對象復(fù)制到Survivorto當(dāng)中,然后清除掉Eden和Survivorfrom中的對象,MinorGC是很頻繁的。在老年代使用的是標(biāo)記-清除算法,在執(zhí)行MajorGC時(shí),把對象標(biāo)記出來,然后清除掉,MajorGC是比較低頻的。值得注意的是在GC時(shí)會(huì)產(chǎn)生很多內(nèi)存碎片,如果有較大的對象要從年輕代進(jìn)入老年代,但并不能找到合適的存儲(chǔ)空間時(shí),也會(huì)觸發(fā)GC。

垃圾回收算法是在垃圾回收器中實(shí)現(xiàn)和運(yùn)行的,在JDK廠商(包含OracleJDK、HPJDK、IBMJDK)中也提供了不同的垃圾收集器。對于年輕代實(shí)現(xiàn)分別是Serial收集器、ParallelScavenge收集器、ParNew收集器,在老年代中是SerialOld(Mark Sweep Compact)收集器、ParallelOld(PSMarkSweep)收集器、CMS(ConcurrentMarkSweep)收集器。

年輕代垃圾回收器中,Serial收集器是一種單線程收集器,使用單個(gè)GC線程進(jìn)行垃圾回收,在垃圾回收時(shí),將整個(gè)應(yīng)用程序掛起(stopthe world),然后復(fù)制-清除;ParallelScavenge是多線程收集器,使用多個(gè)GC線程進(jìn)行垃圾回收;ParNew也是一種多線程回收器,使用多個(gè)GC線程回收,可以和CMS一起使用。老年代垃圾回收器中,SerialOld是一種單線程回收器,使用單個(gè)線程進(jìn)行標(biāo)記-清除;ParallelOld是并行垃圾回收器,使用多個(gè)GC線程進(jìn)行垃圾回收;CMS是并行標(biāo)記垃圾回收器,它的特點(diǎn)是垃圾回收算法在后臺(tái)不會(huì)暫停應(yīng)用線程并實(shí)現(xiàn)大部分多垃圾回收。年輕代和老年代垃圾回收器之間的關(guān)系關(guān)聯(lián)可以見下圖所示。



垃圾回收真不是一件容易的事情啊!Java程序員可以通過開源免費(fèi)的Jprofier、Jconsle等工具監(jiān)控垃圾回收情況,也可以使用付費(fèi)的APM功能來進(jìn)行監(jiān)控。在垃圾回收不正常時(shí),可以運(yùn)行參數(shù)設(shè)置JVM堆內(nèi)存大小、新生代、持久代空間。使用-Xms可以設(shè)置堆的最小空間,-Xmx可以設(shè)置堆堆最大空間,-XX:NewSize可以設(shè)置新生代最小空間,-XX:MaxNewSize可以設(shè)置新生代最大空間,-XX:PermSize可以設(shè)置永久代最小空間,-XX:MaxPermSize可以設(shè)置永久代最大空間,-Xss可以設(shè)置每個(gè)線程的堆棧大小。比如java-Xmx 10240m -Xms 10240m-Xmn5120m就設(shè)置了JVM最大可用內(nèi)存時(shí)10240M,初始化內(nèi)存也是10240M,年輕代內(nèi)存為5120M。



當(dāng)你開始編程、愛上編程時(shí),你會(huì)發(fā)現(xiàn)程序的世界和生活的世界是共通的。在JVM的垃圾回收中有分類、有回收規(guī)則、有監(jiān)控工具、有管理規(guī)則,這和我們生活中的垃圾分類不正好是一樣一樣的嗎?世界如此美妙,我等凡夫俗子就好好的生活,好好的編程吧~


標(biāo)簽: java
報(bào)名優(yōu)惠
免費(fèi)試聽
課程資料
官方微信
返回頂部
培訓(xùn)課程 熱門話題 站內(nèi)鏈接