1. 程式人生 > >jvm的垃圾回收和內存

jvm的垃圾回收和內存

垃圾 普通 spa 占用 程序員 改變 局部變量 組織 並不是

垃圾回收:

  對象的創建是我們程序員主導的,但是卻沒有與之相對應的delete方法來刪除我們用完的對象,釋放這些我們已經不需要再使用的對象的內存空間,gc:垃圾回收機制:指的就是JVM自帶的一種釋放無用對象占用的內存的一種手段

程序員的輔助手段:

  將引用改變為指向其他的對象(或NULL),暗示JVM ,這個對象已經沒有引用指向,可以被回收;

  在方法內創建局部變量,利用彈棧的特點,使得局部變量失效;

理解:

  當我們從代碼中無需再使用某個對象時,它即為無用,所占看見應被回收;

  垃圾回收機的出現可以有效的防止內存溢出和內存泄漏;

gc怎麽知道該對象是否可以被回收,需了解的兩種方法: 引用計數 -

對象引用遍歷

註意的是:JVM主要的活動區域為 堆內存

  引用計數:

    早期的JVM使用的方法,會儲存對象的所有引用數,會控制這個引用數的多少,在引用數為0的時候,則 視為可以進行垃圾回收

  對象引用遍歷:

    現在大部分JVM采用的方法,從一組對象開始,沿著該對象涉及到的對象形成一個樹 ( 自己理解 ),通過遞歸的方式,確定可達對象,不可達對象就會被視為不再需要,將其進行標記作為垃圾收集,釋放對應的內存,但是釋放的內存都是離散的,不是連續的,不足於裝載新的對象,很多GC會有優化操作,會重新組織內存中的對象,並進行壓縮,形成連續的內存空間供使用。

引用對象的強度:

  引用對象:包裝了我們實際需要的對象,使我們可以直接維護對引用對象的直接引用

    可以理解為:給某個對象的引用進行了一層增強,使其擁有了其他的狀態,我們可以根據他的狀態進行辨別

  對象在沒有任何引用指向的時候才會被當作垃圾回收,如果我們想對有引用指向的對象做垃圾回收處理,這個 時候就涉及到了引用對象的概念,引用對象的強度將決定垃圾回收器的行為,註意:我們普通使用的引用都是強度最大的引用,強度可分為一下幾種:

      強可達:普通的引用

      軟可達:

      弱可達:

      虛可達:

      不可達: 沒有引用指向

  對象的可達性狀態會觸發垃圾回收期作出相應的行為:

    軟可達對象可能會任憑垃圾回收器去回收;

    若可達對象將會被垃圾回收器回收;

    虛可達對象並不是真正的可達,介於可達和不可達之間,為什麽說可達呢,因為它的存在可以防止對象在顯式清除虛可達引用之前被回收,為什麽又說他是不可達呢,因為無法通過PhantomReference訪問其指稱對象, 其get方法總是返回null.

jvm的垃圾回收和內存