說明:這篇文章來翻譯來自于Javapapers 的Java Garbage Collection Introduction
在Java中,對象內存空間的分配與回收是由JVM中的垃圾回收進程自動完成的。和C語言不一樣的是,開發中不需要在Java中寫垃圾回收代碼。這也是使Java更加流行而且幫助開發中寫出更好的Java應用程序的Java特性之一。
下面是關于Java 垃圾回收的基礎介紹的四個系列文章。
1.Java垃圾回收介紹
2.Java垃圾回收是如何工作的
3.Java垃圾回收器的類型
4.Java垃圾回收的監控和分析
這篇文章是四個系列指南的第一部分。它將首先解釋像JDK、JVM、JRE、HotSpot VM這樣的名詞,然后介紹JVM架構以及Java堆內存結構。因為在理解Java垃圾回收之前這些是一些了解的基礎。
主要的Java名詞
Java API:幫助開發者創建應用程序封裝庫的集合
Java Development Kit (JDK) :使開發者能夠創建Java應用程序的工具集。JDK包含了能夠編譯、運行、打包、發布和監控Java應用程序的工具。
- Java Virtual Machine (JVM) :JVM是一個抽象的計算機,Java程序是根據JVM規范來寫的。JVM是根據操作系統平臺來寫的,而且他們負責將java指令翻譯成底層平臺的規范指令并且運行他們。JVM使java程序保存平臺無關系。
Java Runtime Environment (JRE) :JRE由JVM實現和Java API組成。
Java HotSpot 虛擬機
每一個JVM的在垃圾回收方式的實現上可能是不同的。以前SUN被Oracle收購以前,他們使用JRockit JVM,但是在被Oracle收購之后,改成了HotSpot JVM。目前,Oracle擁有了這兩個JVM的實現,而且他們聲稱經過一段時間之后他們會把這兩個虛擬機的實現整合成一個。
HotSpot JVM已經作為了Oracle SE平臺的核心組件的一部分。在這個垃圾回收指南中,我們將看到基于HotSpot虛擬機的垃圾回收機制。
JVM 架構
下面的這張圖包含了在一個JVM中的核心組件。在一個JVM架構中,和垃圾回收相關的兩個主要組件是堆內存和垃圾回收器。堆內存是運行時數據區,就是實例存放的地方并且由垃圾回收器來來管理。現在我們就來了解這些東西是如何在更大的設計中相適應的。
Java堆內存
理解對內存在JVM內存模型中角色是很有必要的。在運行時Java實例被存儲在堆內存區。當一個對象不再被其他對象所引用的時候,它將會被從堆內存中回收。在垃圾回收進程中,這些對象被從堆內存中回收而且空間被釋放。堆內存只要有三個主要的區域:
- 1.年輕代(Young Generation)
- 1.Eden Space(任何進入運行時內存都會經過Eden區)
- 2.S0 Surivior Sapce(從Eden移到S0的實例對象)
- 3.S1 Surivior Sapce(從S0移到S1的更老實例對象)
- 2.老年代(Old Generation ,從S1到的區域)
- 3.永久代(Permanent Generation,包含像類、方法詳情的元數據信息)
更新:永久代(Permgen)區已經從Java SE8 功能被移除了