New posts
This commit is contained in:
@@ -0,0 +1,113 @@
|
||||
#!/usr/bin/env bash
|
||||
# Regenerates every file in output/.
|
||||
# JDK25=/path JDK21=/path [JDK26=/path JDK27=/path] ./scripts/run-all.sh
|
||||
# Steps 06 and 07 download jars from Maven Central (sha1-checked); everything else is offline.
|
||||
set -uo pipefail
|
||||
unset JAVA_TOOL_OPTIONS
|
||||
HERE="$(cd "$(dirname "$0")/.." && pwd)"
|
||||
JDK25="${JDK25:-/tmp/tools/jdk-25.0.5+8}"
|
||||
JDK21="${JDK21:-/usr/lib/jvm/java-21-openjdk-amd64}"
|
||||
JDK26="${JDK26:-}"; JDK27="${JDK27:-}"
|
||||
OUT="$HERE/output"; mkdir -p "$OUT"
|
||||
B="$(mktemp -d)"; trap 'rm -rf "$B"' EXIT
|
||||
cd "$HERE"
|
||||
F='--sun-misc-unsafe-memory-access'
|
||||
norm() { sed "s#$B#<build>#g"; } # keep temp-dir paths out of the transcripts
|
||||
ver() { "$1/bin/java" -version 2>&1 | sed -n 1p; }
|
||||
|
||||
# ---- 01 which JDK did what ----------------------------------------------------------------
|
||||
{ for j in "$JDK21" "$JDK25" "$JDK26" "$JDK27"; do [ -n "$j" ] && { echo "== $(ver "$j")"; "$j/bin/java" tools/ListUnsafe.java 2>&1; echo; }; done
|
||||
} > "$OUT/01-unsafe-methods-per-jdk.txt"
|
||||
|
||||
# ---- 02 compile-time warnings -------------------------------------------------------------
|
||||
mkdir -p "$B/c25" "$B/c21"
|
||||
{ echo "\$ javac src/UnsafeAccess.java broken/Probe.java ($(ver "$JDK25"))"
|
||||
"$JDK25/bin/javac" -d "$B/c25" src/UnsafeAccess.java broken/Probe.java 2>&1 | grep -E 'warning|^[0-9]+ warnings?'
|
||||
echo; echo "\$ javac src/UnsafeAccess.java broken/Probe.java ($(ver "$JDK21"))"
|
||||
"$JDK21/bin/javac" -d "$B/c21" src/UnsafeAccess.java broken/Probe.java 2>&1 | grep -E 'warning|^[0-9]+ warnings?'
|
||||
echo; echo "\$ javac -Xlint:removal -Werror src/UnsafeAccess.java broken/Probe.java ($(ver "$JDK25"))"
|
||||
"$JDK25/bin/javac" -Xlint:removal -Werror -d "$B/w" src/UnsafeAccess.java broken/Probe.java 2>&1 | grep -E 'removal|error|^[0-9]+ (error|warning)' | head -6; echo "exit=${PIPESTATUS[0]}"
|
||||
} > "$OUT/02-compile-warnings.txt"
|
||||
|
||||
# ---- 03 the four flag values on JDK 25 ----------------------------------------------------
|
||||
{ for a in "" allow warn debug deny; do
|
||||
[ -z "$a" ] && { echo "\$ java -cp build Probe (JDK 25 default)"; "$JDK25/bin/java" -cp "$B/c25" Probe 2>&1 | norm; } \
|
||||
|| { echo "\$ java $F=$a -cp build Probe"; "$JDK25/bin/java" "$F=$a" -cp "$B/c25" Probe 2>&1 | norm; }
|
||||
echo
|
||||
done
|
||||
echo "# the JVM also publishes the flag as a system property that libraries can read"
|
||||
for a in "" allow warn debug deny; do
|
||||
[ -z "$a" ] && { echo "\$ java tools/Prop.java (default)"; "$JDK25/bin/java" tools/Prop.java 2>&1; } \
|
||||
|| { echo "\$ java $F=$a tools/Prop.java"; "$JDK25/bin/java" "$F=$a" tools/Prop.java 2>&1; }
|
||||
done
|
||||
} > "$OUT/03-flag-values-jdk25.txt"
|
||||
|
||||
# ---- 04 same class, other JDKs ------------------------------------------------------------
|
||||
{ echo "\$ java -cp build Probe ($(ver "$JDK21"), class file compiled by JDK 21)"; "$JDK21/bin/java" -cp "$B/c21" Probe 2>&1 | norm; echo
|
||||
echo "\$ java $F=deny -cp build Probe ($(ver "$JDK21"))"; "$JDK21/bin/java" "$F=deny" -cp "$B/c21" Probe 2>&1 | norm; echo
|
||||
for j in "$JDK26" "$JDK27"; do [ -n "$j" ] && { echo "\$ java -cp build Probe ($(ver "$j"))"; "$j/bin/java" -cp "$B/c25" Probe 2>&1 | norm | head -4; echo "..."; echo; }; done
|
||||
} > "$OUT/04-same-class-other-jdks.txt"
|
||||
|
||||
# ---- 05 jdeps on our own classes ----------------------------------------------------------
|
||||
{ echo "\$ jdeps --jdk-internals build ($(ver "$JDK25"))"; "$JDK25/bin/jdeps" --jdk-internals "$B/c25" 2>&1 | norm
|
||||
} > "$OUT/05-jdeps-own-classes.txt"
|
||||
|
||||
# ---- 06/07 real libraries -----------------------------------------------------------------
|
||||
online=no; for i in 1 2 3 4 5; do curl -sf -o /dev/null https://repo1.maven.org/maven2/io/netty/netty-common/maven-metadata.xml && { online=yes; break; }; sleep 1; done
|
||||
if [ $online = yes ]; then
|
||||
JDK25="$JDK25" "$HERE/scripts/scan-libs.sh" > "$OUT/06-scan-libraries.txt" 2>&1
|
||||
ONLY='guava:33|hadoop-common:3.5|protobuf|cassandra|spark|kryo' JDK25="$JDK25" "$HERE/scripts/scan-libs.sh" --classes > "$OUT/11-scan-callers.txt" 2>&1
|
||||
L="$B/lib"; mkdir -p "$L"
|
||||
fetch() { for i in 1 2 3 4 5 6; do curl -sfL -o "$L/$(basename "$1")" "https://repo1.maven.org/maven2/$1" && return 0; sleep 1; done; return 1; }
|
||||
for v in 4.1.140.Final 4.2.20.Final; do fetch io/netty/netty-common/$v/netty-common-$v.jar; fetch io/netty/netty-buffer/$v/netty-buffer-$v.jar; done
|
||||
{ echo "\$ jdeps --jdk-internals netty-common-4.1.140.Final.jar (excerpt)"
|
||||
"$JDK25/bin/jdeps" --jdk-internals --multi-release 25 "$L/netty-common-4.1.140.Final.jar" 2>&1 | sed -n '1,4p;/^JDK Internal API/,$p'
|
||||
echo; echo "\$ jdeps --jdk-internals netty-common-4.1.140.Final.jar | grep -c -- '-> sun.misc.Unsafe'"
|
||||
"$JDK25/bin/jdeps" --jdk-internals --multi-release 25 "$L/netty-common-4.1.140.Final.jar" 2>&1 | grep -c -- '-> sun.misc.Unsafe'
|
||||
} > "$OUT/07-jdeps-netty.txt"
|
||||
{
|
||||
for v in 4.1.140.Final 4.2.20.Final; do
|
||||
CP="$L/netty-common-$v.jar:$L/netty-buffer-$v.jar"; mkdir -p "$B/n$v"; "$JDK25/bin/javac" -cp "$CP" -d "$B/n$v" tools/NettyProbe.java 2>&1
|
||||
for a in "" allow deny debug; do
|
||||
[ -z "$a" ] && echo "\$ java -cp netty-$v NettyProbe (JDK 25 default)" || echo "\$ java $F=$a -cp netty-$v NettyProbe"
|
||||
{ [ -z "$a" ] && "$JDK25/bin/java" -cp "$CP:$B/n$v" NettyProbe || "$JDK25/bin/java" "$F=$a" -cp "$CP:$B/n$v" NettyProbe; } 2>&1 | sed "s#$L#<lib>#g" | head -9
|
||||
echo
|
||||
done
|
||||
done
|
||||
for v in 4.1.140.Final 4.2.20.Final; do
|
||||
echo "\$ unzip -p netty-common-$v.jar io/netty/util/internal/PlatformDependent0.class | grep -a -o -F 'sun.misc.unsafe.memory.access'"
|
||||
unzip -p "$L/netty-common-$v.jar" io/netty/util/internal/PlatformDependent0.class | grep -a -o -F 'sun.misc.unsafe.memory.access' | sort -u
|
||||
done
|
||||
} > "$OUT/08-netty-runtime.txt"
|
||||
# Guava 32.1.3 vs 33.8.0 on JDK 25: same three calls, different behaviour
|
||||
fetch com/google/guava/failureaccess/1.0.3/failureaccess-1.0.3.jar
|
||||
for v in 32.1.3-jre 33.8.0-jre; do fetch com/google/guava/guava/$v/guava-$v.jar; done
|
||||
mkdir -p "$B/gp"; "$JDK25/bin/javac" -cp "$L/guava-33.8.0-jre.jar:$L/failureaccess-1.0.3.jar" -d "$B/gp" tools/GuavaProbe.java >/dev/null 2>&1
|
||||
{ for v in 32.1.3-jre 33.8.0-jre; do
|
||||
CP="$L/guava-$v.jar:$L/failureaccess-1.0.3.jar:$B/gp"
|
||||
for a in "" debug deny; do
|
||||
[ -z "$a" ] && echo "\$ java -cp guava-$v GuavaProbe (JDK 25 default)" || echo "\$ java $F=$a -cp guava-$v GuavaProbe"
|
||||
{ [ -z "$a" ] && "$JDK25/bin/java" -cp "$CP" GuavaProbe || "$JDK25/bin/java" "$F=$a" -cp "$CP" GuavaProbe; } 2>&1 | sed "s#$L#<lib>#g" | head -9
|
||||
echo
|
||||
done
|
||||
done
|
||||
} > "$OUT/12-guava-runtime.txt"
|
||||
else
|
||||
echo "no network: skipped 06-08"
|
||||
fi
|
||||
|
||||
# ---- 10 JFR: finds the callers even with =allow ------------------------------------------
|
||||
jfrsum() { "$JDK25/bin/jfr" print --events jdk.DeprecatedInvocation "$1" | grep -E 'method = |line:' | sed 's/^ *//' | sort | uniq -c | sed "s#^ *# #"; }
|
||||
{ echo "\$ java -XX:StartFlightRecording:filename=probe.jfr $F=allow -cp build Probe (silent: no warnings)"
|
||||
"$JDK25/bin/java" "-XX:StartFlightRecording:filename=$B/probe.jfr" "$F=allow" -cp "$B/c25" Probe 2>&1 | grep -v 'jfr,startup'
|
||||
echo "\$ jfr print --events jdk.DeprecatedInvocation probe.jfr | grep -E 'method = |line:' | sort | uniq -c"; jfrsum "$B/probe.jfr"
|
||||
} > "$OUT/10-jfr-deprecated-invocation.txt"
|
||||
|
||||
# ---- 09 the migration: before/after equivalence -------------------------------------------
|
||||
mkdir -p "$B/m"; "$JDK25/bin/javac" -nowarn -d "$B/m" src/*.java 2>&1 | grep -E 'error'
|
||||
{ echo "\$ java $F=allow -cp build Equivalence (Unsafe, VarHandle and FFM side by side)"; "$JDK25/bin/java" "$F=allow" -cp "$B/m" Equivalence 2>&1; echo "exit=$?"; echo
|
||||
echo "\$ java $F=deny -cp build Equivalence --new-only (replacements only)"; "$JDK25/bin/java" "$F=deny" -cp "$B/m" Equivalence --new-only 2>&1; echo "exit=$?"; echo
|
||||
echo "\$ java $F=deny -cp build Equivalence (the Unsafe version under deny)"; "$JDK25/bin/java" "$F=deny" -cp "$B/m" Equivalence 2>&1 | head -6 | norm; echo
|
||||
echo "\$ java -cp build Equivalence (JDK 25 default: one warning, then the same results)"; "$JDK25/bin/java" -cp "$B/m" Equivalence 2>&1 | norm | head -7
|
||||
} > "$OUT/09-equivalence.txt"
|
||||
echo "wrote $OUT"
|
||||
Reference in New Issue
Block a user