欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

JVM?中的?returnAddress過程詳解

 更新時(shí)間:2022年04月29日 09:21:57   作者:m0_67402013  
JVM的畢竟是個(gè)虛擬機(jī),是一種規(guī)范,雖說符合馮諾依曼的計(jì)算機(jī)設(shè)計(jì)理念,但是他并不是實(shí)體計(jì)算機(jī),所以他的組成也不是什么存儲(chǔ)器,控制器,運(yùn)算 器,輸入輸出設(shè)備,本文給大家介紹JVM?中的?returnAddress,感興趣的朋友一起看看吧

JVM是虛擬機(jī),也是一種規(guī)范,他遵循著馮·諾依曼體系結(jié)構(gòu)的設(shè)計(jì)原理。馮·諾依曼體系結(jié)構(gòu)中,指出計(jì)算機(jī)處理的數(shù)據(jù)和指令都是二進(jìn)制數(shù),采用存儲(chǔ) 程序方式不加區(qū)分的存儲(chǔ)在同一個(gè)存儲(chǔ)器里,并且順序執(zhí)行,指令由操作碼和地址碼組成,操作碼決定了操作類型和所操作的數(shù)的數(shù)字類型,地址碼則指出地址碼和 操作數(shù)。從dos到window8,從unix到ubuntu和CentOS,還有MAC OS等等,不同的操作系統(tǒng)指令集以及數(shù)據(jù)結(jié)構(gòu)都有著差異,而JVM通過在操作系統(tǒng)上建立虛擬機(jī),自己定義出來的一套統(tǒng)一的數(shù)據(jù)結(jié)構(gòu)和操作指令,把同一套語 言翻譯給各大主流的操作系統(tǒng),實(shí)現(xiàn)了跨平臺(tái)運(yùn)行,可以說JVM是java的核心,是java可以一次編譯到處運(yùn)行的本質(zhì)所在。

參考文檔:jvms12

數(shù)據(jù)類型

在 JVM 中,數(shù)據(jù)分為兩大類:primitive types (原生類型)和 reference types(引用類型)。

引用類型,讓 JVM 能更好的支持于面向?qū)ο笳Z言的設(shè)計(jì),引用類型的值用來指向內(nèi)存中分配的類實(shí)例或者數(shù)組。JVM 規(guī)范中并沒有詳細(xì)規(guī)定引用類型的實(shí)現(xiàn)細(xì)節(jié),比如引用應(yīng)該通過何種方式去定位、訪問堆中的對(duì)象,具體的對(duì)象訪問方式取決于虛擬機(jī)的具體實(shí)現(xiàn),比如 HotSpot 有其自己的實(shí)現(xiàn)方案。

目前主流的訪問方式有使用句柄和直接指針兩種:

其中使用直接指針訪問的方式,類似于 C++ 中的虛表(虛表就是指向?qū)ο箢愋蛿?shù)據(jù)的指針)。這兩種對(duì)象訪問方式各有優(yōu)劣,使用句柄訪問的最大好處就是 reference 中存儲(chǔ)的是穩(wěn)定的句柄地址,在對(duì)象被移動(dòng)(比如垃圾回收時(shí),整理內(nèi)存空間,會(huì)移動(dòng)對(duì)象的存儲(chǔ)位置)時(shí)只會(huì)改變句柄中示例數(shù)據(jù)的指針,而 reference 本身不需要修改。

使用直接指針訪問的最大好處就是速度更快,節(jié)省了一次內(nèi)存尋址的時(shí)間開銷。

原生數(shù)據(jù)類型包括:numeric types, boolean type, returnAddress type。其中 returnAddress 數(shù)據(jù)只存在于字節(jié)碼層面,與編程語言無關(guān),也就是說,我們?cè)?Java 語言中是不會(huì)直接與 returnAddress 類型的數(shù)據(jù)打交道的。

returnAddress 類型的值是指向字節(jié)碼的指針,不管是物理機(jī)還是虛擬機(jī),運(yùn)行時(shí)內(nèi)存中的數(shù)據(jù)總歸可分為兩類:代碼,數(shù)據(jù)。對(duì)于馮諾依曼結(jié)構(gòu)的計(jì)算機(jī),指令數(shù)據(jù)和數(shù)值數(shù)據(jù)都存儲(chǔ)在內(nèi)存中,而哈弗結(jié)構(gòu)的計(jì)算機(jī),將程序指令與數(shù)據(jù)分開存儲(chǔ)。

對(duì)于 JVM 來說,程序就是存儲(chǔ)在方法區(qū)的字節(jié)碼指令,而 returnAddress 類型的值就是指向特定指令內(nèi)存地址的指針。

JVM支持多線程,每個(gè)線程有自己的程序計(jì)數(shù)器(pc register),而 pc 中的值就是當(dāng)前指令所在的內(nèi)存地址,即 returnAddress 類型的數(shù)據(jù),當(dāng)線程執(zhí)行 native 方法時(shí),pc 中的值為 undefined。

棧幀

棧幀(Stack Frame)是用于支持虛擬機(jī)進(jìn)行方法調(diào)用和方法執(zhí)行的數(shù)據(jù)結(jié)構(gòu),棧幀中存儲(chǔ)了方法的局部變量表,操作數(shù)棧,動(dòng)態(tài)連接,和方法返回地址等信息。在程序編譯時(shí),棧幀中需要多大的局部變量表,多深的操作數(shù)棧都已經(jīng)完全確定了,并且寫在方法表的 Code 屬性中。

