Spark 4.2.0-preview5 fails at SparkContext init on JDK 26: ClassNotFoundException: jdk.internal.ref.Cleaner
Description
org.apache.spark.unsafe.Platform fails to initialize on JDK 26 because its
static initializer attempts to load jdk.internal.ref.Cleaner by name, which no
longer exists / is no longer accessible in JDK 26. The failure surfaces as an
ExceptionInInitializerError the first time SparkSession.builder().getOrCreate()
creates a SparkContext, making Spark completely unusable on JDK 26.
The root cause is in Platform.<clinit> (Platform.java:84 / :104), which resolves a
Cleaner class via Class.forName("jdk.internal.ref.Cleaner") and rethrows the
ClassNotFoundException wrapped in an IllegalStateException.
Affected version
- Spark: 4.2.0-preview5
- Scala: 2.13.18
- JDK: OpenJDK 26.0.1 (Homebrew build 26.0.1)
- OS: macOS (Darwin 25.5.0)
Steps to reproduce
- Build/run with JDK 26.
- Create a local
SparkSession:
SparkSession.builder()
.master("local[*]")
.getOrCreate();
Actual behavior
java.lang.ExceptionInInitializerError
at org.apache.spark.unsafe.array.ByteArrayMethods.(ByteArrayMethods.java:47)
at org.apache.spark.memory.MemoryManager.defaultPageSizeBytes$lzycompute(MemoryManager.scala:261)
at org.apache.spark.memory.MemoryManager.defaultPageSizeBytes(MemoryManager.scala:251)
at org.apache.spark.memory.MemoryManager.$anonfun$pageSizeBytes$1(MemoryManager.scala:271)
at scala.runtime.java8.JFunction0$mcJ$sp.apply(JFunction0$mcJ$sp.scala:17)
at scala.Option.getOrElse(Option.scala:201)
at org.apache.spark.memory.MemoryManager.(MemoryManager.scala:271)
at org.apache.spark.memory.UnifiedMemoryManager.(UnifiedMemoryManager.scala:67)
at org.apache.spark.memory.UnifiedMemoryManager$.apply(UnifiedMemoryManager.scala:456)
at org.apache.spark.SparkEnv.initializeMemoryManager(SparkEnv.scala:261)
at org.apache.spark.memory.UnifiedMemoryManager$.apply(UnifiedMemoryManager.scala:456)
at org.apache.spark.SparkEnv.initializeMemoryManager(SparkEnv.scala:261)
at org.apache.spark.SparkContext.(SparkContext.scala:597)
at org.apache.spark.SparkContext$.getOrCreate(SparkContext.scala:3075)
at org.apache.spark.sql.classic.SparkSession$Builder.$anonfun$build$2(SparkSession.scala:1045)
at scala.Option.getOrElse(Option.scala:201)
at org.apache.spark.sql.classic.SparkSession$Builder.build(SparkSession.scala:1036)
at org.apache.spark.sql.classic.SparkSession$Builder.getOrCreate(SparkSession.scala:1065)
at org.apache.spark.sql.classic.SparkSession$Builder.getOrCreate(SparkSession.scala:938)
at org.apache.spark.sql.SparkSession$Builder.getOrCreate(SparkSession.scala:929)
Caused by: java.lang.IllegalStateException: java.lang.ClassNotFoundException: jdk.internal.ref.Cleaner
at org.apache.spark.unsafe.Platform.(Platform.java:104)
... 19 more
Caused by: java.lang.ClassNotFoundException: jdk.internal.ref.Cleaner
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:580)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:502)
at java.base/java.lang.Class.forName0(Native Method)
at java.base/java.lang.Class.forName(Class.java:478)
at java.base/java.lang.Class.forName(Class.java:468)
at org.apache.spark.unsafe.Platform.(Platform.java:84)
... 19 more
Expected behavior
Platform should initialize successfully on JDK 26 and SparkContext creation
should complete. Platform. should tolerate the absence of
jdk.internal.ref.Cleaner (e.g. fall back gracefully when the class cannot be
resolved) rather than propagating the ClassNotFoundException as an
ExceptionInInitializerError.
Notes
- Reproduces deterministically on every getOrCreate() — it is not
timing/environment dependent.
- Likely also requires the usual --add-opens/--add-exports JVM flags for
java.base internals on recent JDKs, but the missing class here is a hard
removal, not merely an access restriction, so JVM flags alone do not resolve it.
Spark 4.2.0-preview5 fails at SparkContext init on JDK 26: ClassNotFoundException: jdk.internal.ref.Cleaner
Description
org.apache.spark.unsafe.Platformfails to initialize on JDK 26 because itsstatic initializer attempts to load
jdk.internal.ref.Cleanerby name, which nolonger exists / is no longer accessible in JDK 26. The failure surfaces as an
ExceptionInInitializerErrorthe first timeSparkSession.builder().getOrCreate()creates a
SparkContext, making Spark completely unusable on JDK 26.The root cause is in
Platform.<clinit>(Platform.java:84 / :104), which resolves aCleanerclass viaClass.forName("jdk.internal.ref.Cleaner")and rethrows theClassNotFoundExceptionwrapped in anIllegalStateException.Affected version
Steps to reproduce
SparkSession:Actual behavior
java.lang.ExceptionInInitializerError
at org.apache.spark.unsafe.array.ByteArrayMethods.(ByteArrayMethods.java:47)
at org.apache.spark.memory.MemoryManager.defaultPageSizeBytes$lzycompute(MemoryManager.scala:261)
at org.apache.spark.memory.MemoryManager.defaultPageSizeBytes(MemoryManager.scala:251)
at org.apache.spark.memory.MemoryManager.$anonfun$pageSizeBytes$1(MemoryManager.scala:271)
at scala.runtime.java8.JFunction0$mcJ$sp.apply(JFunction0$mcJ$sp.scala:17)
at scala.Option.getOrElse(Option.scala:201)
at org.apache.spark.memory.MemoryManager.(MemoryManager.scala:271)
at org.apache.spark.memory.UnifiedMemoryManager.(UnifiedMemoryManager.scala:67)
at org.apache.spark.memory.UnifiedMemoryManager$.apply(UnifiedMemoryManager.scala:456)
at org.apache.spark.SparkEnv.initializeMemoryManager(SparkEnv.scala:261)
at org.apache.spark.memory.UnifiedMemoryManager$.apply(UnifiedMemoryManager.scala:456)
at org.apache.spark.SparkEnv.initializeMemoryManager(SparkEnv.scala:261)
at org.apache.spark.SparkContext.(SparkContext.scala:597)
at org.apache.spark.SparkContext$.getOrCreate(SparkContext.scala:3075)
at org.apache.spark.sql.classic.SparkSession$Builder.$anonfun$build$2(SparkSession.scala:1045)
at scala.Option.getOrElse(Option.scala:201)
at org.apache.spark.sql.classic.SparkSession$Builder.build(SparkSession.scala:1036)
at org.apache.spark.sql.classic.SparkSession$Builder.getOrCreate(SparkSession.scala:1065)
at org.apache.spark.sql.classic.SparkSession$Builder.getOrCreate(SparkSession.scala:938)
at org.apache.spark.sql.SparkSession$Builder.getOrCreate(SparkSession.scala:929)
Caused by: java.lang.IllegalStateException: java.lang.ClassNotFoundException: jdk.internal.ref.Cleaner
at org.apache.spark.unsafe.Platform.(Platform.java:104)
... 19 more
Caused by: java.lang.ClassNotFoundException: jdk.internal.ref.Cleaner
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:580)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:502)
at java.base/java.lang.Class.forName0(Native Method)
at java.base/java.lang.Class.forName(Class.java:478)
at java.base/java.lang.Class.forName(Class.java:468)
at org.apache.spark.unsafe.Platform.(Platform.java:84)
... 19 more
Expected behavior
Platform should initialize successfully on JDK 26 and SparkContext creation
should complete. Platform. should tolerate the absence of
jdk.internal.ref.Cleaner (e.g. fall back gracefully when the class cannot be
resolved) rather than propagating the ClassNotFoundException as an
ExceptionInInitializerError.
Notes
timing/environment dependent.
java.base internals on recent JDKs, but the missing class here is a hard
removal, not merely an access restriction, so JVM flags alone do not resolve it.