Java程序執行流程及對應的jvm內存結構

大致流程:

首先xx.java文件–編譯—>.class文件–加載–>方法區–解釋運行.class文件
詳細執行流程需結合視頻看:
鏈接: https://pan.baidu.com/s/14eFyuyGHG7VevFqrqvx4dw 提取碼: 45iy

jvm運行區內存結構詳解:

運行程序時候爲程序簡單理解爲分配三個區域:
棧(棧幀:每個方法對應一個棧幀)
堆(實例對象)
方法區(.class 類信息)

  1. JVM找到包含main方法的類(入口類),然後將該類加載到方法區中。 此時方法區包含該類的成員變量,成員方法(包括main方法)。
  2. 執行main方法,此時在棧開闢一片區域用於main方法的執行。進入main方法裏面,第一句是聲明一個對象引用變量,此時要用到一個新的類,將該類加載到方法區中,同樣的類Phone在方法區的內容和之前類是一樣的(類的成員變量,類的成員方法)。
  3. 接着運行到new語句,執行該語句需要在堆中開闢一片區域,用於對象的存儲。對象的創建根據類的聲明來的,由於類可以看成是成員變量和成員方法的集合,所以堆中的對象也開闢了相應的空間用於存儲成員變量和成員方法,不同的是,成員方法是指向類型,即指向方法區該類的成員函數的地址(由於使用相同類創建的對象在調用成員方法的時候都是調用相同的方法,所以沒有必要爲每一個對象分配方法空間)。
  4. 接着,程序運行到one.brand語句,將該語句從方法區加載到棧中,由於one是對對象的引用(地址),所以根據該引用找到了剛纔在堆中分配的對象,然後訪問該對象的成員變量
  5. 接着程序運行到one.call();由於函數的執行需要在棧中進行,所以在棧中開闢一片新區域,並且將根據one找到堆中的對象,剛纔提到堆中的對象裏的成員函數實際是指向方法區的指針,所以執行的call()是從方法區中加載。將call()方法加載到新開闢的棧區域後程序流程跳轉到該棧區域並且執行程序。當call()執行完後,分配的空間被回收。程序流程跳轉到main方法中剛纔離開的地方,也就是one.call()語句後並繼續執行。
  6. 同理,當main方法指向完後,分配的棧區域被回收。程序結束。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章