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


轉自:https://blog.csdn.net/hustwht/article/details/52109343

GC是垃圾收集的意思,內存處理是編程人員容易出現問題的地方,

忘記或者錯誤的內存回收會導致程序或系統的不穩定甚至崩潰,Java提供的GC功能可以自動監測對象是否超過作用域從而達到自動回收內存的目的,

Java語言沒有提供釋放已分配內存的顯示操作方法。Java程序員不用擔心內存管理,因為垃圾收集器會自動進行管理。要請求垃圾收集,可以調用下面的方法之一:

System.gc()或Runtime.getRuntime().gc(),但JVM可以屏蔽掉顯示的垃圾回收調用。 

 

垃圾回收可以有效的防止內存泄露,有效的使用可以使用的內存。垃圾回收器通常是作為一個單獨的低優先級的線程運行,不可預知的情況下對內存堆中已經死亡的或者長時間沒有使用的對象進行清除和回收,程序員不能實時的調用垃圾回收器對某個對象或所有對象進行垃圾回收。

在Java誕生初期,垃圾回收是Java最大的亮點之一,因為服務器端的編程需要有效的防止內存泄露問題,然而時過境遷,如今Java的垃圾回收機制已經成為被詬病的東西。移動智能終端用戶通常覺得iOS的系統比Android系統有更好的用戶體驗,其中一個深層次的原因就在於Android系統中垃圾回收的不可預知性。

 

 

垃圾回收的優點和原理,並考慮2種回收機制

1、java語言最顯著的特點就是引入了垃圾回收機制,它使java程序員在編寫程序時不再考慮內存管理的問題。 
2、由於有這個垃圾回收機制,java中的對象不再有“作用域”的概念,只有引用的對象才有“作用域”。 
3、垃圾回收機制有效的防止了內存泄露,可以有效的使用可使用的內存。 
4、垃圾回收器通常作為一個單獨的低級別的線程運行,在不可預知的情況下對內存堆中已經死亡的或很長時間沒有用過的對象進行清除和回收。 
5、程序員不能實時的對某個對象或所有對象調用垃圾回收器進行垃圾回收。

垃圾回收機制有分代復制垃圾回收、標記垃圾回收、增量垃圾回收

 

 

采用“分代式垃圾收集”。這種方法會跟Java對象的生命周期將堆內存划分為不同的區域,在垃圾收集過程中,可能會將對象移動到不同區域: 
- 伊甸園(Eden):這是對象最初誕生的區域,並且對大多數對象來說,這里是它們唯一存在過的區域。 
- 幸存者樂園(Survivor):從伊甸園幸存下來的對象會被挪到這里。 
- 終身頤養園(Tenured):這是足夠老的幸存對象的歸宿。年輕代收集(Minor-GC)過程是不會觸及這個地方的。當年輕代收集不能把對象放進終身頤養園時,就會觸發一次完全收集(Major-GC),這里可能還會牽扯到壓縮,以便為大對象騰出足夠的空間。

與垃圾回收相關的JVM參數:

·        -Xms / -Xmx —堆的初始大小 / 堆的最大大小

 

·        -Xmn — 堆中年輕代的大小

 

補充:

 

Java是由C++發展來的。

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

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

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

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

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


免責聲明!

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



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