當(dāng)一個(gè)方法開始執(zhí)行后,只有兩種方式可以退出,第一種方式是執(zhí)行引擎遇到任意一個(gè)方法返回的字節(jié)碼指令,這種方式稱為正常完成出口;另外一種退出方式是,在方法執(zhí)行過程中遇到異常,且該異常沒有被被捕獲,稱為異常完成出口。

無論是哪種退出方式,在方法退出后,都需要返回到該方法被調(diào)用的位置(地址),讓程序繼續(xù)執(zhí)行。一般來說,方法執(zhí)行前,會(huì)保存調(diào)用者當(dāng)前的 PC 計(jì)數(shù)器中的值,當(dāng)方法正常退出時(shí),將該 PC 計(jì)數(shù)器的值會(huì)作為返回地址,返回給調(diào)用者。在方法異常退出時(shí),返回地址是通過異常處理器表來確定的。

方法退出的過程實(shí)際上就等于把當(dāng)前棧幀出棧,一般過程為:

  • 恢復(fù)上層方法的局部變量表和操作數(shù)棧
  • 把返回值壓入調(diào)用者棧幀的操作數(shù)棧中
  • 調(diào)整 PC 計(jì)數(shù)器的值,以指向方法調(diào)用指令后面的一條指令

到此這篇關(guān)于JVM 中的 returnAddress的文章就介紹到這了,更多相關(guān)JVM returnAddress內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 淺談Spring的兩種事務(wù)定義方式

    淺談Spring的兩種事務(wù)定義方式

    下面小編就為大家?guī)硪黄獪\談Spring的兩種事務(wù)定義方式。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-10-10
  • java jvm兩種存儲(chǔ)區(qū)的類型知識(shí)點(diǎn)講解

    java jvm兩種存儲(chǔ)區(qū)的類型知識(shí)點(diǎn)講解

    在本篇文章里小編給大家整理的是一篇關(guān)于java jvm兩種存儲(chǔ)區(qū)的類型知識(shí)點(diǎn)講解內(nèi)容,有興趣的朋友們可以學(xué)習(xí)下。
    2021-03-03
  • java的arrays數(shù)組排序示例分享

    java的arrays數(shù)組排序示例分享

    排序算法,基本的高級(jí)語言都有一些提供。C語言有qsort()函數(shù),C++有sort()函數(shù),java語言有Arrays類(不是Array)。用這些排序時(shí),都可以寫自己的排序規(guī)則
    2014-02-02
  • java設(shè)計(jì)模式之裝飾模式詳細(xì)介紹

    java設(shè)計(jì)模式之裝飾模式詳細(xì)介紹

    這篇文章主要介紹了java設(shè)計(jì)模式之裝飾模式,有需要的朋友可以參考一下
    2013-12-12
  • Java 并發(fā)編程之ThreadLocal詳解及實(shí)例

    Java 并發(fā)編程之ThreadLocal詳解及實(shí)例

    這篇文章主要介紹了Java 并發(fā)編程之ThreadLocal詳解及實(shí)例的相關(guān)資料,需要的朋友可以參考下
    2017-02-02
  • JAVA基礎(chǔ)快速從入門到精通

    JAVA基礎(chǔ)快速從入門到精通

    Java是一門面向?qū)ο蟮木幊陶Z言,不僅吸收了C++語言的各種優(yōu)點(diǎn),還摒棄了C++里難以理解的多繼承、指針等概念,因此Java語言具有功能強(qiáng)大和簡單易用兩個(gè)特征
    2022-03-03
  • Springboot @Import 詳解

    Springboot @Import 詳解

    這篇文章主要介紹了Springboot @Import 詳解,仔細(xì)看了下Springboot關(guān)于@Import的處理過程,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-11-11
  • Java IO流之原理分類與節(jié)點(diǎn)流文件操作詳解

    Java IO流之原理分類與節(jié)點(diǎn)流文件操作詳解

    流(Stream)是指一連串的數(shù)據(jù)(字符或字節(jié)),是以先進(jìn)先出的方式發(fā)送信息的通道,數(shù)據(jù)源發(fā)送的數(shù)據(jù)經(jīng)過這個(gè)通道到達(dá)目的地,按流向區(qū)分為輸入流和輸出流
    2021-10-10
  • java基于C/S結(jié)構(gòu)實(shí)現(xiàn)多線程聊天室

    java基于C/S結(jié)構(gòu)實(shí)現(xiàn)多線程聊天室

    這篇文章主要為大家詳細(xì)介紹了java基于C/S結(jié)構(gòu)實(shí)現(xiàn)多線程聊天室,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-01-01
  • Spring Boot的listener(監(jiān)聽器)簡單使用實(shí)例詳解

    Spring Boot的listener(監(jiān)聽器)簡單使用實(shí)例詳解

    監(jiān)聽器(Listener)的注冊(cè)方法和 Servlet 一樣,有兩種方式:代碼注冊(cè)或者注解注冊(cè)。接下來通過本文給大家介紹Spring Boot的listener(監(jiān)聽器)簡單使用,需要的朋友可以參考下
    2017-04-04

最新評(píng)論