GC是什么? 為什么要有GC?


GC是垃圾收集的意思(Gabage Collection),內存處理是編程人員容易出現問題的地方,忘記或者錯誤的內存回收會導致程序或系統的不穩定甚至崩潰,Java提供的GC功能可以自動監測對象是否超過作用域從而達到自動回收內存的目的,Java語言沒有提供釋放已分配內存的顯示操作方法。

GC是垃圾收集器。Java 程序員不用擔心內存管理,因為垃圾收集器會自動進行管理。要請求垃圾收集,可以調用下面的方法之一:  
System.gc() 
Runtime.getRuntime().gc() 

Java是由C++發展來的。

它擯棄了C++中一些繁瑣容易出錯的東西。其中有一條就是這個GC。

寫C/C++程序,程序員定義了一個變量,就是在內存中開辟了一段相應的空間來存值。內存再大也是有限的,所以當程序不再需要使用某個變量的時候,就需要釋放這個內存空間資源,好讓別的變量來用它。在C/C++中,釋放無用變量內存空間的事情要由程序員自己來解決。就是說當程序員認為變量沒用了,就應當寫一條代碼,釋放它占用的內存。這樣才能最大程度地避免內存泄露和資源浪費。

但是這樣顯然是非常繁瑣的。程序比較大,變量多的時候往往程序員就忘記釋放內存或者在不該釋放的時候釋放內存了。而且釋放內存這種事情,從開發角度說,不應當是程序員所應當關注的。程序員所要做的應該是實現所需要的程序功能,而不是耗費大量精力在內存的分配釋放上。

Java有了GC,就不需要程序員去人工釋放內存空間。當Java虛擬機發覺內存資源緊張的時候,就會自動地去清理無用變量所占用的內存空間。當然,如果需要,程序員可以在Java程序中顯式地使用System.gc()來強制進行一次立即的內存清理。

 

 

 

因為顯式聲明是做堆內存全掃描,也就是 Full GC,是需要停止所有的活動的(Stop The World Collection),你的應用能承受這個嗎?而其顯示調用System.gc()只是給虛擬機一個建議,不一定會執行,因為System.gc()在一個優先級很低的線程中執行。 

 

 

首先JAVA和ASP.NET都有GC 

垃圾回收   (garbage   collection,   GC)      
  一個跟蹤過程,它傳遞性地跟蹤指向當前使用的對象的所有指針,以便找到可以引用的所有對象,然后重新使用在此跟蹤過程中未找到的任何堆內存。公共語言運行庫垃圾回收器還壓縮使用中的內存,以縮小堆所需要的工作空間 

因為你沒有足夠多內存,並且,你挺懶,不去自己清理內存,所以就有了   GC 



什么是GC 
GC的全稱是garbage collection,中文名稱垃圾回收,是.net中對內存管理的一種功能。垃圾回收器跟蹤並回收托管內存中分配的對象,定期執行垃圾回收以回收分配給沒有有效引用的對象的內存。當使用可用內存不能滿足內存請求時,GC會自動進行。 

在進行垃圾回收時,垃圾回收器回首先搜索內存中的托管對象,然后從托管代碼中搜索被引用的對象並標記為有效,接着釋放沒有被標記為有效的對象並收回內存,最后整理內存將有效對象挪動到一起。這就是GC的四個步驟。 

由上可見,GC是很影響性能的,所以一般說來這種事情況還是盡量少發生為好。 

為了減少一些性能影響,.net的GC支持對象老化,或者說分代的概念,代是對象在內存中相對存現時期的度量單位,對象的代數或存現時期說明對象所屬的代。目前.net的垃圾回收器支持三代。每進行一次GC,沒有被回收的對象就自動提升一代。較近創建的對象屬於較新的代,比在應用程序生命周期中較早創建的對象的代數低。最近代中的對象位於零代中。每一次GC的時候,都首先回收零代中的對象,只有在較低代數的對象回收完成后仍不能滿足需求的情況下才回收較高代數的對象。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM