本文非原創,翻譯自Java Garbage Collection introduction
在Java中爲對象分配和釋放內存空間都是由垃圾回收線程自動執行完成的。和C語言不同的是Java程序員不須要手動寫垃圾回收相關的代碼。這是使得Java如此流行,同時也是Java能幫助程序員寫出更好的Java應用的優勢之一。java
計劃寫一個介紹Java垃圾回收基礎的系列文章,共分四部分:程序員
Java垃圾回收簡介segmentfault
本文是這個系列的第一篇文章,這篇文章將會介紹一些基本術語,如:JDK,JVM,JRE,HotSpot VM,以及理解JVM的架構和Java堆內存結構。在開始學習Java垃圾回收機制以前確實有必要了解一下這些基本東西。spa
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組成。
每一個JVM的實如今對垃圾回收的原理的實現方式上會有一些不一樣。在收購SUN以前Oracle有JRockit JVM,收購SUN以後有了HotSpot虛擬機。目前Oracle同時維護了這兩個虛擬機,並宣稱未來會將兩個虛擬機合併。
HotSpot虛擬機是Oracle標準版平臺的核心組成部分。在本垃圾回收系列文章中咱們將經過HotSpot虛擬機來了解垃圾回收的基本準則。
下面的這幅圖歸納了一個JVM中的主要組成。在JVM架構中,堆內存和垃圾回收器這兩個部分和垃圾回收相關。堆內存是運行時用來存儲實例對象的數據空間,垃圾回收器運行在堆內存上。如今咱們大概知道它們是怎樣的一個工做模式。
在Java的內存模型中,最重要的是要了解堆內存的概念。運行時的Java實例對象存儲在堆內存空間中。當一個對象再也不被引用了,它變成可被從堆內存中回收空間。在垃圾回收的過程當中,這些對象將被從堆內存中清除,同時它們的空間也就被回收了。堆內存的空間主要分紅了三部分,
年輕代
a, Eden區(全部實例在運行時最初都分配到eden區中)
b, S0 Survivor Space(老一些的對象被從eden區移動到S0區,實際上是eden區中的對象通過一次對eden區的Young GC還存活的對象被移動到S0)
c, S1 Survivor Space(再老一些的對象被從S0區移動到S1區,實際上是在Young GC過程當中S0區已滿,則會將eden區中還存活的對象和S0區中的存活對象移動到S1區中)
老年代(通過S0,S1中幾輪迭代後還存活的對象被提高到老年代)
永久代(包含一些元數據像類、方法等等)
永久代空間在Java SE8特性中已經被移除