2012-04-19 3 views
21

私がこのトピックで読んだ多くの書籍や記事、「Unsafe」を使って書いた小さなプログラムは、Javaの1-d配列が常にメモリ内で連続していることを示しています。それはJLSによって規定されているのですか、それとも実装のコンベンションですか?この表示を確認するための質問があります。Java:1次元配列は常にメモリ内で連続していますか?

答えて

15

いいえ、JVMの仕様はどのような保証はありません。 http://docs.oracle.com/javase/specs/jvms/se5.0/html/Concepts.doc.html#16446

実際にはそれはおそらくケースですが、あなたはまた、ワードサイズについての保証はありません。

あなたのプログラムがこれを使用している場合、それはとにかく、ポータブルではありませんので、安全でないが、私はその可能性は低いと思う多くのJVMのヒープがメモリ内に連続である必要性があることを考えると...、

10

Javaのメモリアドレスと対話する実際の方法はないので、メモリ内のオブジェクトのレイアウトがどのように見えるかは仕様には定義されていません。

Unsafeを使用すると、自動的に、あなたが仕様の領域外を歩いていることになります。

私はほとんどのJVM実装でdoは実際には(1次元の)配列に線形レイアウトを使用していることを確信しています。

3

標準のJavaクラスではありませんメモリ内の別の場所にプリミティブの1次元配列を配置します。

Object []によって参照されるオブジェクトは、メモリに連続している可能性は低く、たとえそうであっても、警告なしに再配置できます。

注:Unsafeを使用すると、配列の参照をintという値で読み取って、GC前後の内容を確認できます。いくつかのJVMは長いが必要な32ビットリファレンスを使用する64ビットリファレンスを使用しますが、32ビットリファレンスを使用するのが最も適しています(64ビットJVMの場合でも)。

+2

が合意されましたが、配列自体は連続しているでしょうか? 1000-> aa、1001-> bb、1002-> cdなど。 – shrini1000

+1

参照は連続して保存されるはずです(ただしどこでも指定されているとは思いません)。 Specは、JVMのGCでは参照カウントは使用されませんが、AFAIKは何もしません。 –

+3

@ shrini1000ヒープが連続した仮想メモリのブロックでない場合、2つのフラグメントが連続するレイアウトを持たない配列spannigです。一方、連続しているヒープは配列が何であるかを暗示しているだけで、間接的にはGC設計の制約が似通っている可能性があります。 –

8

この質問をThe Java Language Specification, Java SE 8 Edition (JLS)The Java Virtual Machine Specification, Java SE 8 Edition (JVMS)でお伝えしたいと思います。

は、我々はこの質問に答えるための選択肢を持っている:JVMの実装に課されているものな制約

  1. 。どのような仕様の実装も本来"禁止されていないものすべてが許可されている"と仮定しているので、これは最も信頼できる方法です原則。
  2. ほとんどのJVMの実装は、合理的な

を示唆して私は、仕様上の制約に指摘します。

我々は第10章配列JLS(や配列に関連JLSJVMSの任意の他の章)のを見れば、我々は配列に課せられたメモリレイアウトの制約の一切の言及を見つけることができませんでした。 したがって、配列が連続していない可能性があります。

また、JLSは、アレイがオブジェクトであることを言う:

第10章アレイ。 Javaプログラミング言語で

アレイは オブジェクト(§4.3.1)あり、動的に作成され、そして型オブジェクト(§4.3.2)の 変数に割り当てることができます。 Objectクラスのすべてのメソッドは、配列で呼び出される です。
...

4.3.1。オブジェクト。

オブジェクトは、クラスのインスタンスまたはアレイあります。

(配列はオブジェクトである)そして同時にJVMSオブジェクトとアレイがヒープに格納されていることを言う:

2.5.3。ヒープ

Java仮想マシンには、すべてのJava仮想マシンスレッド間で共有されるヒープがあります。 ヒープは実行時データ領域 で、すべてのクラスインスタンスと配列のメモリが割り当てられます。

しかしJVMSが連続するようにヒープメモリを強要しません:

2.5.3。ヒープ

... ヒープのメモリは連続している必要はありません。すべての配列は、ヒープとヒープに格納されているよう

が連続していないかもしれない、アレイはまた、連続していないかもしれないことになります。

+0

ちょうど注記:[非コードテキストの場合はいつコードを書式設定する必要がありますか?](http://meta.stackoverflow.com/a/254995):)。 – Tom

+0

公式仕様と同様の引用をどうすればできますか?私はより良い読書のために他のテキストからそれらを隔離したい。 – likern

+0

"コードの書式設定"と "blockquote"の違いに注意してください。 "JLS"、 "JVMS"、 "Chapter 10. Arrays"のような言葉コードはありませんし、そのようにフォーマットする必要があります:)。引用符は正しい。 – Tom