#!/usr/bin/env bash # JEP 534: object header size on JDK 26 (12 bytes) vs JDK 27 (8 bytes), measured with JOL 0.17. # ./scripts/object-headers.sh -> docs/output/10-headers-jdk26.txt, 11-headers-jdk27.txt, # 12-headers-jdk27-opt-out.txt, 13-jol-record-failure.txt, # 14-jol-record-workaround.txt set -euo pipefail source "$(dirname "$0")/env.sh" LIB="$ROOT/.lib"; mkdir -p "$LIB" JOL="$LIB/jol-core-0.17.jar" if [ ! -f "$JOL" ]; then curl -sfL -o "$JOL" https://repo1.maven.org/maven2/org/openjdk/jol/jol-core/0.17/jol-core-0.17.jar fi echo "4c98e9e61b3f189241057cb21b4331d1093e5b85 $JOL" | sha1sum -c - >/dev/null # Maven Central's own .sha1 BUILD="$ROOT/build/headers"; rm -rf "$BUILD"; mkdir -p "$BUILD" "$JDK27/bin/javac" --release 26 -cp "$JOL" -d "$BUILD" "$ROOT"/object-headers/src/*.java # JOL wants to attach to itself (for Instrumentation) and calls sun.misc.Unsafe, which JDK 24+ warns about. COMMON=(-Djdk.attach.allowAttachSelf=true -XX:+EnableDynamicAgentLoading --sun-misc-unsafe-memory-access=allow -cp "$BUILD:$JOL") # The Serviceability Agent line JOL 0.17 prints on JDK 27 is JOL failing to read a flag that no longer exists # (UseCompressedClassPointers is obsolete in 27); it is kept in the transcript because it is real. "$JDK26/bin/java" "${COMMON[@]}" HeaderDemo > "$OUT/10-headers-jdk26.txt" 2>&1 "$JDK27/bin/java" "${COMMON[@]}" HeaderDemo > "$OUT/11-headers-jdk27.txt" 2>&1 "$JDK27/bin/java" -XX:-UseCompactObjectHeaders "${COMMON[@]}" HeaderDemo > "$OUT/12-headers-jdk27-opt-out.txt" 2>&1 # JOL 0.17 cannot lay out a record without a workaround. Capture the failure and the fix. "$JDK27/bin/java" "${COMMON[@]}" RecordProbe > "$OUT/13-jol-record-failure.txt" 2>&1 || true "$JDK27/bin/java" -Djol.magicFieldOffset=true "${COMMON[@]}" RecordProbe > "$OUT/14-jol-record-workaround.txt" 2>&1 # One compact table of instance sizes, extracted from the three transcripts (not retyped). { echo "# Instance sizes in bytes, extracted from 10-, 11- and 12- transcripts" for f in 10-headers-jdk26 11-headers-jdk27 12-headers-jdk27-opt-out; do echo "--- $f" awk '/^=== /{t=$0} /^Instance size/{print t " -> " $0} /^1,000,000 /{print}' "$OUT/$f.txt" done } > "$OUT/15-headers-summary.txt" cat "$OUT/15-headers-summary.txt"