Javaの参照変数のサイズは何ですか。計算できますか?


9

Cのポインターは、ポインターが指しているデータ型のサイズに関係なく、2バイトのメモリーサイズを必要とするためです。同じことは、Java参照にも当てはまりますか?


7
最新の(64ビット)アーキテクチャでは、Cはポインターに8バイトを必要とし、Javaは基礎となる実装に応じて4または8を使用します(ただし、セマンティクスが保持される限り、何でもかまいません)
ラチェットフリーク


Cでは、実装にも完全に依存しています。32ビット(プレーンな古いx86)用にコンパイルして4バイトのポインターを取得するか、64ビットの命令とレジスターを使用できますが、4バイトのポインター(x32 ABI)を使用できます。

また、Java Object Layoutが啓発的である場合もあります。
Jon Purdy 2013

回答:


7

Java言語仕様では、メモリ内の参照の大きさについて何も述べられていません。JLSでも参照が実行時に存在する必要があることを言っていないすべてで。コンパイラーは、参照用に42ギガバイトを自由に使用したり、完全に削除したりして、サイズを0バイトにします。(実際、Java言語仕様で、特定の実装戦略や表現について何述べられておらず、実用的なものではなく、Java言語の構文の構文とセマンティクスのみを指定しています。)

ほとんどの一般的なJava実装では、参照をポインタとして実装するだけなので、Cと同じサイズになります。これらの参照は、OOP(通常のオブジェクトポインタ)と呼ばれることもあります。ただし、たとえば、Oracle Hotspot JVMには、CompressedOOPsと呼ばれる機能があり、64ビットシステムでは、一部の参照をCポインターよりも小さくすることができます。


5

-XX:+UseCompressedOops JVM HotSpotオプションのため、オブジェクト参照は8バイトです。

圧縮されたポインター(64ビットポインターではなく32ビットオフセットとして表されるオブジェクト参照)の使用を有効にし、Javaヒープサイズが32 GB未満の64ビットパフォーマンスを最適化します。

空のクラスへの参照を追加し、メモリ使用量を測定することで、これをテストできます。これは、ヒープで使用されている24バイトを示しています。「バイト」プリミティブをもう1つ追加してもう一度測定すると、32バイトのヒープ使用量が表示されます。


「UseCompressedOops」とは何ですか?
gnat

これは、jvmメモリのコマンドです。oopは、通常のオブジェクトポインタを意味し、ヒープサイズを増やすことができます。
Sagar Vaghela、2013
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.