一篇文章帶你領略——JVM運行原理揭祕

JVM運行時數據區

線程共享全部線程能訪問這塊內存數據,隨虛擬機或GC而建立和銷燬算法

線程獨佔每一個線程都會有它獨立的空間,隨線程生命週期而建立和銷燬數組

線程安全問題:共享資源的搶佔、線程共享的內存區域安全

方法區

方法區做用:存儲加載的類信息、常量、靜態變量、JIT編譯後的代碼等數據佈局

GC:方法區存在垃圾回收,但回收效率低;回收主要針對常量池的回收。和類型的卸載;當方法區沒法知足內存需求時,報OOM。spa

方法區屬於Java虛擬機協議,好比Hotsport虛擬機是對其具體實現,實現的時候會去實現方法區,堆內存,垃圾回收GC,永久代是對方法區的實現,新生代,老年代對堆內存實現,jdk1.8就變了,以元數據來實現方法區。線程

堆內存

做用:惟一的目的就是存放對象實例,幾乎全部對象、數組都是在這裏存放3d

對於大多數應用來講,堆是JVM管理的內存中最大的一塊內存區域,也是最容易OOM的區域對象

大多數JVM都將堆實現爲大小可擴展的(經過-Xmx、-Xms)控制blog

思考問題一:堆中存儲了對象,那到底存儲了什麼?

Java對象在內存中的佈局

思考問題二:對象什麼時候被回收?

一、引用計數法(沒法解決兩個對象相互引用沒法回收問題,致使內存泄露,JVM確定不回去使用這種方式)生命週期

二、可達性分析算法

主流的商用程序語言(Java、C#)都是經過可達性分析算法來斷定對象是否存活的,

GC Roots能夠是:一、虛擬機棧;二、方法中靜態屬性引用對象;三、方法區中常量引用對象;四、Native方法引用對象。

虛擬機棧

虛擬機棧:線程中方法執行的模型,每一個方法執行時,就會在虛擬機棧中建立一個棧幀,每一個方法從調用到執行的過程,就對應棧幀在虛擬機棧中從入棧到出棧過程。

Java線程本質是:從邏輯上來理解,開啓一個Java線程,new Thread(()->{線程執行的業務代碼})

main->show()->show1()->shou2()這樣的調用鏈路,先進後出,就是,也就是表明虛擬機棧方法調用邏輯

虛擬機棧中的元素在邏輯上表明方法,表明方法的棧元素就叫作棧幀。

局部變量表

動態連接

方法裏的局部變量並非一致存在,只有在方法調用的時候纔會存在,只有在方法調用纔會有方法入棧。

返回值地址

本地方法棧、直接內存

本地方法棧:和虛擬機棧功能相似,虛擬機棧是爲虛擬機執行Java方法而準備,本地方法棧是爲虛擬機使用Native本地方法而準備的。

直接內存:JVM以外的內存,開發人員本身分配內存

class文件結構

如今看下整個過程執行流程

切換上下文方式,程序計數器來跟蹤。

相關文章
相關標籤/搜索