首先在這里給大家推薦《深入理解jvm虛擬機》這本書,我只是一名搬用工
GC 全稱:Garbage Collections, java的垃圾回收機制,目的是為了不需要像C語言一樣由開發(fā)人員來對內(nèi)存進行維護和釋放,由系統(tǒng)來動態(tài)的分配內(nèi)存,避免內(nèi)存溢出
java虛擬機在執(zhí)行java程序的過程中會把它所管理的內(nèi)存劃分為若干個不同的數(shù)據(jù)區(qū)域
1運行時數(shù)據(jù)區(qū)域
每個線程單獨存儲,互不影響
1、程序計數(shù)器
2、java虛擬機棧
3、本地方法棧
各個線程共同持有
4、方法區(qū) 5、java堆
1、程序計數(shù)器
程序計數(shù)器(Program Counter Register)是一塊較小的內(nèi)存空間,它的作用可以看 做是當(dāng)前線程所執(zhí)行的字節(jié)碼的行號指示器。 如果線程正在執(zhí)行的是一個Java方法,這個計數(shù)器記錄的是正在執(zhí)行的虛擬機字節(jié) 碼指令的地址;如果正在執(zhí)行的是Natvie方法,這個計數(shù)器值則為空(Undefined )。此 內(nèi)存區(qū)域是唯一一個在Java虛擬機規(guī)范中沒有規(guī)定任何DutDfMemoryError情況的區(qū)域。
2、 Java虛擬機棧
與程序計數(shù)器一樣,Java虛擬機棧(Java Virtual Machine Stacks)也是線程私有的, 它的生命周期與線程相同。虛擬機棧描述的是Java方法執(zhí)行的內(nèi)存模型:每個方法被執(zhí) 行的時候都會同時創(chuàng)建一個棧幀( Stack Frame)用干存儲局部變量表、操作棧、動態(tài) 鏈接、方法出口等信息。每一個方法被調(diào)用直至執(zhí)行完成的過程,就對應(yīng)著一個棧幀在 虛擬機棧中從入棧到出棧的過程。
“?!本褪翘摂M機棧中的局部變 量表部分。
局部變量表存放了編譯期可知的各種基本數(shù)據(jù)類型(hoolean, byte, char. short.int, float, long, double)、對象引用(reference類型,它不等同于對象本身,根據(jù)不同的虛擬機實現(xiàn) 。局部變量表所需的內(nèi)存空間在編譯期間完成分配,當(dāng)進入一個 方法時一,這個方法需要在幀中分配多大的局部變量空間是完全確定的,在方法運行期間 不會改變局部變量表的大小。
3本地方法棧
木地方法棧C Native Method Stacks)與虛擬機棧所發(fā)揮的作用是非常相似的,其 區(qū)別不過是虛擬機棧為虛擬機執(zhí)行Java方法(也就是字節(jié)碼)服務(wù),而本地方法棧則 是為虛擬機使用到的Native方法服務(wù)
4 Java堆
對于大多數(shù)應(yīng)用來說,Java堆 ( Java Heap )是Java虛擬機所管理的內(nèi)存中最大的 一塊。Java堆是被所有線程共享的一塊內(nèi)存區(qū)域,在虛擬機啟動時創(chuàng)建。此內(nèi)存區(qū)域的 唯一目的就是存放對象實例,<font color=#FF0000 size=3>幾乎所有的對象實例都在這里分配內(nèi)存</font>。這一點在Java虛 擬機規(guī)范中的描述是:所有的對象實例以及數(shù)組都要在堆上分配,但是隨著JIT編譯器 的發(fā)展與逃逸分析技術(shù)的逐漸成熟,棧上分配、標(biāo)量替換優(yōu)化技術(shù)將會導(dǎo)致一些微妙 的變化發(fā)生,所有的對象都分配在堆上也漸漸變得不是那么“絕對”了
Java堆是垃圾收集器管理的主要區(qū)域,因此很多時候也被稱做“GC堆”。如果從內(nèi)存回收的角度看,由于現(xiàn)在 收集器從本都是采用的分代收集算法,所以Java堆中還可以細(xì)分為:新生代和老年代; 再細(xì)致一點的有Eden空間、From Survivor空間、To Survivor空間等。如果從內(nèi)存分配
5方法區(qū)
方法區(qū)(Method Area)與Java堆樣,是各個線程共享的內(nèi)存區(qū)域,‘<font color=#FF0000 size=3>用于存 儲已被虛擬機加載的類信息、常量、靜態(tài)變量、即時編譯器編譯后的代碼等數(shù)據(jù)</font>。雖 然lava虛擬機規(guī)范把方法區(qū)描述為堆的一個邏輯部分,但是它卻有一個別名叫做Non- Heap(非堆),目的應(yīng)該是與lava堆區(qū)分開來。