淺談JVM - 內存結構(二)- 程序計數器

1.1 定義

Program Counter Register 程序計數器(寄存器)java

  • 定義:當前線程所執行的字節碼的行號指示器,記住下一條執行JVM指令的地址jvm

  • 特色線程

    • 線程私有的code

      多個線程運行同一套代碼時,CPU會有一個調度器組件爲不一樣線程分配時間片,在時間片內線程未執行完成就會將運行狀態暫存,再切換到其餘線程執行,如此循環執行。而程序計數器就是線程運行狀態暫存的區域,在線程切換時,會記錄該線程的下一條JVM指令的地址。jwt

    • JVM規範中惟一一個不會存在內存溢出的區域內存

1.2 做用

示例代碼get

0: getstatic     #20                 // PrintStream out = System.out;
 3: astore_1                          // -- 
 4: aload_1                           // out.println(1);
 5: iconst_1                          // -- 
 6: invokevirtual #26                 // -- 
 9: aload_1                           // out.println(2);
10: iconst_2                          // -- 
11: invokevirtual #26                 // -- 
14: aload_1                           // out.println(3);
15: iconst_3                          // -- 
16: invokevirtual #26                 // -- 
19: aload_1                           // out.println(4);
20: iconst_4                          // -- 
21: invokevirtual #26                 // -- 
24: aload_1                           // out.println(5);
25: iconst_5                          // -- 
26: invokevirtual #26                 // --
29: return
  • 右側爲java源代碼,左側爲編譯後的字節碼指令,也就是jvm指令,在任何平臺下編譯後都是這套指令。這套指令並沒有法直接交給CPU執行,須要由JVM的解釋器轉換成機器碼,再交由CPU執行。編譯

  • 程序計數器的做用就是記住下一條JVM指令的地址,左側的數字即爲JVM指令地址。ast

  • 解釋器每次都會從程序計數器中獲取須要執行的JVM指令,同時下一條JVM指令將會存入程序計數器中。class

  • 程序計數器物理上的實現就是依靠寄存器來存儲和讀取指令地址,寄存器是CPU組件中讀取速度最快的單元。

歡迎關注公衆號,後續文章更新通知,一塊兒討論技術問題 。

公衆號二維碼

相關文章
相關標籤/搜索