Program Counter Register 程序計數器(寄存器)java
定義:當前線程所執行的字節碼的行號指示器,記住下一條執行JVM
指令的地址jvm
特色線程
線程私有的code
多個線程運行同一套代碼時,CPU會有一個調度器組件爲不一樣線程分配時間片,在時間片內線程未執行完成就會將運行狀態暫存,再切換到其餘線程執行,如此循環執行。而程序計數器就是線程運行狀態暫存的區域,在線程切換時,會記錄該線程的下一條JVM指令的地址。jwt
JVM
規範中惟一一個不會存在內存溢出的區域內存
示例代碼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
組件中讀取速度最快的單元。
歡迎關注公衆號,後續文章更新通知,一塊兒討論技術問題 。