1. 程式人生 > >java虛擬機器棧 相關操作

java虛擬機器棧 相關操作

針對JVM虛擬棧 和棧幀的操作

 

 

虛擬機器棧:

  棧元素是棧幀。方法呼叫,棧幀入棧,反之出棧。

棧幀:一個方法的執行空間。

  1、區域性變量表:方法定義的區域性變數、方法的引數存在該表。

    例項方法中有個隱含引數“this”,所以例項方法可以訪問該類的例項變數和其他例項方法。

    區域性變量表中變數的存放順序:this(如果是例項方法)=>引數(如果有)=> 定義的區域性變數(如果有)

    slot是區域性變量表中的空間單元,虛擬機器規範規定:

        1、32位之內的資料,用一個slot來存放,如int、short、float等;

        2、64位的資料用連續兩個slot來存放,如long、double;3、引用型別可32位亦可64位。

  2、運算元棧:用來存放運算元。

    區域性變量表中的變數是不可直接使用的,如需使用必須通過相關指令將其載入至運算元棧中作為運算元使用。

  3、方法返回地址:

    一個方法開始執行後,只有兩種方式可以退出這個方法。

    第一種:執行引擎遇到任意一個方法返回的位元組碼指令,這時候可能會有返回值傳遞給上層的方法呼叫者,是否有返回值和返回值的型別將根據遇到的何種方法返回指令來決定,這種退出的方式稱為正常完成出口。

    另一種:方法執行過程中遇到了異常,並且這個異常沒有在方法體內得到處理,無論是Java虛擬機器內部產生的異常,還是程式碼中使用athrow位元組指令產生的異常,只要在本方法的異常表中沒有搜尋到匹配的異常處理器,就會導致方法退出,

    這種退出稱為異常完成出口。

 

根據下面的程式碼 模擬java虛擬機器棧 棧幀的入棧 和出棧操作

 

public class Test {
    public static void main(String[] args) {
        new Test().a();
    }

    public void a(){
        b();
        System.out.println("執行a方法結束");
    }

    public void b(){
        c();
        System.out.println("執行b方法結束");
    }

    public void c(){
        System.out.println("執行C方法結束");
    }
}

  

相關推薦

java虛擬機器 相關操作

針對JVM虛擬棧 和棧幀的操作     虛擬機器棧:   棧元素是棧幀。方法呼叫,棧幀入棧,反之出棧。 棧幀:一個方法的執行空間。   1、區域性變量表:方法定義的區域性變數、方法的引數存在該表。     例項方法中有個隱含引數“this”,所以例項方法可以訪問該類的例項變數和其他例項

深入瞭解Java虛擬機器Java虛擬機器

        與程式計數器(想了解計數器看我上一篇部落格)一樣,Java虛擬機器棧也是執行緒私有的,他的生命週期與執行緒相同,虛擬機器棧描述的是Java方法執行的記憶體模式:每個方法在執行的同時都會建立一個棧幀用於儲存區域性變量表,運算元棧,動態連結,方法出

Java虛擬機器和本地方法

java虛擬機器棧由棧幀組成,幀中儲存方法的執行狀態,包括區域性變量表和運算元棧等。在任一時刻,某一執行緒肯定是在執行某個方法。這個方法叫做該執行緒的當前方法;執行該方法的幀叫做執行緒的當前幀;宣告該方法的類叫做當前類。如果當前方法是java方法,則pc暫存器中存放當前正在執行的java虛擬機器指令

java虛擬機器與本地方法

java虛擬機器棧:    虛擬機器棧描述的是java方法執行的記憶體模型,每個方法在執行的同事都會建立一個棧幀用於儲存區域性變量表、運算元棧、動態連結,方法出口燈資訊。每一個方法從呼叫直至執行完成的過程,就對應著一個棧幀在虛擬機器棧中入棧到出棧的過程。 在java虛擬機

java虛擬機器番外篇

晉-陶淵明《五柳先生傳》:[好讀書,不求甚解],原指讀書只求領會主旨,不死摳字眼。現多指滿足於瞭解個大概,不作深入理解。 不求甚解,好嗎? 在上一篇文章講解java虛擬機器棧的時候,我有一個困惑的問題,大概是: 比如int a = 5,那麼它是如何儲存的,我們先

Java記憶體區域——Java虛擬機器

Java虛擬機器棧這塊區域的功能,描述的是Java方法執行的動態記憶體模型。就是說,一個方法的執行以及執行完畢,那麼,整個的記憶體模型就是在Java虛擬機器棧中。 每個方法執行都會建立一個棧幀,伴隨著方法從建立到執行完成。棧幀是用於儲存方法可執行的區域性變量表、

JVM 學習筆記---Java虛擬機器

1. Java虛擬機器棧(Java Virtual Machine Stacks)也是執行緒私有的,它的生命週期與執行緒相同。 2. 虛擬機器棧描述的是Java方法執行的記憶體模型:每個方法被執行的時候都會同時建立一個棧幀(Stack Frame①)用於儲存區域性變量表、操作棧、動態連結、方法出

