重慶分公司,新征程啟航
為企業(yè)提供網(wǎng)站建設(shè)、域名注冊、服務器等服務
為企業(yè)提供網(wǎng)站建設(shè)、域名注冊、服務器等服務
這篇文章將為大家詳細講解有關(guān)JVM程序計數(shù)器和棧的示例分析,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
10年積累的成都網(wǎng)站設(shè)計、網(wǎng)站制作經(jīng)驗,可以快速應對客戶對網(wǎng)站的新想法和需求。提供各種問題對應的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務。我雖然不認識你,你也不認識我。但先網(wǎng)站策劃后付款的網(wǎng)站建設(shè)流程,更有通道免費網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。
Java虛擬機在執(zhí)行Java程序的過程中會它所管理的內(nèi)存劃分為若干不同的數(shù)據(jù)區(qū)域。上圖是Java程序在運行時需要用的內(nèi)存區(qū)域,其中本地內(nèi)存不會由虛擬機管理而是直接由操作系統(tǒng)直接管理,其中綠色的內(nèi)存區(qū)域是每個Java線程私有的,白色的內(nèi)存區(qū)域是所有Java線程共享的。
由于Java程序在多線程執(zhí)行的時候需要進行線程的切換,當線程進行切換的時候,需要記錄當前線程執(zhí)行字節(jié)碼的位置,程序計數(shù)器保存了當前線程需要執(zhí)行字節(jié)碼的指令地址。
如果線程正在執(zhí)行的一個Java方法,程序計數(shù)器記錄的是正在執(zhí)行的虛擬機字節(jié)碼指令的地址,如果是一個Native方法,程序計數(shù)器值為空(Undefined)
Java棧是線程私有的內(nèi)存空間,每一個Java方法的執(zhí)行都會產(chǎn)生一個Java棧幀,當方法調(diào)用時棧幀會入棧,當方法返回時棧幀會出棧。在Java棧(準確的說是棧幀)中存放的主要有:
局部變量表用于保存函數(shù)的參數(shù)以及局部變量,存放了編譯期可知的各種基本數(shù)據(jù)類型、對象引用(可能是一個指向?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)的概念,上述代碼的局部變量表如下:
局部變量表的變量是重要的垃圾回收根節(jié)點,只要被局部變量表中直接或間接引用的對象是不會被回收的。下面我們來分析一下局部變量表:
普通方法的局部變量表第一個slot(index為0的位置)都是this,表示指向自身,但是靜態(tài)方法的局部變量表第一個slot就是第一個變量。
局部變量表中的slot是可以被重用的,仔細觀察上圖,會發(fā)現(xiàn)obj變量復用了變量d的slot。
操作數(shù)棧主要用于保存計算過程的中間結(jié)果,同時作為計算過程中變量臨時的存儲空間
幀數(shù)據(jù)區(qū)保存中訪問常量池的指針,以及異常處理表。異常處理表可以在程序遇到異常時,跳轉(zhuǎn)到字節(jié)碼的合適位置,如果無法在異常表中找到合適的處理方法,則會結(jié)束當前函數(shù)調(diào)用,并在調(diào)用函數(shù)中拋出相同的異常并且查找調(diào)用函數(shù)的異常表進行處理。
關(guān)于“JVM程序計數(shù)器和棧的示例分析”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。