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