$ docker run -d --memory=1g --name hdr -v $PWD/docker/headersize.jar:/headersize.jar \ --entrypoint java flags-demo: [extra flags] -cp /headersize.jar HeaderSizeDemo 2000000 $ docker exec hdr jcmd 1 GC.class_histogram | grep -E "Pair|Total" --- JDK 25, default (UseCompactObjectHeaders=false), flags-demo:jdk25-jdk --- 1: 2000000 48000000 HeaderSizeDemo$Pair 273: 1 24 java.lang.invoke.StringConcatFactory$InlineHiddenClassStrategy$MethodHandlePair (java.base@25.0.4.1) Total 2030279 57368512 --- JDK 25, -XX:+UseCompactObjectHeaders --- 1: 2000000 32000000 HeaderSizeDemo$Pair 300: 1 16 java.lang.invoke.StringConcatFactory$InlineHiddenClassStrategy$MethodHandlePair (java.base@25.0.4.1) Total 2030283 41272056 --- JDK 27, default (UseCompactObjectHeaders=true), flags-demo:jdk27 --- 1: 2000000 32000000 HeaderSizeDemo$Pair 317: 1 16 java.lang.invoke.StringConcatFactory$InlineHiddenClassStrategy$MethodHandlePair (java.base@27) Total 2030937 41320144 --- JDK 27, -XX:-UseCompactObjectHeaders --- 1: 2000000 48000000 HeaderSizeDemo$Pair 282: 1 24 java.lang.invoke.StringConcatFactory$InlineHiddenClassStrategy$MethodHandlePair (java.base@27) Total 2031092 57425040 2,000,000 instances of a 2-int object: 48,000,000 bytes (24 bytes each) with the old header, 32,000,000 bytes (16 bytes each) compact. 33% smaller per instance, reproduced symmetrically in both directions on both JDKs.