Cのポインターは、ポインターが指しているデータ型のサイズに関係なく、2バイトのメモリーサイズを必要とするためです。同じことは、Java参照にも当てはまりますか?
Cのポインターは、ポインターが指しているデータ型のサイズに関係なく、2バイトのメモリーサイズを必要とするためです。同じことは、Java参照にも当てはまりますか?
回答:
Java言語仕様では、メモリ内の参照の大きさについて何も述べられていません。JLSでも参照が実行時に存在する必要があることを言っていないすべてで。コンパイラーは、参照用に42ギガバイトを自由に使用したり、完全に削除したりして、サイズを0バイトにします。(実際、Java言語仕様では、特定の実装戦略や表現について何も述べられておらず、実用的なものではなく、Java言語の構文の構文とセマンティクスのみを指定しています。)
ほとんどの一般的なJava実装では、参照をポインタとして実装するだけなので、Cと同じサイズになります。これらの参照は、OOP(通常のオブジェクトポインタ)と呼ばれることもあります。ただし、たとえば、Oracle Hotspot JVMには、CompressedOOPsと呼ばれる機能があり、64ビットシステムでは、一部の参照をCポインターよりも小さくすることができます。
-XX:+UseCompressedOops
JVM HotSpotオプションのため、オブジェクト参照は8バイトです。
圧縮されたポインター(64ビットポインターではなく32ビットオフセットとして表されるオブジェクト参照)の使用を有効にし、Javaヒープサイズが32 GB未満の64ビットパフォーマンスを最適化します。
空のクラスへの参照を追加し、メモリ使用量を測定することで、これをテストできます。これは、ヒープで使用されている24バイトを示しています。「バイト」プリミティブをもう1つ追加してもう一度測定すると、32バイトのヒープ使用量が表示されます。