
1.JVM基礎
JVM就是java虛拟機,每一個JVM都包括堆,棧,本地方法棧、方法區,指令計數器及其他隐含寄存器。
堆:負責存儲對象執行個體。
棧:存儲基本類型和對象的引用。
方法區:存放着類的靜态變量,常亮,類的資訊等。
本地方法棧:與棧相類似,隻不過存放的是方法。
舉例:
String address= "beijing"
此時會向棧中壓入一個叫address棧,在堆中開辟一塊記憶體空間存放beijing,其中address存放着beijing這塊記憶體空間的位址。而這樣有什麼好處呢,當還有另一個對象也叫beijing時我們把記憶體位址給他就好了,不用額外開辟另一塊記憶體空間了。
2.類的加載
當了解JVM結構之後,就時JVM的運作流程。
我們運作程式,就時運作一個個編譯好的類,首先類加載器使用二進制的方式先加載類,放于方法區内,然後在堆上建立一個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此時會清理年老代的記憶體。
4.垃圾回收算法
垃圾回收分為三種算法
1.标記-清除
就時在堆中查找每塊記憶體是否有棧在使用這塊堆記憶體,沒有就清理掉,但是這樣會産生大量的磁盤碎片。
2.複制
為了解決第一種問題。把記憶體分為兩部分,把正在使用的記憶體複制到另一塊記憶體中,不過這樣的缺點是需要兩倍的空間。
3.标記-整理
此方法采用了以上兩種方法的特點,此方法分為兩個階段
1.标記出沒被使用的記憶體并清除掉。
2.将剩餘的記憶體空間集中到連續的空間上。