I used the JOL tool (Layout of a Java Object) , which tries to parse the layout of an object. It comes with cli, and I used it for analysis java.lang.Integer. I see that an Integer object takes 12 extra bytes for overhead. This overhead can be 4 bytes for the address of the class to which this object belongs, 4 more for garbage collection, but what about the remaining 4 bytes? I know that objects have an integer hashCode value, but I don't think it is unique (i.e., it does not use a memory location, instead uses a primitive value) because:
Integer a = new Integer(12);
Integer b = new Integer(12);
System.out.println(a.hashCode() == 12 && b.hashCode() == 12);
Log:
$ java -jar jol-cli/target/jol-cli.jar internals java.lang.Integer
Instantiated the sample instance via public java.lang.Integer(int)
OFFSET SIZE TYPE DESCRIPTION VALUE
0 4 (object header) 05 00 00 00 (00000101 00000000 00000000 00000000) (5)
4 4 (object header) 00 00 00 00 (00000000 00000000 00000000 00000000) (0)
8 4 (object header) 88 26 cf 22 (10001000 00100110 11001111 00100010) (584001160)
12 4 int Integer.value 0
Instance size: 16 bytes
Space losses: 0 bytes internal + 0 bytes external = 0 bytes total
source
share