最近在學Jvm的知識,把以前學過的東西作一下總結,儘可能本身復現出來數組
畫的明明很清晰的,爲啥我看着這麼糊...markdown
Java虛擬機主要由兩大系統和兩大組件構成,兩大系統分別是類加載子系統和執行引擎,兩大組件分別是運行時數據區和本地方法接口,這裏主要對運行時數據區作一下總結spa
運行時數據區分爲五個內存區域,分別是堆,方法區,虛擬機棧,本地方法棧,程序計數器,類加載子系統將字節碼文件的不一樣數據加載到不一樣的區域,執行引擎在執行命令時與運行時數據區的數據進行動態交互.(大概是這麼個意思,可能之後會有新的理解)線程
堆:堆是JVM內存中最大的一塊區域,是GC的主要工做區域,能夠位於物理上不連續,但邏輯上連續的空間,主要用來存放對象實例和數組,線程共享,當內存中沒有足夠的空間分配給新的實例,又沒法繼續擴展時就會出現OutOfMemoryError,堆根據垃圾回收又可再分爲新生代和老年代,新生代又可再分爲Eden空間,from survivor空間,to survivor空間code
方法區:線程共享,主要存儲類信息,靜態變量,常量以及編譯後的方法對應的二進制指令集等數據,同時方法區內部還包含運行時常量池,主要用來存儲編譯器生成的字面量和符號引用,內存有限在內存不足又沒法繼續申請時出現OutOfMemoryError,能夠申請不實現垃圾回收orm
虛擬機棧:線程私有,虛擬機棧是一個棧結構的空間,當每個方法開始執行的時候都會在虛擬機棧中來開闢一個棧楨,棧幀主要存儲方法執行時的局部變量表,操做數棧,動態連接以及方法出口等,當方法執行完畢後棧幀會被回收,一個方法從開始執行到執行結束對應了,棧幀從入棧到出棧的過程,當線程申請一個超出虛擬機規定上限的棧空間時就會出現StackOverFlowError,當棧沒法再爲新的方法分配棧幀又沒法繼續擴展時則出現OutOfMemory.對象
本地方法棧:線程私有,和虛擬機棧相似,區別是本地方法棧爲本地方法服務,本地方法是指用native關鍵字修飾,用C語言實現的方法,主要是用於彌補Java不方便的實現的一些功能,能夠直接和系統對接.一樣會出現上面兩種錯誤接口
程序計數器:線程私有,主要存儲虛擬機下一條要執行的指令地址,字節碼解釋器就是經過改變程序計數器的值來選取下一條要執行的指令,分支,循環,跳轉,異常處理都要依賴程序計數器來實現,若是正在執行的方法爲本地方法,則程序計數器的值爲null,而且本區域是虛擬機惟一沒有規定OutOfMemory的區域生命週期
以上線程共享區域生命週期隨着虛擬機的建立而建立,隨着虛擬機的消亡而消亡.線程私有的區域隨着線程建立而建立,隨着線程的消亡而消亡.內存
好了,就先到這裏吧,總感受有點少,之後再詳細寫一下