自動垃圾回收

   不支持垃圾回收的語言的資源管理方式,以下一小段c語言代碼c++

void foo() { char* p=new char[128]; ... // 對p指向的內存進行賦值
    funcl(p); // 使用內存指針
 delete[] p; }

 

   各類非預期的緣由,例如因爲開發者的疏忽致使最後的delete語句沒有被調用,都會引起內存泄漏問題。假如該函數被調用的很是頻繁,那麼觀察該進程執行時,會發現該進程所佔用的內存會一直瘋長,直至佔用全部系統內存並致使程序崩潰,而若是泄漏的是系統資源的話,那麼後果會比較嚴重,甚至致使系統奔潰。算法

   手動管理內存的另一個問題就是因爲指針的處處傳遞而沒法肯定什麼時候能夠釋放指針所指向的內存塊。假如代碼中某個位置釋放了內存,而另外一些地方還在使用指向這塊內存的指針,那麼這些指針就變成了所謂的「野指針」或者「懸空指針」,對這些指針進行的任何讀寫操做都會致使不可預料的後果。函數

   go語言做爲一門新生的開發語言,固然不能忽略內存管理這個問題。又由於go語言沒有c++複雜的指針計算功能,所以能夠很天然的包含垃圾回收功能。由於垃圾回收功能的支持,開發者無需擔憂所指向的對象失效的問題,所以,go語言不須要delete關鍵字,也不須要free方法來明確釋放內存。例如,若是用go語言,開發者徹底不用考慮什麼時候須要釋放以前分配的內存問題,系統會自動幫咱們判斷,並在合適的時候(好比cpu相對空閒的時候)進行自動垃圾收集工做。性能

   到目前爲止,內存泄漏的最佳解決方案是在語言級別引入自動垃圾回收算法(簡稱GC)。所謂垃圾回收,即全部的內存分配動做都會被在運行時記錄,同時任何對該內存的使用也都會被記錄,而後垃圾回收器會對全部已經分配的內存進行跟蹤監測,一旦發現有些內存已經再也不被任何人使用,就階段性的回收這些沒人用的內存。固然,由於須要儘可能最小化垃圾回收的性能損耗,以及下降對正常程序執行過程的影響,現實中的垃圾回收算法要比這個複雜的多,好比爲對象增長年齡屬性等。spa

相關文章
相關標籤/搜索