轉自:https://blog.csdn.net/hustwht/article/details/52109343java
GC是垃圾收集的意思,內存處理是編程人員容易出現問題的地方,程序員
忘記或者錯誤的內存回收會致使程序或系統的不穩定甚至崩潰,Java提供的GC功能能夠自動監測對象是否超過做用域從而達到自動回收內存的目的,編程
Java語言沒有提供釋放已分配內存的顯示操做方法。Java程序員不用擔憂內存管理,由於垃圾收集器會自動進行管理。要請求垃圾收集,能夠調用下面的方法之一:服務器
System.gc()或Runtime.getRuntime().gc(),但JVM能夠屏蔽掉顯示的垃圾回收調用。 spa
垃圾回收能夠有效的防止內存泄露,有效的使用可使用的內存。垃圾回收器一般是做爲一個單獨的低優先級的線程運行,不可預知的狀況下對內存堆中已經死亡的或者長時間沒有使用的對象進行清除和回收,程序員不能實時的調用垃圾回收器對某個對象或全部對象進行垃圾回收。.net
在Java誕生初期,垃圾回收是Java最大的亮點之一,由於服務器端的編程須要有效的防止內存泄露問題,然而時過境遷,現在Java的垃圾回收機制已經成爲被詬病的東西。移動智能終端用戶一般以爲iOS的系統比Android系統有更好的用戶體驗,其中一個深層次的緣由就在於Android系統中垃圾回收的不可預知性。線程
一、java語言最顯著的特色就是引入了垃圾回收機制,它使java程序員在編寫程序時再也不考慮內存管理的問題。
二、因爲有這個垃圾回收機制,java中的對象再也不有「做用域」的概念,只有引用的對象纔有「做用域」。
三、垃圾回收機制有效的防止了內存泄露,能夠有效的使用可以使用的內存。
四、垃圾回收器一般做爲一個單獨的低級別的線程運行,在不可預知的狀況下對內存堆中已經死亡的或很長時間沒有用過的對象進行清除和回收。
五、程序員不能實時的對某個對象或全部對象調用垃圾回收器進行垃圾回收。對象
垃圾回收機制有分代複製垃圾回收、標記垃圾回收、增量垃圾回收blog
採用「分代式垃圾收集」。這種方法會跟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()在一個優先級很低的線程中執行。