Java が配列にメモリを割り当てる方法を知りたい: 連続か不連続か? それを証明する適切な例を教えてください。
4 に答える
JNIを使用することでさえ、実際の実装からあなたを隔離するので、言う方法はありません。
そうは言っても、ほとんどの実際の実装では、配列要素をメモリの連続した内部ブロックとして割り当てることはおそらく真実です。
Java仕様はどちらの選択も必要とせず、実際、どちらの選択も監視する方法を提供していません。
たとえば、JVMをJavascriptで記述した場合、配列はおそらく連続していません。
そうは言っても、ほとんどの実際のJVMは連続したメモリを使用していると強く思います。
Javaマトリックスは配列の配列です。たとえば、最初の行は10要素、2番目の行は40要素の長さにすることができます。正方行列でない場合は連続していないと思います。ただし、最後のインデックスブロックを反復処理するときに、それが連続していることを確認できます。
a[100][500][64]
a[5][5][0 to 63] contiguous
a[5][0 to 5][5] not contiguous
a[0 to 5][5][5] not contiguous and maybe there will be cache-critical stalls
ほとんどの JVM では、ヒープ全体が連続しているため、配列が連続的に割り当てられていると合理的に想定できます。
注: 参照の配列が連続している場合でも、それらが参照するオブジェクトはどこにでもある可能性があります。彼らはおそらく一緒にいるでしょうが、私ではないかもしれません.
例えば
String[] strings = "a,b,c,d,e,f".split(",");
Strings は参照の配列であり、個々の String オブジェクトとそのchar[]
オブジェクトはどこにでもある可能性があります。注: すべての文字列は同じものを使用する可能性がありますchar[]