天天看點

Java的jvm與gc概述

Java的jvm與gc概述

1.JVM基礎

JVM就是java虛拟機,每一個JVM都包括堆,棧,本地方法棧、方法區,指令計數器及其他隐含寄存器。

堆:負責存儲對象執行個體。

棧:存儲基本類型和對象的引用。

方法區:存放着類的靜态變量,常亮,類的資訊等。

本地方法棧:與棧相類似,隻不過存放的是方法。

舉例:

String address= "beijing"      

此時會向棧中壓入一個叫address棧,在堆中開辟一塊記憶體空間存放beijing,其中address存放着beijing這塊記憶體空間的位址。而這樣有什麼好處呢,當還有另一個對象也叫beijing時我們把記憶體位址給他就好了,不用額外開辟另一塊記憶體空間了。

2.類的加載

當了解JVM結構之後,就時JVM的運作流程。

Java的jvm與gc概述

我們運作程式,就時運作一個個編譯好的類,首先類加載器使用二進制的方式先加載類,放于方法區内,然後在堆上建立一個class對象,封裝類的資料結構,同時提供接口供方法區調用,在棧中存放着類的聲名,這樣我們完成了類的加載,然後在經過其處理就可以使用類了。(具體類加載的源碼和原理請參考-http://www.cnblogs.com/ityouknow/p/5603287.html)

3.GC

如果記憶體空間滿了改怎麼辦,JVM提供了GC-也就是垃圾回收機制。當記憶體溢出自動進行垃圾處理。

一般都是堆發生垃圾回收。而堆被分為了三部分分别是新生代 ,年老代,持久帶,新生代又被分為Eden、Survivor1、Survivor2這三塊,當一個對象被建立後會被放入eden中(較大的直接放入年老代中),當eden被存滿後會發生minor GC,此時eden會将記憶體中不用的空間清除并把剩餘的資料放入Survivor1,當下一次eden被存滿後,重複上次操作,eden和Survivor1中資料會一起存放進Survivor2中,直到Survivor1或Survivor2存放滿,這時會把存放滿的Survivor1或Survivor2資料存進年老代中,而當年老代被存滿後會發生full gc此時會清理年老代的記憶體。

Java的jvm與gc概述

4.垃圾回收算法

垃圾回收分為三種算法

1.标記-清除

Java的jvm與gc概述

就時在堆中查找每塊記憶體是否有棧在使用這塊堆記憶體,沒有就清理掉,但是這樣會産生大量的磁盤碎片。

2.複制

Java的jvm與gc概述

為了解決第一種問題。把記憶體分為兩部分,把正在使用的記憶體複制到另一塊記憶體中,不過這樣的缺點是需要兩倍的空間。

3.标記-整理

Java的jvm與gc概述

此方法采用了以上兩種方法的特點,此方法分為兩個階段

1.标記出沒被使用的記憶體并清除掉。

2.将剩餘的記憶體空間集中到連續的空間上。