1. 程式人生 > >java基礎篇之GC

java基礎篇之GC

概述

java和C++有著一堵 記憶體動態分配 和 垃圾收集技術 圍成的“高牆”,外面的人想進去,裡面的人想出來。

java垃圾回收

GC(Garbage Collection) 的歷史比java還要久遠,1960年誕生的Lisp語言當時就在考慮三個問題:

  1. 哪些記憶體需要回收
  2. 什麼時候回收
  3. 如何回收
  • 對於java來說,包括程式計數器,棧記憶體 ,他們隨執行緒生,隨執行緒滅,方法結束後記憶體也就回收了(記憶體洩漏後面在討論);
  • 堆記憶體就不同了,一個介面的多個實現類可能需要的記憶體不同,一個方法的多個分支需要的記憶體也可能有區別,我們只有在程式執行的時候才知道建立了哪些物件,這部分的記憶體分配和回收都是動態的。所以堆是我們主要分析的區域。 下面來回答上面的三個問題
  1. 哪些記憶體需要回收 已經“死掉”的物件,需要回收,所以垃圾收集器的第一件工作就是區分哪些物件還在存活。一般有兩種策略 ①引用計數演算法, 給物件中新增一個引用計數器,每當有一個地方引用它時,計數器值就加1;當引用失效時,計數器值就減1;任何時刻計數器為0的物件就是不可能再被使用的。該方法實現簡單,效率高,但是它很難它很難解決物件之間相互迴圈引用的問題。所以,大多數jvm判斷物件是否存活基本並沒有採取該方法。 ②可達性分析演算法 在這裡插入圖片描述