jvm(1)---java內存模型

jvm主要由三個子系統構成:類加載子系統,運行時數據區(內存模型),執行引擎java

運行時數據區主要包括:jvm

1.本地方法棧:登記native方法,執行時加載本地方法庫函數

2.程序計數器:就是一個指針,用來存儲指向下一條執行指令的地址,也就是即將要執行的指令代碼,是一個很是小得空間,能夠忽略不計。性能

3.java棧:java線程執行方法的內存模型,一個線程對應一個棧,每一個方法在執行時都會建立一個棧幀,用於存儲局部變量表(引用),操做數棧,動態連接,方法出口等信息,不存在垃圾回收問題,生命週期和線程一致,線程結束該棧就釋放。能夠經過-Xss來設置棧空間。spa

4.方法區:類的全部字段和方法字節碼,以及一些特殊的方法,構造函數,接口定義,全部定義的方法的信息都存放在這。此外還包括靜態變量,常量,運行時常量池線程

5.java堆:虛擬機啓動時建立,用於存放對象實例,幾乎全部的對象都在堆上面分配內存,當對象沒法在該空間申請到內存就會拋出OutMemoryError異常,同時也是垃圾回收器主要管理的區域,能夠經過-Xmx/Xms來設置最大/最小堆3d

 其中1.2.3都是線程私有,4.5線程共享指針

 

線程私有java棧圖解對象

 

java堆詳解blog

新生代:類誕生、成長、消亡的區域,一個類在這裏產生,應用,最後被垃圾回收器收集,結束生命。
新生代分爲兩部分: 伊甸園區(Eden space:亞當,夏娃造人,這名字取得仍是頗有意義的)和倖存者區(Survivor pace) ,全部的類都是在伊甸園被new出來的。倖存區有兩個: 0區(Survivor 0 space(From))和1區(Survivor 1 space(To))。當伊甸園的空間用完時,程序又須要建立對象,JVM的垃圾回收器將對伊甸園區進行垃圾回收(Minor GC),將伊甸園區中的再也不被其餘對象所引用的對象進行銷燬。而後將伊甸園中的剩餘對象移動到倖存From。若幸From也滿了,再對該區進行垃圾回收,而後移動到To。From到To操做一次,還存在To中的對象就至關於長了一歲,默認是15歲,若是到了15歲都還存在有引用,那麼就放入老年代,能夠用過-XX:MaxTenuringThreshold來設置這個年齡

老年代:新生代通過屢次GC仍然存活的對象移動到老年區。若老年區也滿了,那麼這個時候將產生FullGC,進行老年區的內存清理。若老年區執行了Full GC以後發現依然沒法進行對象的保存,就會產生OOM異常「OutOfMemoryError」。能夠同過減小FullGC來提升jvm性能

永久代(元數據):jdk1.8元數據區取代了永久代,本質和永久代相似,都是對JVM規範中方法區的實現,區別在於元數據區並不在虛擬機中,而是使用本地物理內存,永久代在虛擬機中,永久代邏輯結構上屬於堆,可是物理上不屬於堆,堆大小=新生代+老年代。元數據區也有可能發生OutOfMemory異常。
Jdk1.6及以前: 有永久代, 常量池在方法區
Jdk1.7:有永久代,但已經逐步「去永久代」,常量池在堆
Jdk1.8及以後: 無永久代,常量池在元空間
元數據區的動態擴展,默認–XX:MetaspaceSize值爲21MB的高水位線。一旦觸及則Full GC將被觸發並卸載沒有用的類(類對應的類加載器再也不存活),而後高水位線將會重置。新的高水位線的值取決於GC後釋放的元空間。若是釋放的空間少,這個高水位線則上升。若是釋放空間過多,則高水位線降低。

相關文章
相關標籤/搜索