Java知識--垃圾回收

一,C/C++

學過C/C++的都應該非常清除,我們需要自己管理內存,每次動態分配的內存單位都需要自己手動進行釋放。如果忘記釋放C/C++編譯器並不會自動檢測出併爲你釋放該內存,這樣的話很容易導致內存泄漏。這也是C/C++比較難的原因之一。

二,Java

Java不需要關心對象的釋放,這個過程交給了垃圾回收器。Java的垃圾回收器會定期掃描棧和靜態存儲區,遍歷所有的引用,找出活的對象。

Java虛擬機是一種自適應的工作模式,它有兩種模式,一種是"標記-清掃"模式,一種是"停止-複製"模式。

Java虛擬機會進行檢測,他會自動切換工作模式,一般情況下要是沒有垃圾產生,他會切換到"標記-清掃",這種模式速度很慢,但是如果程序只產生少量垃圾或者不產生垃圾的時候這種模式就很快。但是這種模式會導致大量的不連續的堆空間。導致內存利用率比較低。

另一種模式是"停止-複製",這種模式並不是在後臺進行工作。而是會將程序停止,它也會掃描棧和靜態存儲區遍歷所有活的引用,然後停止程序運行,並將所有存活的對象從舊堆複製到新堆。這就導致了大量的內存複製行爲。內存分配以較大的"塊"爲單位,如果某個對象較大,它會佔用單獨的塊。複製行爲是以塊爲單位進行的。有了塊,垃圾回收器就可以將對象複製到廢棄的塊。每個塊都有年代數來記錄自己是否存活。通常塊在某處被引用,其年代數就加1,大型對象不會被複制,只是年代數加1,含有小型對象的那些塊就會被複制並整理。Java虛擬機會監視,如果所有的對象都很穩定,垃圾回收的效率降低就會切換爲"標記-清掃"模式。

同樣道理,Java虛擬機會跟蹤"標記-清掃"的效果,如果堆空間產生來大量的碎片的話,就會切換爲"停止-複製"模式。這就是"自適應"的由來。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章