當初看文檔的時候,了解到.net CLR中的Background GC機制,它類似于并發(fā)GC,當使得在做GC動作是,能夠同時進行內(nèi)存分配。這種機制顯著的減少的stop the world這種事情,使得GC的干擾最小化。
創(chuàng)新互聯(lián)公司是一家集網(wǎng)站建設,麟游企業(yè)網(wǎng)站建設,麟游品牌網(wǎng)站建設,網(wǎng)站定制,麟游網(wǎng)站建設報價,網(wǎng)絡營銷,網(wǎng)絡優(yōu)化,麟游網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強企業(yè)競爭力。可充分滿足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時我們時刻保持專業(yè)、時尚、前沿,時刻以成就客戶成長自我,堅持不斷學習、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實用型網(wǎng)站。
當初認為.net這招非常優(yōu)秀,足以鄙視JAVA,前幾天看JVM的書,發(fā)現(xiàn)JVM也有類似的機制,但是不叫后臺線程,而是稱作CMS(Concurrent Mark Sweep)。
從名字就可以看出并發(fā)標記清除的意思。CMS機制僅針對老年代上的垃圾(.net的后臺GC只在第2代上運行。年輕代上的垃圾由其他回收算法收集),它運行時,分成4個步驟:
初始標記,并發(fā)標記,重新標記和最后異步并發(fā)清除,其中初始標記和重新標記仍然會stop the world。從網(wǎng)上扒一張圖,可以看到
初始標記其實就是標記root對象,速度很快,而并發(fā)標記,就是順著root對象的引用鏈開始順藤摸瓜的做標記,并發(fā)的進行標記,可以看到,此處GC線程和用戶線程是同時運行的。
重新標記其實是對并發(fā)標記的一個補充修正,因為有些對象在并發(fā)標記后,又被釋放掉或者又被重新引用,導致之前的標記不準確,重新標記一次。重新標記這個動作的速度是非??斓摹=又l(fā)清理時,又是和用戶線程同時進行。因此,相比非并發(fā)的處理,這種機制有助于減少GC對用戶程序的影響。
不過CMS也有缺點,它雖然不會stop the world,但是會占用CPU資源,會拖慢程序。還有一個缺點CMS收集器無法處理浮動垃圾,可能出現(xiàn)“Concurrent Mode Failure”失?。ㄖ劣跒槭裁磿霈F(xiàn)這種失敗,書中也沒說的很清楚)。這種失敗導致另一次Full GC的產(chǎn)生。這招反而會影響性能。最后一個缺點是大多數(shù)標記清除算法共有的缺點,就是在回收后,可能會導致大量的碎片空間,當分配大對象的時候,但碎片太多找不到連續(xù)的大空間,也會導致一次Full GC。