用過 C 語言的開發人員都知道,記憶體的管理一直都是個頭疼事, 得自己管理物件的生命週期,不當的記憶體釋放或者是使用可能會引起程式的異常,而 java 有 GC 這一個概念,能夠自動幫你釋放記憶體,我們來看一下它是如何管理記憶體的

  GC 的意思就是 Garbage Collections, 意思就是垃圾回收的意思,java 會判斷一個物件是否到了他的生命盡頭 (不用了) 來對他進行一個垃圾回收。

  首先要回收垃圾肯定得先判斷哪個是垃圾物件,有兩種方法

  1. 引用計數法,這種方法每個物件在生成的時候都有一個計數,只要有物件引用他,該數就加一,有物件和他斷了聯絡就減一,知道該物件的計數到 0,這個時候就被當成垃圾物件,被回收掉,但是該方法有缺點,就是不能解決迴圈引用的問題,例如 a 引用 b,b 引用 c , c 引用 a,此時三個物件的計數均不等於 0,垃圾回收器就不能回收掉他們

  2. 可達法也叫跟搜尋法, 引用了一個根的概念,任何物件的引用能到達跟的都不算是垃圾物件。當然, 也不能一下把它錘死, 但是如果是兩次都是他的話, 達不了根的都是垃圾物件

  其次就是垃圾回收的演演算法,共有下面幾種

  1. 標記清除法 , 首先把垃圾物件標記, 標記完垃圾物件後, 就清除

  其原理就是在一塊記憶體區域中標記多個垃圾獨物件, 當然對個垃圾物件的位置也可能是不同的, 這就會出現一個缺點, 會出現記憶體碎片, 當要分配一個連續的空間時就不能使用該記憶體區域了, 而且標記過程和清除過程的效率都不算太高, 所以說這只是一個最基礎的演演算法.

  2. 標記壓縮演演算法, 此演演算法可以說是解決了標記清除演演算法所遺留的問題, 也就會記憶體碎片, 該演演算法會先標記垃圾物件, 然後把垃圾物件放到記憶體區域的一邊, 不是垃圾物件的放到記憶體區域的另一邊, 然後清除垃圾物件, 該演演算法的優點就是不會出現記憶體碎片, 但是會改變原始的位置.

  3. 複製演演算法, 該演演算法是把記憶體區域分為兩塊大小相同的區域, 當一塊區域的記憶體滿了的時候, 會把存活物件複製到另一個快記憶體區域裡面, 然後清除原來的記憶體塊兒, 把當前使用的做為正在使用的, 這樣也沒有記憶體碎片的問題, 但缺點就是要把記憶體分為兩塊兒, 在存活物件比較多的時候, 要進行多次的複製, 這樣也會使效率變低

  JAVA 中的分代收集演演算法

  因為各種物件的生命週期不一致, 所以我們把他們分為新生代和老年代

  新生代都是一些生命週期比較短的物件, 我們就是用複製演演算法, 老年代都是一些生命週期比較長的物件我們就使用標記清除 和 標記壓縮 來清除垃圾物件。