淺談JVM的內存結構

JVM之內存結構

1.JDK體系結構
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

在這裏插入圖片描述
在這裏插入圖片描述
注意點:
方法出口:當調用完一個方法後,保存繼續往下面執行的代碼的位置指針。

②Math math = new Math(),中的new Math()存放在堆中,而math存放在棧中,只是開闢了一個內存空間而已。

方法區:方法區中主要存放常量、靜態變量、類信息等,比如private static final User user = new User(),靜態變量user存放在方法區中,也是指向堆。

本地方法棧:比如new Thread().start()中的start方法內部就用了private native void start0();這個本地方法,其本質使用C語言編寫的,它會去C語言的庫裏面找對應的實現(.dll文件相當於java中的xx.jar)。如果執行到了本地方法,本地方法棧就存放本地方法在運行時的內存空間。
⑤GCRoot:
在這裏插入圖片描述
堆內存:堆內存中有年輕代(1/3)和老年代(2/3),年輕代分成1個Eden Space(8/10)和2個Suvivor Space(2個1/10)。
假如部署了一個Web應用內,堆裏面存儲了大量的對象信息,當堆內存滿了還要往Eden區加入時,這時會找出所有的GC Roots對象(即對象有不斷的引用,最終成爲一條鏈,這條鏈上的GC Roots就標記爲非垃圾對象,將其複製到Survivor區中,而不在這條鏈上的對象就標記爲垃圾對象,將會被銷燬。比如程序結束時,堆裏面的對象就沒有引用了這時就不在這條鏈上,就被虛擬機回收了。)
在這裏插入圖片描述
垃圾回收機制詳解:當S0內存也滿了的時候,會再次對Eden+S0區域進行minor gc垃圾回收,還是之前的原則將在鏈上的GCC Roots複製到S1中,其餘的將會清理,同理,S1內存滿了會對Eden+S0+S1進行minnor gc垃圾回收,每次垃圾回收,其對象的分代年齡(在對象頭中)會+1,當S1中對象的分代年齡>=15(比如靜態常量、spring容器中的bean等等)複製在老年代中,當老年代的內存滿了會進行full gc即對整個堆包括方法區進行垃圾回收,但是當full gc回收不了什麼垃圾時,就會出現OOM(Out of Memory)。

STW:Stop the world,當虛擬機進行gc的時候會停止所有的用戶進程。設計STW的目的是:如果在gc的時候,用戶進程還在進行,就會去堆中找不斷引用的對象鏈,一旦用戶進程停止了,那些垃圾又得重新回收會導致很複雜、效率很低,因此是爲了提高性能。
在這裏插入圖片描述

虛擬機調優:最重要的就是評估內存模型,然後在調優。
分析內存模型:
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
調優過程:在這裏插入圖片描述
⑨補充:進入老年代的另外一個條件
在這裏插入圖片描述
.class文件的字節碼使用javap 命令進行反彙編的結果:
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章