Java Garbage Collection Basics翻譯:Java的垃圾回收機制

原文:Java Garbage Collection Basics
https://www.oracle.com/webfolder/technetwork/tutorials/obe/java/gc01/index.html
注:原文中將不該被清理的對象成爲referenced object,該清理的對象稱爲unreferenced object。下面的翻譯中我用被使用和不被使用分別表示。其實Java中應該被清理的對象應該描述爲:從gc root開始搜索不到,而且經過第一次標記、清理後,仍然沒有復活的對象。

什麼是垃圾自動回收

垃圾自動回收是一個觀察堆內存的進程,檢查哪些對象還在使用,哪些不在使用了,清理不使用的對象。一個對象正在被使用(引用),說明這個對象是維持當前程序的一部分。一個不被使用(不被引用)的對象,就不會在被任何程序使用了,因此這部分內存可以釋放掉。
在C語言中,程序員需要手動分配和釋放內存。在Java中,釋放內存可以由垃圾回收器自動完成。下面是其基本過程。

第一步:標記

垃圾回收器會標記哪一部分內存正在被使用,哪一部分不被使用。下圖中,被使用的對象用藍色標記,不被使用的對象用黃色標記。爲了完成這個步驟,所有對象都需要被掃描。如果掃描所有對象,那麼這是會是一個非常耗時的工作。
在這裏插入圖片描述

第二步:普通刪除

普通刪除直接移除了不被使用的對象,留下了被使用的對象和指針。內存分配器可以將新對象分配到空位置。
在這裏插入圖片描述
在刪除不被使用的對象的基礎上,可以進一步優化。將剩餘的對象移動到一起(壓縮),留下連續的剩餘內存,這樣有新的對象時,內存分配會更快更簡單。
在這裏插入圖片描述

爲什麼有分代垃圾收集?

上面提到的,標記並壓縮JVM中所有的對象是非常低效的。被分配的對象越多,需要被回收的對象就越多,垃圾回收消耗的時間就越長。其實根據統計,大部分的對象的生命週期都很短。
這有一個數據,Y軸代表已分配的字節,X軸代表程序運行時間。在這裏插入圖片描述
如你所見,隨着時間推移,存活的對象越來越少。圖左邊的峯值也表明了,大部分對象生命週期都非常短。

JVM分代

利用上面分析的結論,可以提高JVM的效率。方法是,將堆被分成了更小的部分(分代),分別是初生代、老生代和永生代。
在這裏插入圖片描述
初生代是存放新對象的區域。當初生代填滿,會出發minor GC。minor GC會假定大部分對象都會被回收。初生代都是無用的對象,很快就可以完成回收,存活下來的對象會被轉移至老生代。
所有的minor GC都會觸發Stop the World事件。此時所有線程都會暫停,直到GC完成。
老生代用來存放存活得久的對象。一般會爲初聲代的對象的年齡設置一個閾值,如果年齡到達這個閾值,那麼就會被移到老生代。老生代也會被回收,通過major GC完成。
Major GC進行時也會觸發Stop the World事件,暫停所有線程。頻繁的major GC會使系統變慢,因爲major GC會掃描所有存活的對象。因此major GC應該儘量少執行。另外,GC運行時線程暫停的時間也會受垃圾回收器類型的影響。
永生代包含JVM用於描述應用程序中類和方法的元數據。JVM在運行時會根據應用程序使用的類填充永久代。此外,Java SE庫類和方法也會存儲在這裏。
如果JVM發現不再需要某些類,而另一些類需要空間時,會在full GC時回收空間。

分代垃圾收集過程

前面介紹了爲什麼堆被分成不同的代,現在看看這些代之間是如何協作的。後面的圖片將介紹JVM中的對象分配和老化過程。
首先,所有新對象都會被分配在eden。最開始兩個survivor都是空的。
在這裏插入圖片描述
eden填滿時,會觸發minor GC。
在這裏插入圖片描述
被使用的對象會被移動到第一個survivor,不被使用的對象會被從eden清除。
在這裏插入圖片描述
下一次minor GC,eden中會發生同樣的操作。不被使用的對象被清理,被使用的對象移動到survivor。然而,這一次會被移動到第二個survivor(S1)。並且上一次minor GC後在survivor(S0)中的的對象的年齡會加1,並移動到S1。對象被移動到S1後,S0和eden中的對象都會被清理。現在survivor中已經有不同年齡的對象了。
在這裏插入圖片描述
下一次GC還是重複上述步驟,只是兩個survivor的功能調換一下,被使用的對象會被移動到S0,S1和eden被清理。
在這裏插入圖片描述
一次minor GC後,如果有對象的年齡達到了一個閾值(比如圖中是8),那它就會被從新生代移到老生代。
在這裏插入圖片描述
隨着minor GC的不斷進行,對象會被逐漸移動到老生代。
在這裏插入圖片描述
這基本就是新生代的所有過程。最後major GC會清理並壓縮老生代。在這裏插入圖片描述

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