Using java.lang.instrument.Instrumentation to check sizes:
The object uses 8 bytes, byte [0] - 16 bytes. (not sure if size in bytes, not documented).
I also got time to create the object and bytes [0] (2 times): the object is the winner.
(all tests are performed on a DELL laptop, Intel 2 GHz, Windos XP)
Using client VM
java version "1.6.0_16" Java(TM) SE Runtime Environment (build 1.6.0_16-b01) Java HotSpot(TM) Client VM (build 14.2-b01, mixed mode) an implementation-specific approximation of the amount of storage Object = 8 byte[0] = 16 time to create 1000000000 instances Object: elapsed=11,140 cpu=9,766 user=9,703 [seconds] byte[0]: elapsed=18,248 cpu=15,672 user=15,594 [seconds] time to create 1000000000 instances Object: elapsed=11,135 cpu=9,828 user=9,750 [seconds] byte[0]: elapsed=18,271 cpu=15,547 user=15,469 [seconds]
Using server VM
java version "1.6.0_16" Java(TM) SE Runtime Environment (build 1.6.0_16-b01) Java HotSpot(TM) Server VM (build 14.2-b01, mixed mode) an implementation-specific approximation of the amount of storage Object = 8 byte[0] = 16 time to create 1000000000 instances Object: elapsed=8,441 cpu=7,156 user=7,125 [seconds] byte[0]: elapsed=11,237 cpu=8,609 user=8,500 [seconds] time to create 1000000000 instances Object: elapsed=8,501 cpu=7,234 user=7,156 [seconds] byte[0]: elapsed=11,023 cpu=8,688 user=8,641 [seconds]
I will stay with new Object() not only because of readability :-)
The code
public class ObjectArrayCompare { private static Object o; public static void main(String[] args) { Instrumentation instr = InstrumentationAgent.getInstrumentation(); if (instr == null) { System.err.println("No Instrumentation, use \"-javaagent:Instrumentation.jar\""); return; } System.out.println(); System.out.println("an implementation-specific approximation of the amount of storage"); System.out.println("Object = " + instr.getObjectSize(new Object())); System.out.println("byte[0] = " + instr.getObjectSize(new byte[0])); System.out.println(); final int MAX = (int) 1.0e9; Timer timer; Times times; for (int j = 0; j < 2; j++) { System.out.println("time to create " + MAX + " instances"); timer = new Timer(); for (int i = 0; i < MAX; i++) { o = new Object(); } times = timer.times(); System.out.println("Object: " + times); timer = new Timer(); for (int i = 0; i < MAX; i++) { o = new byte[0]; } times = timer.times(); System.out.println("byte[0]: " + times); System.out.println(); } } }
The timer * uses ThreadMXBean to get the time.
* Timer is the class I made for timming, it is not one of the Java timers.