As we all know that java uses the following data types
byte Occupy 8 bits in memory
short Occupy 16 bits in memory
int Occupy 32 bits in memory
long
The in-memory size of the object depends on the architecture, mainly on whether the VM is 32 or 64-bit. The actual VM implementation also matters.
For each object, you need space for its object header (typically 2*8 bytes on 64-bit VMs), its fields (extra space for alignment depending on the VM implementation). The final space is then rounded up to the nearest multiple of the word size.
The header of an object can take 8 bytes on a 32-bit JVM and 12 bytes on a 32-bit JVM.
Each primitive takes the number of bits (not bytes you indicate)
Object allocation is 8 byte aligned so there is up to 7 bytes of padding at the end of a object. i.e. the space actually used is rounded up to the next multiple of 8.
class Demo{ // 8 or 12 bytes
byte b; // 1 byte
int i; // 4 bytes
long l; // 8 bytes
}
Demo obj = new Demo();
So the size of the object can take 24 bytes on a 32-bit JVM and 32 bytes on a 64-bit JVM.
From http://www.javamex.com/tutorials/memory/object_memory_usage.shtml
- a bare Object takes up 8 bytes;
- an instance of a class with a single boolean field takes up 16 bytes: 8 bytes of header, 1 byte for the boolean and 7 bytes of "padding" to make the size up to a multiple of 8;
- an instance with eight boolean fields will also take up 16 bytes: 8 for the header, 8 for the booleans; since this is already a multiple of 8, no padding is needed;
- an object with a two long fields, three int fields and a boolean will take up:
- 8 bytes for the header;
- 16 bytes for the 2 longs (8 each);
- 12 bytes for the 3 ints (4 each);
- 1 byte for the boolean;
- a further 3 bytes of padding, to round the total up from 37 to 40, a multiple of 8.
Hard to say that will be the size of obj in memory, type size indication help the developers but actually in the memory it's a bit different. I advise you to read this article, it's really interesting.
First, you confused bits and bytes.
Second, it will also need pointer to "vtable", where information about its class is stored. It will, most likely, be 4 bytes (32 bits) on 32bit systems and 8 bytes on 64bit sytems.
Finally, note that due to memory fragmentation, total program memory might be higher than sum of all objects.