(jvm-java虛擬機器),堆,方法區的關係

                 很多人雖然會些一些程式碼,但是並不知道這些資料,程式碼適怎樣執行實現的,那我們就要來看看jvm(也就是java虛擬機器)。                  java虛擬機器其實就是java程式執行的一個載體,java程式啟動時,java

JVM執行時資料區域 —— 程式計數器、Java虛擬機器、本地方法Java堆、方法區、執行時常量池

java虛擬機器執行時資料區域的概括圖如下所示: 下面將對執行時資料區進行講解 程式計數器 1、說明:程式計數器可以看做是當前執行緒所執行的位元組碼的行號指示器。其實通俗點講就是記錄class檔案執行到哪一行 2、注意的點: (1)因為CPU執

java 虛擬機器原理相關知識

《深入理解Java虛擬機器——JVM高階特性與最佳實踐(第2版)》https://blog.csdn.net/cf406061841/article/details/71914734Java虛擬機器原理綜述java虛擬機器知識點簡要梳理https://blog.csdn.ne

Java JVM——5.Java虛擬機器

虛擬機器棧概述   由於跨平臺性的設計,Java 的指令都是根據棧來設計的。不同平臺CPU架構不同,所以不能設計為基於暫存器的。 棧實現的優點是跨平臺,指令集小,編譯器容易實現,缺點是效能下降,實現同樣的功能需要更多的指令。   有不少Java開發人員一提到Java記憶體結構,就會非常粗略度地將JV

深入理解Java虛擬機器(七)位元組碼執行引擎(幀、動態連線、方法呼叫)

執行引擎是Java虛擬機器最核心的組成部分之一。“虛擬機器”是一個相對於“物理機”的概念,這兩種機器都有程式碼執行能力,其區別是物理機的執行引擎是直接建立在處理器、硬體、指令集和作業系統層面上的,而虛擬機器的執行引擎則是由自己實現的,因此可以自行制定指令集與執行引擎的結構體系,並且能夠執

Java記憶體區域(堆區、虛擬機器、本地方法、程式計數器和方法區)和GC機制

目錄 Java垃圾回收概況 Java記憶體區域 Java物件的訪問方式 Java記憶體分配機制 Java GC機制 垃圾收集器 Java垃圾回收概況   Java GC(Garbage Collection,垃圾收集,垃圾回收)機制,是Java與C

Java虛擬機器幀和方法呼叫

棧幀和方法呼叫 執行時棧幀結構 區域性變量表 運算元棧 動態連線 返回地址 方法呼叫 解析 分派 靜態分派 動態分配 虛擬機器動態分配的實現

目錄 1.1. JVM記憶體模型總體架構圖 1 1.2. JAVA堆 2 1.3. 方法區 元空間(Metaspace) 2 1.4. 虛擬機器 3 1.5. 本地方法區 4 2. 垃圾回收演算法 4 2

目錄 1.1. JVM記憶體模型總體架構圖 1 1.2. JAVA堆 2 1.3. 方法區 元空間(Metaspace) 2 1.4. 虛擬機器棧 3 1.5. 本地方法區 4 2. 垃圾回收演算法 4 2.1. 標記-清除演算法(Mark-Sweep) 4

深入理解Java虛擬機器之類執行時幀結構

棧幀(Stack Frame)是用於支援虛擬機器進行方法呼叫和方法執行的資料結構,它是虛擬機器執行時資料區中的虛擬機器棧(Virtual Machine Stack)的棧元素。棧幀儲存了方法的區域性變量表、運算元棧、動態連線和方法返回地址等資訊。每一個方法從呼叫

[三] java虛擬機器 JVM位元組碼 指令集 bytecode 操作碼 指令分類用法 助記符

上面關於dup的描述摘自 虛擬機器規範,很難理解看起來是非常難以理解的,不妨換一個角度我們知道區域性變數的空間分配分為兩種long 和 double 佔用2個slot  其他佔用一個運算元棧,每個單位可以表示虛擬機器支援的任何的一個數據型別不過運算元棧其實同區域性變數一樣,他也是被組織一個數組, 每個元素的資

Java 9 揭祕(16. 虛擬機器遍歷)

Tips 做一個終身學習的人。 在本章中,主要介紹以下內容: 什麼是虛擬機器棧(JVM Stack)和棧幀(Stack Frame) 如何在JDK 9之前遍歷一個執行緒的棧 在JDK 9中如何使用StackWalker API遍歷執行緒的棧 在JDK 9中如何獲取呼叫者的類 一. 什麼是虛擬機器棧

Java虛擬機器記憶體——、堆、Non-heap

Java中通過多執行緒使得多個任務同時執行處理,所有的執行緒共享JVM記憶體區域main memory,而每個執行緒又有自己的工作記憶體,當執行緒與記憶體區域進行互動時,資料從主存拷貝到工作記憶體,進而交由執行緒處理。 Java虛擬機器記憶體模型中定義的訪問操作與物理計算

Java虛擬機器探究】5.常用JVM配置引數-的分配引數

在使用JVM編譯java時,都會去設定相關的引數(例如使用eclipse的時候,可以設定eclipse的eclipse.ini檔案來對jvm做一些引數配置)。jvm的引數設定主要涉及到三種,分別是Trace跟蹤引數、堆的分配引數、棧的分配引數。本章主要講解棧的分配引數的相關資