很久很久以前,在Java 1.1的年代里,我們經(jīng)常會(huì)看到System.gc這樣的調(diào)用——主動(dòng)對(duì)垃圾進(jìn)行回收。不過,在Java知識(shí)深入人心后,這樣的代碼就逐漸銷聲匿跡了——這是好現(xiàn)象,因?yàn)橹鲃?dòng)進(jìn)行垃圾回收是一個(gè)非常危險(xiǎn)的動(dòng)作。
之所以危險(xiǎn),是因?yàn)镾ystem.gc要停止所有的響應(yīng)( Stop the world),才能檢查內(nèi)存中是否有可回收的對(duì)象,這對(duì)一個(gè)應(yīng)用系統(tǒng)來說風(fēng)險(xiǎn)極大,如果是一個(gè)Web應(yīng)用,所有的請(qǐng)求都會(huì)暫停,等待垃圾回收器執(zhí)行完畢,若此時(shí)堆內(nèi)存(Heap)中的對(duì)象少的話則還可以接受,一旦對(duì)象較多(現(xiàn)在的Web項(xiàng)目是越做越大,框架、工具也越來越多,加載到內(nèi)存中的對(duì)象當(dāng)然也就更多了),那這個(gè)過程就非常耗時(shí)了,可能0.01秒,也可能是1秒,甚至是20秒,這就會(huì)嚴(yán)重影響到業(yè)務(wù)的正常運(yùn)行。
例如,我們寫這樣一段代碼:new String("abc"),該對(duì)象沒有任何引用,對(duì)JVM來說就是個(gè)垃圾對(duì)象。JVM的垃圾回收器線程第一次掃描(掃描時(shí)間不確定,在系統(tǒng)不繁忙的時(shí)候執(zhí)行)時(shí)把它貼上一個(gè)標(biāo)簽,說“你是可以被回收的”,第二次掃描時(shí)才真正地回收該對(duì)象,并釋放內(nèi)存空間,如果我們直接調(diào)用System.gc,則是在說“嗨,你,那個(gè)垃圾回收器過來檢查一下有沒有垃圾對(duì)象,回收-一-下”。瞧瞧看,程序主動(dòng)招來了垃圾回收器,這意味著正在運(yùn)行著的系統(tǒng)要讓出資源,以供垃圾回收器執(zhí)行,想想看吧,它會(huì)把所有的對(duì)象都檢查一遍,然后處理掉那些垃圾對(duì)象。注意哦,是檢查每個(gè)對(duì)象。
不要調(diào)用System.gc,即使經(jīng)常出現(xiàn)內(nèi)存溢出也不要調(diào)用,內(nèi)存溢出是可分析的,是可以查找出原因的,GC可不是一個(gè)好招數(shù)!
不要主動(dòng)進(jìn)行垃圾回收
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
相關(guān)閱讀更多精彩內(nèi)容
- 1.什么是垃圾回收? 垃圾回收(Garbage Collection)是Java虛擬機(jī)(JVM)垃圾回收器提供...
- 一. JVM內(nèi)存區(qū)域的劃分 1.1 java虛擬機(jī)運(yùn)行時(shí)數(shù)據(jù)區(qū) java虛擬機(jī)運(yùn)行時(shí)數(shù)據(jù)區(qū)分布圖: JVM棧(Ja...
- 一. JVM內(nèi)存區(qū)域的劃分 1.1 java虛擬機(jī)運(yùn)行時(shí)數(shù)據(jù)區(qū) java虛擬機(jī)運(yùn)行時(shí)數(shù)據(jù)區(qū)分布圖: JVM棧(Ja...
- 1.GC基本概念 在java中,程序員是不需要顯式的去釋放一個(gè)對(duì)象的內(nèi)存的,而是由虛擬機(jī)自行執(zhí)行。在JVM中有一個(gè)...