細述 Java垃圾回收機制→Java Garbage Collection Introduction
計劃寫一個介紹Java垃圾回收基礎的系列文章,共分四部分:
- Java垃圾回收簡介
- Java垃圾回收器是如何工作的?
- 各種類型的Java垃圾回收器
- Java垃圾回收的監控和分析
本文是這個系列的第一篇文章,這篇文章將會介紹一些基本術語,如:JDK,JVM,JRE,HotSpot VM,以及理解JVM的架構和Java堆內存結構。在開始學習Java垃圾回收機制之前確實有必要了解一下這些基本東西。
關鍵的Java術語
- Java API–一個幫助程序員創建Java應用的打包好的庫集合
- Java Development Kit(JDK)–一個使得程序員能夠開發Java應用的工具集合
- Java Virtual Machine(JVM)–JVM是一個抽象的計算機。Java程序是針對JVM規范寫的。JVM是根據不同的操作系統平臺實現的,它將Java指令翻譯成對應平臺上的指令,并執行。這樣Java程序能夠達到平臺獨立性。
- Java Runtime Environment(JRE)–JRE由一個JVM的實現和Java API組成。
Java HotSpot虛擬機
每個JVM的實現在對垃圾回收的原理的實現方式上會有一些不同。在收購SUN之前Oracle有JRockit JVM,收購SUN之后有了HotSpot虛擬機。目前Oracle同時維護了這兩個虛擬機,并宣稱將來會將兩個虛擬機合并。
HotSpot虛擬機是Oracle標準版平臺的核心組成部分。在本垃圾回收系列文章中我們將通過HotSpot虛擬機來了解垃圾回收的基本準則。
JVM 架構
下面的這幅圖概括了一個JVM中的主要組成。在JVM架構中,堆內存和垃圾回收器這兩個部分和垃圾回收相關。堆內存是運行時用來存儲實例對象的數據空間,垃圾回收器運行在堆內存上。現在我們大概知道它們是怎樣的一個工作模式。
Java 堆內存
在Java的內存模型中,最重要的是要了解堆內存的概念。運行時的Java實例對象存儲在堆內存空間中。當一個對象不再被引用了,它變成可被從堆內存中回收空間。在垃圾回收的過程中,這些對象將被從堆內存中清除,同時它們的空間也就被回收了。堆內存的空間主要分成了三部分,
- 年輕代
a, Eden區(所有實例在運行時最初都分配到eden區中)
b, S0 Survivor Space(老一些的對象被從eden區移動到S0區,其實是eden區中的對象經過一次對eden區的Young GC還存活的對象被移動到S0) - 老年代(經過S0,S1中幾輪迭代后還存活的對象被提升到老年代)
- 永久代(包含一些元數據像類、方法等等
c, S1 Survivor Space(再老一些的對象被從S0區移動到S1區,其實是在Young GC過程中S0區已滿,則會將eden區中還存活的對象和S0區中的存活對象移動到S1區中)
永久代空間在Java SE8特性中已經被移除