jvm-垃圾收集
概述
說起垃圾收集,大部分人都把這項技術當做Java語言的伴生產物。其實,GC主要就是考慮完成三件事情:
- 哪些記憶體需要回收
- 什麼時候回收
- 如何回收、
經過半個多世紀的發展,目前記憶體的動態分配與記憶體的回收技術已經相當成熟,一切看起來都進入“自動化”時代,那為什麼我們還要去了解GC和記憶體分配呢?
其實答案很簡單,當需要排查各種記憶體溢位時,記憶體洩漏時,當垃圾收整合為系統達到更高併發量的瓶頸時,我們就需要對這些自動化的技術實施監控調節。
說明:我們主要關注堆記憶體的回收,而在堆裡面存放著Java世界幾乎所有的例項物件
哪些物件還“存活著”,哪些已經“死去”呢(不能再被任何途徑使用的物件)
-
引用計數演算法
引用計數演算法:給物件中新增一個引用計數器,每當有一個地方引用它時,計數器值就加1;當引用失效時,計數器值就減1;任何計數器為0的物件就是不可能再被使用的。
優點:實現簡單,判定效率高。
缺點:無法解決物件之間迴圈依賴的問題
-
可達性分析演算法
可達性分析演算法:通過一系列稱為“GC Roots”的物件作為起始點,從這些節點開始向下搜尋,搜尋所走過的路徑稱為引用鏈,當一個物件到GC Roots 沒有任何引用鏈相連時,則證明此物件是不可用的。
在Java語言中,可作為GC Rootsde 的物件包括下面幾種:
- 虛擬機器棧(棧幀中的本地變量表)中引用的物件
- 方法區中類靜態屬性引用的物件
- 方法區中常量引用的物件
- 本地方法棧(Native方法)引用的物件
對比這兩種演算法,可以發現,都與引用相關。
談談引用
Java裡面的引用可以分為強引用,軟引用,弱引用,虛引用四種,這四種引用強度依次減弱。
強引用 :強引用就是指在程式程式碼之間普遍存在的,類似“Object obj = new Object()”這類的引用,只要強引用還在,垃圾收集器永遠不會回收被引用的物件。
軟引用 :軟引用就是用來描述一些還有用但並非必需的物件。對於軟引用關聯著的物件,在系統將要發生記憶體溢位異常之前,將會把這些物件列進回收範圍之中進行第二次回收。如果這次回收還沒有足夠的記憶體,才會丟擲記憶體溢位異常。
弱引用 :弱引用也是用來描述非必需物件的,但是他的強度比軟引用更弱一些,被弱引用關聯的物件只能生存島下一次垃圾收集發生之前。當垃圾收集器工作的時候,無論當前記憶體是否足夠,都會回收掉只被弱引用關聯的物件。
虛引用 :虛引用也稱為幽靈引用或者幻影引用,它是最弱的一種引用關係。一個物件是否有虛引用的存在,完全不會對其生存時間構成影響,也無法通過虛引用取得一個物件例項。為一個物件設定虛引用關聯的唯一目的就是能在這個物件被收集器回收時收到一個系統通知。
垃圾收集演算法
常見的垃圾收集演算法有如下幾種: