5

ご存知のとおり、Javaは次のデータ型を使用します

byte    Occupy 8 bits in memory
short   Occupy 16 bits in memory
int     Occupy 32 bits in memory
long    Occupy 64 bits in memory 

次のようなクラスを作成すると

class Demo{
    byte b;        
    int i;
    long l;
}

Demo obj = new Demo();

さて、私の質問は、objサイズは< or > or =のサイズb+i+lです104 bytes。適切な理由で説明をお願いします。

ありがとう、
アニルクマールC

4

5 に答える 5

6

http://www.javamex.com/tutorials/memory/object_memory_usage.shtmlから

  1. ベアオブジェクトは8バイトを使用します。
  2. 単一のブールフィールドを持つクラスのインスタンスは16バイトを使用します。8バイトのヘッダー、1バイトのブール、および7バイトの「パディング」でサイズを8の倍数にします。
  3. 8つのブールフィールドを持つインスタンスも16バイトを使用します。ヘッダー用に8バイト、ブールフィールド用に8バイトです。これはすでに8の倍数であるため、パディングは必要ありません。
  4. 2つの長いフィールド、3つのintフィールド、およびブール値を持つオブジェクトは次のようになります。
    • ヘッダー用に8バイト。
    • 2つのlongに対して16バイト(各8)。
    • 3つのintに対して12バイト(各4)。
    • ブール値の場合は1バイト。
    • さらに3バイトのパディング。合計を37から40に切り上げ、8の倍数にします。
于 2012-05-11T10:13:35.400 に答える
4

オブジェクトのメモリ内サイズは、アーキテクチャ、主にVMが32ビットか64ビットかによって異なります。実際のVMの実装も重要です。

オブジェクトごとに、オブジェクトヘッダー用のスペース(通常、64ビットVMでは2 * 8バイト)とフィールド(VMの実装に応じて調整用の追加スペース)が必要です。次に、最後のスペースは、ワードサイズの最も近い倍数に切り上げられます。

于 2012-05-11T10:14:49.367 に答える
2

それがメモリ内のobjのサイズになるとは言い難いです。タイプサイズの表示は開発者に役立ちますが、実際にはメモリ内では少し異なります。この記事を読むことをお勧めします、それは本当に面白いです。

于 2012-05-11T10:15:27.830 に答える
1

まず、ビットとバイトを混同しました。

次に、クラスに関する情報が格納されている「vtable」へのポインタも必要になります。ほとんどの場合、32ビットシステムでは4バイト(32ビット)、64ビットシステムでは8バイトになります。

最後に、メモリの断片化により、プログラムメモリの合計がすべてのオブジェクトの合計よりも多くなる可能性があることに注意してください。

于 2012-05-11T10:17:23.500 に答える
0

オブジェクトのヘッダーは、32ビットJVMでは8バイト、32ビットJVMでは12バイトを取ることができます。

各プリミティブはビット数を取ります(指定したバイト数ではありません)

オブジェクトの割り当ては8バイトに揃えられているため、オブジェクトの最後には最大7バイトのパディングがあります。つまり、実際に使用されるスペースは、次の8の倍数に切り上げられます。

class Demo{ // 8 or 12 bytes
    byte b; // 1 byte
    int i;  // 4 bytes
    long l; // 8 bytes
}

Demo obj = new Demo();

したがって、オブジェクトのサイズは、32ビットJVMでは24バイト、64ビットJVMでは32バイトかかる可能性があります。

于 2012-05-11T11:55:44.437 に答える