2016-07-30 1 views
1

私はhere からJVMの内部を読んで、用語「ネイティブポインタ」に出くわし、それが何を意味し、それはJNIとは何かを持っているんでしたか?その上のテキストでネイティブポインタとreturnAddressは何ですか?

は、プログラムカウンタを語ると言う:

実行中のプログラムの各スレッドは、スレッドが開始されたときに作成された独自のPCレジスタ、またはプログラムカウンタを、持っています。 pcレジスタは1ワードのサイズなので、ネイティブポインタと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

私はまだそれを得ていませんでした。私は、 'ネイティブポインタ'がCPUの参照であることを理解しています。しかし、 'ネイティブポインタ'と 'リターンアドレス'の違いは何ですか? – rd22

+0

@ rd22戻りアドレスは、メソッドから返された後に実行するコードの場所です。 –

関連する問題