溫馨提示×

溫馨提示×

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

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

JVM程序計(jì)數(shù)器和棧的示例分析

發(fā)布時(shí)間:2022-01-14 11:00:32 來源:億速云 閱讀:157 作者:小新 欄目:大數(shù)據(jù)

這篇文章將為大家詳細(xì)講解有關(guān)JVM程序計(jì)數(shù)器和棧的示例分析,小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。

Java虛擬機(jī)在執(zhí)行Java程序的過程中會(huì)它所管理的內(nèi)存劃分為若干不同的數(shù)據(jù)區(qū)域。JVM程序計(jì)數(shù)器和棧的示例分析上圖是Java程序在運(yùn)行時(shí)需要用的內(nèi)存區(qū)域,其中本地內(nèi)存不會(huì)由虛擬機(jī)管理而是直接由操作系統(tǒng)直接管理,其中綠色的內(nèi)存區(qū)域是每個(gè)Java線程私有的,白色的內(nèi)存區(qū)域是所有Java線程共享的。

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

由于Java程序在多線程執(zhí)行的時(shí)候需要進(jìn)行線程的切換,當(dāng)線程進(jìn)行切換的時(shí)候,需要記錄當(dāng)前線程執(zhí)行字節(jié)碼的位置,程序計(jì)數(shù)器保存了當(dāng)前線程需要執(zhí)行字節(jié)碼的指令地址。

如果線程正在執(zhí)行的一個(gè)Java方法,程序計(jì)數(shù)器記錄的是正在執(zhí)行的虛擬機(jī)字節(jié)碼指令的地址,如果是一個(gè)Native方法,程序計(jì)數(shù)器值為空(Undefined)

 
Java棧

Java棧是線程私有的內(nèi)存空間,每一個(gè)Java方法的執(zhí)行都會(huì)產(chǎn)生一個(gè)Java棧幀,當(dāng)方法調(diào)用時(shí)棧幀會(huì)入棧,當(dāng)方法返回時(shí)棧幀會(huì)出棧。在Java棧(準(zhǔn)確的說是棧幀)中存放的主要有:

  • 局部變量表
  • 操作數(shù)棧
  • 幀數(shù)據(jù)區(qū)
 
局部變量表

局部變量表用于保存函數(shù)的參數(shù)以及局部變量,存放了編譯期可知的各種基本數(shù)據(jù)類型、對象引用(可能是一個(gè)指向?qū)ο笃鹗嫉刂返囊弥羔槪┗蛘呤莚eturnAddress類型(指向一條字節(jié)碼指令的地址)。

public void stackSlot(int a, int b, long c) {    {        long d = 2;        System.out.println(d);    }    StackObj obj = new StackObj();    int e = 3;}
 

局部變量表存在slot(index)的概念,上述代碼的局部變量表如下:JVM程序計(jì)數(shù)器和棧的示例分析

局部變量表的變量是重要的垃圾回收根節(jié)點(diǎn),只要被局部變量表中直接或間接引用的對象是不會(huì)被回收的。下面我們來分析一下局部變量表:

普通方法的局部變量表第一個(gè)slot(index為0的位置)都是this,表示指向自身,但是靜態(tài)方法的局部變量表第一個(gè)slot就是第一個(gè)變量。

局部變量表中的slot是可以被重用的,仔細(xì)觀察上圖,會(huì)發(fā)現(xiàn)obj變量復(fù)用了變量d的slot。

 
操作數(shù)棧

操作數(shù)棧主要用于保存計(jì)算過程的中間結(jié)果,同時(shí)作為計(jì)算過程中變量臨時(shí)的存儲(chǔ)空間

 
幀數(shù)據(jù)區(qū)

幀數(shù)據(jù)區(qū)保存中訪問常量池的指針,以及異常處理表。異常處理表可以在程序遇到異常時(shí),跳轉(zhuǎn)到字節(jié)碼的合適位置,如果無法在異常表中找到合適的處理方法,則會(huì)結(jié)束當(dāng)前函數(shù)調(diào)用,并在調(diào)用函數(shù)中拋出相同的異常并且查找調(diào)用函數(shù)的異常表進(jìn)行處理。

關(guān)于“JVM程序計(jì)數(shù)器和棧的示例分析”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,使各位可以學(xué)到更多知識(shí),如果覺得文章不錯(cuò),請把它分享出去讓更多的人看到。

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

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

jvm
AI