2016-07-30 45 views
1

我正在閱讀here 的JVM的內部結構,並且遇到了術語「本地指針」,這是什麼意思,它與JNI有什麼關係?什麼是本機指針和returnAddress?

在它上面的文字談到計劃櫃檯,並說:

正在運行的程序的每個線程都有自己的PC寄存器或程序計數器,當線程啓動時創建的。 pc寄存器的大小是一個字,所以它可以同時擁有一個本地指針和一個returnAddress。當線程執行Java方法時,pc寄存器包含線程正在執行的當前指令的地址。 「地址」可以是一個本地指針,也可以是方法字節碼開頭的偏移量。如果一個線程正在執行一個本地方法,那麼pc寄存器的值是未定義的。

從我理解的returnAddress將是任何引用地址。像: Object o = new Object();這裏o將返回在堆中創建的對象的地址。我的理解是否正確?

任何解釋兩者的例子都會很棒。

+0

你是什麼意思的「本地指令」?此外,官方文檔還討論了它https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-2.html#jvms-2.5.1 – rd22

+0

@ rd22本地指令是機器代碼指令代碼實際運行在本機CPU上。 –

+1

本文檔和您在註釋中引用的文檔與JNI無關。他們都在談論由JVM維護的*軟件* PC寄存器,該寄存器引用了字節碼指令。它可以直接指向字節碼指令('本地指針',術語選擇不佳)或者是從當前方法開始的偏移。 – EJP

回答

2

這裏o會返回在堆中創建的對象的地址。

變量o存儲引用。這是該物體唯一的查找值。它可能是地址,但它可能是一個可以轉換爲地址的值。例如使用翻譯後的值,64位JVM可以使用最多64 GB堆的32位引用。

這是什麼意思,它與JNI有什麼關係?

CPU使用指針尋址內存。爲了區別於引用,它在Java中被稱爲「本地」指針。

JNI是使用指針的C代碼的接口。

JVM的程序計數器在虛擬機中是名義上的,並且不能被Java程序訪問。

實際的機器碼使用由CPU管理的程序計數器。即使這是抽象的,因爲CPU可以在每個時鐘週期執行多條指令,所以在任何時候程序計數器都只是您不能回滾的點,或者取決於正在執行的指令。

+0

我還是沒有明白。我明白'native pointer'是CPU的參考。但是,'native pointer'和'return address'有什麼區別? – rd22

+0

@ rd22返回地址是從方法返回後執行的代碼的位置。 –