Java知識學習——程序計數器

JVM內存結構組成部分包括程序計數器、虛擬機棧、本地方法棧、堆、方法區。

首先我們來看程序計數器(PC Register),在瞭解程序計數器的作用之前,我們先分析下面的代碼。

很明顯圖中右側是Java源代碼,Java源代碼是不能直接執行運行的,需要經過編譯,即編譯成左側的二進制字節碼,主要是JVM指令,正是因爲這些JVM指令在不同的操作系統上都是一致的,所以Java才能夠平臺。

有了JVM指令之後,是不能夠直接交給CPU來執行的,必須經過一個解釋器將每一個JVM指令解析成機器碼,然後機器碼纔可以直接交給CPU執行。

程序計數器就是在上述步驟中記住每一個JVM指令的下一條指令的執行地址。例如上圖中,當CPU執行的getstatic #20同時,程序計數器會將下條指令astore_1的地址存儲下來,當getstatic #20執行完成之後,解釋器就直接從程序計數器中取astore_1的地址並進行解釋然後交個CPU執行,CPU執行的時候程序計數器又會重新把aload_1的地址存儲下來,依次循環。

如果沒有程序計數器,就不知道接下來應該執行的是哪一條命令。

實現程序計數器是通過寄存器來實現的,寄存器是CPU中讀取速度最快的單元,因爲讀取指令地址的操作是非常頻繁的,所以在Java虛擬機在設計的時候就把CPU中的寄存器當做了程序計數器,用它來存儲地址。

對於程序計數器有兩個特點:線程私有的。

我們都知道Java是支持多線程的,在多個線程運行的時候,CPU會有一個調度器組件給不同的線程分配時間片,比如給線程1分配一個時間片,如果在時間片裏線程1對應的沒有執行完成,會對其進行一個暫存,然後交給線程2執行,當線程2執行完或者時間片用完,又切換到線程1繼續執行線程1剩餘的代碼,如果在線程的切換過程中,要記住下一條指令的地址,還是會用到程序計數器。程序計數器跟線程一樣也是私有的,屬於線程的,不同的線程有對應的程序計數器。

Java虛擬機規範中規定了程序計數器中不會存在內存溢出,並不像本地方法棧、堆、方法區會有內存溢出。因此JVM的各個廠商在對JVM實現的時候不用去考慮內存溢出。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章