虛擬機棧: -> 棧幀---對應每個方法----> 包含: 局部變量表, 本地方法棧, 動態鏈接, 方法出口,
動態鏈接: 每個棧幀都保存了 一個 可以指向當前方法所在類的 運行時常量池, 目的是: 當前方法中如果需要調用其他方法的時候, 能夠從運行時常量池中找到對應的符號引用, 然后將符號引用轉換為直接引用,然后就能直接調用對應方法, 這就是動態鏈接
不是所有方法調用都需要動態鏈接的, 有一部分符號引用會在 類加載 解析階段, 將符號引用轉換為直接引用, 這部分操作稱之為: 靜態解析. 就是編譯期間就能確定調用的版本, 包括: 調用靜態方法, 調用實例的私有構造器, 私有方法, 父類方法
https://blog.csdn.net/denverj/article/details/84078460?utm_medium=distribute.pc_aggpage_search_result.none-task-blog-2allsobaiduend~default-2-84078460.nonecase&utm_term=jvm%E5%8A%A8%E6%80%81%E9%93%BE%E6%8E%A5%E6%98%AF%E4%BB%80%E4%B9%88
當編譯Java程序的時候,會得到程序中每一個類或者接口的獨立的class文件。雖然獨立看上去毫無關聯,但是他們之間通過接口(harbor)符號互相聯系,或者與Java API的class文件相聯系。當運行程序的時候,Java虛擬機裝載程序的類和接口,並且在動態連接的過程中把它們互相勾連起來。在程序運行中,Java虛擬機內部組織了一張互相連接的類和接口的網。
class把他們所有的引用符號放在一個地方——常量池。每一個class文件有一個常量池,每一個被Java虛擬機裝載的類或者接口都有一份內部版本常量池,被稱作運行時常量池。運行時常量池是特定與實現的數據結構,數據結構映射到class文件中的常量池。因此,當一個類型被首次裝載的時候,所有來自於類型的符號引用都裝載到了類型的運行時常量池。
在程序運行的過程中,如果某個特定的符號引用將要被使用,它首先要被解析。解析過程就是首先根據符號引用查找到實體,再把符號引用替換成直接引用的過程。因為所有的符號引用都是保存在常量池中,所以這種解析叫做常量池解析。