1. JVM是Java Virtual Machine(Java
虛擬機)的縮寫,JVM是一種用於計算設備的規範,它是一個虛構出來的計算機,是經過在實際的計算機上仿真模擬各類計算機功能來實現的。
引入Java語言虛擬機後,Java語言在不一樣平臺上運行時不須要從新編譯。Java語言使用Java虛擬機屏蔽了與具體平臺相關的信息,使得Java語言
編譯程序只需生成在Java虛擬機上運行的目標代碼(
字節碼),就能夠在多種平臺上不加修改地運行。
2.結構:
類加載器:把類加載到JVM中
內存結構:
1)程序計數器:記錄下一個要執行的命令的地址
線程私有:每一個線程有本身的計數器。
沒有內存溢出。
2)虛擬機棧:
每一個方法須要的內存稱爲一個棧幀,執行時先把一個方法的棧幀存入棧,而後再依次調用。棧幀中主要存放了參數,變量,返回地址等信息。
棧結構能夠處理方法嵌套的狀況下A(){ B(){ C(); }} 此時ABC依次存入棧,而後按CBA的順序執行。
棧幀中包含:
1.局部變量表: 存放局部變量
2.操做數棧: 執行方法內的代碼使用,和虛擬機棧工做原理差很少。
3.動態連接: 運行階段把符號變爲實體對象引用(指針)
4.方法出口: 指向調用方法的位置。好比A方法調用B方法,B結束後能夠繼續執行A。
常見面試:
虛擬機棧中不涉及垃圾回收
物理內存是必定的,因此棧幀越大,線程數越少。
線程私有保證了線程安全。在遞歸的時候不會亂。
棧內存溢出:通常是由於棧幀過多(遞歸忘了寫中止條件)
3)本地方法棧:
調用本地方法時使用的棧(native類型的方法,底部爲c或者c++)
4)堆:存放對象
線程共享,須要考慮安全問題
垃圾回收的主要工做對象
堆溢出:無限定義對象,或者一個對象無限大(無限添加的ArrayList)
5)方法區:存放方法中的運行時常量池,變量,方法數據,方法結構
線程共享
JVM啓動時被建立。邏輯上是堆的一部分(物理上1.8是在堆,1.8後是本地內存的元空間。)
內存溢出:Spring利用ClassWritter產生代理的時候可能會產生
執行引擎:執行代碼
解釋器
即時編譯器
垃圾回收(GC):回收堆中不用的對象。
常量池:本質是一個查詢表,爲指令提供常量符號,虛擬機指令根據常量池找到須要的方法,參數,符號,常數等。
運行時常量池:方法區中的一個組成部分。當類被加載時,裏面的常量池信息會被加載到運行時常量池中,並把符號轉化爲真實地址(好比常量池中可能有個符號Class,可是隻是個字符,在加載後會變成真正的Class類),以便在運行時使用。
類的生命週期:
1.加載:加載class
2.鏈接:
驗證:驗證文件正確性
準備:靜態變量分配內存,賦java的默認值
解析:靜態連接(符號變爲實體)加載這個類中用到的其餘類。
3.初始化: 變量賦值(程序員給的默認賦值),加載執行靜態代碼塊。 從這裏纔開始可能運行到java中的代碼。
4.使用:
5.卸載