您好,登錄后才能下訂單哦!
本篇內(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. 基本操作
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ù)信息。
2. 棧楨的內(nèi)部結(jié)構(gòu)
局部變量表:
1. 定義為一個(gè)數(shù)字?jǐn)?shù)組,主要用于存儲(chǔ)方法參數(shù)和定義在方法體內(nèi)的局部變量
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é)碼分析:
動(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ù)器和棧”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!
免責(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)容。