Uploaded image for project: 'JDK'
  1. JDK
  2. JDK-8355324

-XX:AOTMode=create fails for clojure.tools.logging

XMLWordPrintable

    • generic
    • generic

      ADDITIONAL SYSTEM INFORMATION :
      Tested on macOS and Linux, with Java versions openjdk-24, temurin-24.0.0+36 and openjdk-25-ea+16

      A DESCRIPTION OF THE PROBLEM :
      The "java -XX:AOTMode=create" command fails with the error "Archive heap points to a static field that may hold a different value at runtime" when trying to process a Clojure uberjar which uses the clojure.tools.logging library.

      STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
      Compile the provided example project to an uberjar with Leiningen, and try to process is using JEP 483: Ahead-of-Time Class Loading & Linking. The commands to run are:

      lein uberjar
      java -XX:AOTMode=record -XX:AOTConfiguration=target/app.aotconf -jar target/uberjar/kata.jar
      java -XX:AOTMode=create -XX:AOTConfiguration=target/app.aotconf -XX:AOTCache=target/app.aot --class-path target/uberjar/kata.jar
      java -XX:AOTMode=on -XX:AOTCache=target/app.aot -jar target/uberjar/kata.jar


      EXPECTED VERSUS ACTUAL BEHAVIOR :
      EXPECTED -
      All the commands execute successfully and the program prints Hello World with AOTMode=on.
      ACTUAL -
      + java -version
      openjdk version "24" 2025-03-18
      OpenJDK Runtime Environment (build 24+36-3646)
      OpenJDK 64-Bit Server VM (build 24+36-3646, mixed mode, sharing)
      + lein uberjar
      Compiling kata
      Created <PATH>/new-clojure-project/target/uberjar/new-clojure-project-0.1.0-SNAPSHOT.jar
      Created <PATH>/new-clojure-project/target/uberjar/kata.jar
      + java -XX:AOTMode=record -XX:AOTConfiguration=target/app.aotconf -jar target/uberjar/kata.jar
      Mar 28, 2025 10:59:45 PM clojure.tools.logging$eval136$fn__139 invoke
      INFO: Hello, World!
      + java -XX:AOTMode=create -XX:AOTConfiguration=target/app.aotconf -XX:AOTCache=target/app.aot --class-path target/uberjar/kata.jar
      [0.496s][warning][cds] Skipping jdk/internal/event/Event: JFR event class
      [0.687s][warning][cds,heap] Archive heap points to a static field that may hold a different value at runtime:
      [0.687s][warning][cds,heap] Field: java/lang/invoke/MethodHandleImpl$BindCaller::CD_Object_array
      [0.687s][warning][cds,heap] Value: jdk.internal.constant.ArrayClassDescImpl
      [0.687s][warning][cds,heap] {0x00000004001ebc28} - klass: 'jdk/internal/constant/ArrayClassDescImpl' - flags:
      [0.687s][warning][cds,heap]
      [0.687s][warning][cds,heap] - ---- fields (total size 3 words):
      [0.687s][warning][cds,heap] - private final 'rank' 'I' @12 1 (0x00000001)
      [0.687s][warning][cds,heap] - private final 'elementType' 'Ljava/lang/constant/ClassDesc;' @16 a 'jdk/internal/constant/ClassOrInterfaceDescImpl'{0x0000000400105930} (0x80020b26)
      [0.687s][warning][cds,heap] - private 'cachedDescriptorString' 'Ljava/lang/String;' @20 "[Ljava/lang/Object;"{0x000000040030d808} (0x80061b01)
      [0.687s][warning][cds,heap] --- trace begin ---
      [0.687s][warning][cds,heap] [ 0] {0x000000040022e5a8} java.lang.Class (jdk.internal.constant.ConstantUtils::CD_Object_array)
      [0.687s][warning][cds,heap] [ 1] {0x00000004001ebc28} jdk.internal.constant.ArrayClassDescImpl
      [0.687s][warning][cds,heap] --- trace end ---
      [0.687s][warning][cds,heap]
      [0.688s][error ][cds,heap] Scanned 47008 objects. Found 1 case(s) where an object points to a static field that may hold a different value at runtime.
      [0.688s][error ][cds ] An error has occurred while writing the shared archive file.

      ---------- BEGIN SOURCE ----------
      --- src/kata.clj ---
      (ns kata
        (:require [clojure.tools.logging :as log])
        (:gen-class))
      (defn -main [& _args]
        (log/info "Hello, World!"))

      --- project.clj ---
      (defproject new-clojure-project "0.1.0-SNAPSHOT"
        :dependencies [[org.clojure/clojure "1.11.1"]
                       [org.clojure/tools.logging "1.3.0"]]
        :main ^:skip-aot kata
        :target-path "target/%s"
        :profiles {:uberjar {:aot :all
                             :uberjar-name "kata.jar"}})

      ---------- END SOURCE ----------

            ellamas Edwin Llamas
            ellamas Edwin Llamas
            Votes:
            0 Vote for this issue
            Watchers:
            2 Start watching this issue

              Created:
              Updated:
              Resolved: