溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

如何理解JVM內(nèi)存結(jié)構(gòu)程序計(jì)數(shù)器和棧

發(fā)布時(shí)間:2021-10-11 17:57:17 來(lái)源:億速云 閱讀:125 作者:iii 欄目:編程語(yǔ)言

本篇內(nèi)容介紹了“如何理解JVM內(nèi)存結(jié)構(gòu)程序計(jì)數(shù)器和?!钡挠嘘P(guān)知識(shí),在實(shí)際案例的操作過(guò)程中,不少人都會(huì)遇到這樣的困境,接下來(lái)就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

程序計(jì)數(shù)器

JVM中的程序計(jì)數(shù)寄存器(Program Counter Register)中, Register 的命名源于CPU 的寄存器,寄存器存儲(chǔ)指令相關(guān)的現(xiàn)場(chǎng)信息。 CPU 只有把數(shù)據(jù)裝載到寄存器才能夠運(yùn)行。
舉例:
public int test() {
    int x = 0;
    int y = 1;
    return x + y;
}

虛擬機(jī)棧

棧的特點(diǎn)

1. 基本操作

如何理解JVM內(nèi)存結(jié)構(gòu)程序計(jì)數(shù)器和棧

2. 棧中存在垃圾回收嗎?
3. 棧中可能拋出的異常是什么?StackOverflowError?OutOfMemoryError?
4. 如何設(shè)置棧內(nèi)存的大??? -Xss size (即:-XX:ThreadStackSize)
    一般默認(rèn)為512k-1024k,取決于操作系統(tǒng)。
 
 對(duì)應(yīng)的字節(jié)碼:
public int test();
    descriptor: ()I
 
    flags: ACC_PUBLIC
 
    Code:
      stack=2, locals=3, args_size=1
         0: iconst_0
         1: istore_1
         2: iconst_1
         3: istore_2
         4: iload_1
         5: iload_2
         6: iadd
         7: ireturn
 
      LineNumberTable:
        line 7: 0
        line 8: 2
        line 9: 4
      LocalVariableTable:
        Start  Length  Slot  Name   Signature
 
            0       8     0  this   Lcom/alibaba/uc/TestClass;
            2       6     1     x   I
            4       4     2     y   I
 
 
為什么需要記錄當(dāng)前線程的執(zhí)行地址?
為什么PC寄存器是線程私有的?

棧楨(Stack Frame)

1. 方法和棧楨之間存在怎樣的關(guān)系?
   > 棧幀是一個(gè)內(nèi)存區(qū)塊,是一個(gè)數(shù)據(jù)集,維系著方法執(zhí)行過(guò)程中的各種數(shù)據(jù)信息。

如何理解JVM內(nèi)存結(jié)構(gòu)程序計(jì)數(shù)器和棧

2. 棧楨的內(nèi)部結(jié)構(gòu)

如何理解JVM內(nèi)存結(jié)構(gòu)程序計(jì)數(shù)器和棧

如何理解JVM內(nèi)存結(jié)構(gòu)程序計(jì)數(shù)器和棧

局部變量表:

1. 定義為一個(gè)數(shù)字?jǐn)?shù)組,主要用于存儲(chǔ)方法參數(shù)和定義在方法體內(nèi)的局部變量

 如何理解JVM內(nèi)存結(jié)構(gòu)程序計(jì)數(shù)器和棧
2. 這些數(shù)據(jù)類型包括各類基本數(shù)據(jù)類型、對(duì)象引用(reference),以及returnAddress類型
3. 存在線程安全問(wèn)題嗎?
4. 舉例
public class SlotTest {
    public void localVarl() {
        int a = 0;
        System.out.println(a);
        int b = 0;
    }

    public void localVar2() {
        {
            int a = 0;
            System.out.println(a);
        }
        //此時(shí)的b就會(huì)復(fù)用a的槽位
        int b = 0;
    }
}
 
5. 局部變量表中的變量也是重要的垃圾回收根節(jié)點(diǎn),只要被局部變量表中直接或間接引用的對(duì)象都不會(huì)被回收。
 
 操作數(shù)棧:

1. 操作數(shù)棧,也稱為表達(dá)式棧,后進(jìn)先出。
2. 在方法執(zhí)行過(guò)程中,根據(jù)字節(jié)碼指令,往棧中寫入數(shù)據(jù)或提取數(shù)據(jù),即入棧(push)/出棧(pop)。并非采用索引訪問(wèn)。
3. 舉例:
public void testAddOperation(){
    byte i = 15;
    int j = 8;
    int k = i + j;
}
4. 字節(jié)碼分析:

如何理解JVM內(nèi)存結(jié)構(gòu)程序計(jì)數(shù)器和棧

如何理解JVM內(nèi)存結(jié)構(gòu)程序計(jì)數(shù)器和棧

如何理解JVM內(nèi)存結(jié)構(gòu)程序計(jì)數(shù)器和棧
 
 
 如何理解JVM內(nèi)存結(jié)構(gòu)程序計(jì)數(shù)器和棧

如何理解JVM內(nèi)存結(jié)構(gòu)程序計(jì)數(shù)器和棧

如何理解JVM內(nèi)存結(jié)構(gòu)程序計(jì)數(shù)器和棧

如何理解JVM內(nèi)存結(jié)構(gòu)程序計(jì)數(shù)器和棧
 
 如何理解JVM內(nèi)存結(jié)構(gòu)程序計(jì)數(shù)器和棧

動(dòng)態(tài)鏈接:

動(dòng)態(tài)鏈接(或指向運(yùn)行時(shí)常量池的方法引用)
1. 每一個(gè)棧幀內(nèi)部包含一個(gè)指向運(yùn)行時(shí)常量池中該棧幀所屬方法的引用,包含這個(gè)引用的目的就是為了支持當(dāng)前方法的代碼能夠?qū)崿F(xiàn)動(dòng)態(tài)鏈接
2. 在java源文件被編譯到字節(jié)碼文件中時(shí),所有的變量和方法引用都作為符號(hào)引用(Symbolic Reference)保存在class文件的常量池里。比如:描述一個(gè)方法調(diào)用了另外的其他方法時(shí),就是通過(guò)常量池中指向方法的符號(hào)引用來(lái)表示的,那么動(dòng)態(tài)鏈接的作用就是為了將這些符號(hào)引用轉(zhuǎn)換為調(diào)用方法的直接引用。
3. 為什么需要常量池?

public class SimpleClass {
    public void sayHello() {
        System.out.println("hello");
    }
}
 
 

本地方法棧

Java 虛擬機(jī)棧用于管理Java 方法的調(diào)用,而本地方法棧用于管理本地方法的調(diào)用。
本地方法是使用C語(yǔ)言實(shí)現(xiàn)的。
它的具體做法是Native Method Stack中登記native方法,在Execution Engine 執(zhí)行時(shí)加載本地方法庫(kù)。

如何理解JVM內(nèi)存結(jié)構(gòu)程序計(jì)數(shù)器和棧

“如何理解JVM內(nèi)存結(jié)構(gòu)程序計(jì)數(shù)器和棧”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI