実際のサイズを計算する方法。しかし、彼らはどのようにしてそれを知っているのでしょうか?
経験から。
公式のオラクル文書から証拠は見つかりませんでした。
JVM次第です。OpenJDK ベースの JVM の場合、ヘッダーに参照が含まれているため、32 ビット JVM のヘッダー サイズは 64 ビット JVM とは異なります。他の JVM はまた異なる可能性があります。
それとも、データはいくつかの実験に基づくいくつかの推測から得られたものですか?
基本的に、はい。
「およそ」の意味を誰か説明してくれませんか?
オブジェクトのサイズを測定すると、さまざまなことがわかります
- オブジェクトの大きさは?(深さが浅い)
- どのくらいのメモリを使用しますか? (オブジェクトの割り当ては 8 バイトでアラインされます。つまり、常に 8 の倍数です)
- オブジェクトと参照されるすべてのオブジェクトが使用する領域はどれくらいですか? (深い深さ)
- 破棄された場合、どのくらいのスペースが解放される可能性がありますか? (共有されているオブジェクトの数と、解放されたメモリの 2 つのフラグメントの中間に表示されているか)
- スタックで使用されているスペース、またはオフ ヒープ メモリで使用されているスペースをカウントしますか?
知っておくべきことによって多くの異なる答えが得られることを考えると、計算に使用するこれらすべてにほぼ近い 1 つの数値を使用すると便利です。
ランタイムを使用して問題が発生するのは、TLAB が大きなブロックにデータを割り当てたことです。これらの大きなブロックは、マルチスレッドの方法でさらに割り当てることができます。欠点は、正確なメモリ使用情報が得られないことです。
static long memTaken() {
final Runtime rt = Runtime.getRuntime();
return rt.totalMemory() - rt.freeMemory();
}
public static void main(String... args) {
long used1 = memTaken();
Float i = new Float(0);
long used2 = memTaken();
System.out.println("new Float(0) used "+(used2 - used1)+" bytes.");
}
オプションなしで実行
new Float(0) used 0 bytes.
TLAB をオフにすると、-XX:-UseTLAB
new Float(0) used 336 bytes.
クラス自体をロードする必要があったため、これは予想よりもはるかに高くなっています。最初に追加して最初に Float のインスタンスを 1 つ作成すると、
Float j = new Float(1);
あなたが得る
new Float(0) used 16 bytes