4

ポインタはJava参照変数を実装するために使用されるだけですか、それとも実際にどのように実装されていますか? 以下は、Java 言語仕様の行です。

4.3.1 オブジェクト オブジェクトは、クラス インスタンスまたは配列です。参照値 (多くの場合、単なる参照) は、これらのオブジェクトへのポインターであり、オブジェクトを参照しない特殊な null 参照です。

それは常にポインタであることを意味しますか?

4

5 に答える 5

7

最新の JVM では、参照はアドレスとして実装されます。

HotSpot の最初のバージョン (および「クラシック VM」の場合は少し前) に戻ると、参照はハンドルとして実装されていました。それはポインタへの固定ポインタです。特定のオブジェクトの最初のポインターは変更されませんが、オブジェクト データ自体が移動すると、2 番目のポインターが変更されます。明らかに、これは使用中のパフォーマンスに影響しますが、GC を作成する方が簡単です。

JDK7 の最新ビルドでは、「圧縮 oops」がサポートされています。私は、BEA JRockit がこれを以前から持っていたと信じています。64 ビット システムに移行するには、2 倍のメモリが必要になるため、アドレスの帯域幅が必要になります。「圧縮 oops」は、アドレスの最下位 3 ビットまたは 4 ビットが常にゼロであることを利用します。32 ビットのデータが 3 ビットまたは 4 ビット左にシフトされ、4 GB ではなく 32 GB または 64 GB のヒープが可能になります。

于 2009-10-15T18:46:12.980 に答える
2

実際にここからソースコードを取得できます: http://download.java.net/jdk6/source/

あなたの質問に対する短い答えは次のとおりです。ただし、これは非常に単純化しすぎています。VM 内での Java 変数の移動には、多くの C++ オブジェクトが関係しています。もっと詳しく知りたい場合は、hotspot\src\share\vm\oops パッケージを見てください。

ただし、実際には、Java を直接操作する方法がないため、これは Java の開発には関係ありません (次に、JVM はさまざまなプロセッサ アーキテクチャ用に最適化されています)。

于 2009-10-15T18:08:37.797 に答える
1

答えはすべてのJVM実装に依存しますが、それを考える最良の方法はハンドルとしてです。これは、JVMがテーブルまたは他のそのような実装で参照のメモリ位置を検索できる値です。これにより、JVMは、メモリポインタをどこでも変更することなく、ガベージコレクション中にメモリ内のオブジェクトを移動できます。

于 2009-10-15T18:08:03.200 に答える
0

プリミティブ型は常に値渡しされます。クラス変数は、実際にはオブジェクトの参照変数です。

プリミティブ型を考えてみましょう:

int i=0; 

現在、このプリミティブ型の値はアドレス 2068 のメモリ位置に格納されています。このプリミティブ型をパラメーターとして使用するたびに、参照渡しではなく値渡しであるため、新しいコピーが作成されます。

クラス変数を考えてみましょう:

MyClass C1 = new MyClass();

これで、クラス タイプ MyClass のオブジェクトが変数名 C1 で作成されます。

クラス変数 C1 には、変数 C1 にリンクされているオブジェクトのメモリ位置のアドレスが含まれています。したがって、基本的にクラス変数 C1 はオブジェクトの場所 (new MyClass()) を指します。

また、プリミティブ型はスタックに格納され、オブジェクトはヒープに格納されます。

于 2012-07-08T09:36:37.863 に答える
-2

それは常にポインタであることを意味しますか?

はい。ただし、C で通常行うように操作することはできません。

Java は VM に依存する別のプログラミング言語であるため、この概念 (ポインター) は、そのようなアーティファクトの動作をよりよく理解するための類推としてのみ使用する必要があることに注意してください。

于 2009-10-15T18:14:40.377 に答える