オブジェクトがすべてnull
に設定されているか、または何らかの理由でメンバの定義がすでにインスタンス内の領域を使い切っている限り、Javaオブジェクトはオブジェクト参照の8バイトしか占めないと仮定するのは正しいですか?Javaオブジェクトは、そのメンバがすべてnullのときにどれだけのメモリを使用しますか?
つまり、空間効率のよいオブジェクトを大量に用意している場合、メモリフットプリントを減らすために未使用のメンバーをnull
に設定しておくことができますか?
オブジェクトがすべてnull
に設定されているか、または何らかの理由でメンバの定義がすでにインスタンス内の領域を使い切っている限り、Javaオブジェクトはオブジェクト参照の8バイトしか占めないと仮定するのは正しいですか?Javaオブジェクトは、そのメンバがすべてnullのときにどれだけのメモリを使用しますか?
つまり、空間効率のよいオブジェクトを大量に用意している場合、メモリフットプリントを減らすために未使用のメンバーをnull
に設定しておくことができますか?
いいえ、フィールドに格納している各ヌルに対して、32または64ビットシステムであるかどうかに応じて、4バイトまたは8バイトが必要です。どこかにそれを伝えるために何かが格納されていなければ、オブジェクトはそのフィールドがnullであることをどのようにして知るでしょうか?
いいえ、nullも情報であり、保存する必要があります。
オブジェクト参照自体がまだいくつかのメモリを占有しますので、唯一の実メモリの節約が呼ばれていたであろうヒープオブジェクトからなります。
だから、あなたは
MyClass {
public Object obj;
MyClass(Object o) { obj = o; }
}
MyClass a = new MyClass(new HashMap());
MyClass b = new MyClass(null);
二つのオブジェクトa
とb
を持っている場合は、それ自体が(どちらも1つの参照を保持)同じ量のメモリを取るが、a
によって参照されるオブジェクトobj
は上のメモリを占有ヒープ。このメモリは参照をnullに設定することで節約できました。
Java Language SpecificationとJava Virtual Machine Specificationは、メモリ内のJavaオブジェクトのサイズについては何も言いません.JVMの実装に依存するため、意図的に未定義です。これは、Javaオブジェクトが一般的にどの程度のメモリを使用するか、またはメモリ内のJavaオブジェクトのメモリレイアウトが何であるかを前提とすることはできません。
他の人がすでに言っているように、リファレンスがnull
であるかどうかにかかわらず、リファレンス(変数)がメモリを占有しています。メンバ変数をnull
に設定すると、オブジェクトが縮小されず、メモリが少なくなります。
Javaオブジェクトのメンバーがすべてnullの場合は、 というヘッダー、参照およびハウスキーピングにいくつかの追加メモリ要件があります。
Javaオブジェクトによって使用されるヒープメモリは、その大きさに応じて、プリミティブフィールドの
メモリを含みます。
参照フィールド用メモリ(それぞれ4バイト)。
"ハウスキーピング"情報の数バイトで構成されるオブジェクトヘッダー。
、Javaのオブジェクトはまた、いくつかの「ハウスキーピング」情報は、そのようなそのようなオブジェクトが現在到達可能であるかどうかなど、オブジェクトのクラス、IDとステータスフラグを記録するなど、現在の同期ロックなど
Javaオブジェクトが必要ですヘッダーサイズは32ビットと64ビットのjvmで異なります。
これらは、メインメモリの消費者であるが、時にはコードの位置合わせのためのような追加のフィールドが必要JVM e.t.c.
だから、これはメモリを消費しますし、あなたのJavaオブジェクトは、すべてのメンバーがnullをしているしている理由です。
ええ、良い質問です。 :)フィールドはCのポインタ(それ自身のメモリも必要です)と同じですか? –
はい、参照型(クラス)の変数は、ヒープ上のオブジェクトへの参照であり、Cのポインタに相当します。メモリは、ポインタとそれが指すオブジェクトのために取り込まれます。 intなどのプリミティブ型は直接格納され、常に同じサイズです。 – Joe