您好,登錄后才能下訂單哦!
本篇內容介紹了“如何理解JVM內存結構程序計數器和棧”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
程序計數器
JVM中的程序計數寄存器(Program Counter Register)中, Register 的命名源于CPU 的寄存器,寄存器存儲指令相關的現場信息。 CPU 只有把數據裝載到寄存器才能夠運行。
舉例:
public int test() {
int x = 0;
int y = 1;
return x + y;
}
虛擬機棧
棧的特點
1. 基本操作
2. 棧中存在垃圾回收嗎?
3. 棧中可能拋出的異常是什么?StackOverflowError?OutOfMemoryError?
4. 如何設置棧內存的大小? -Xss size (即:-XX:ThreadStackSize)
一般默認為512k-1024k,取決于操作系統。
對應的字節碼:
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
為什么需要記錄當前線程的執行地址?
為什么PC寄存器是線程私有的?
棧楨(Stack Frame)
1. 方法和棧楨之間存在怎樣的關系?
> 棧幀是一個內存區塊,是一個數據集,維系著方法執行過程中的各種數據信息。
2. 棧楨的內部結構
局部變量表:
1. 定義為一個數字數組,主要用于存儲方法參數和定義在方法體內的局部變量
2. 這些數據類型包括各類基本數據類型、對象引用(reference),以及returnAddress類型
3. 存在線程安全問題嗎?
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);
}
//此時的b就會復用a的槽位
int b = 0;
}
}
5. 局部變量表中的變量也是重要的垃圾回收根節點,只要被局部變量表中直接或間接引用的對象都不會被回收。
操作數棧:
1. 操作數棧,也稱為表達式棧,后進先出。
2. 在方法執行過程中,根據字節碼指令,往棧中寫入數據或提取數據,即入棧(push)/出棧(pop)。并非采用索引訪問。
3. 舉例:
public void testAddOperation(){
byte i = 15;
int j = 8;
int k = i + j;
}
4. 字節碼分析:
動態鏈接:
動態鏈接(或指向運行時常量池的方法引用)
1. 每一個棧幀內部包含一個指向運行時常量池中該棧幀所屬方法的引用,包含這個引用的目的就是為了支持當前方法的代碼能夠實現動態鏈接
2. 在java源文件被編譯到字節碼文件中時,所有的變量和方法引用都作為符號引用(Symbolic Reference)保存在class文件的常量池里。比如:描述一個方法調用了另外的其他方法時,就是通過常量池中指向方法的符號引用來表示的,那么動態鏈接的作用就是為了將這些符號引用轉換為調用方法的直接引用。
3. 為什么需要常量池?
public class SimpleClass {
public void sayHello() {
System.out.println("hello");
}
}
本地方法棧
Java 虛擬機棧用于管理Java 方法的調用,而本地方法棧用于管理本地方法的調用。
本地方法是使用C語言實現的。
它的具體做法是Native Method Stack中登記native方法,在Execution Engine 執行時加載本地方法庫。
“如何理解JVM內存結構程序計數器和棧”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。