clojure-goes-fast / clj-async-profiler

Embedded high-precision Clojure profiler
http://clojure-goes-fast.com/kb/profiling/clj-async-profiler/
402 stars 17 forks source link

Issues with jdk11.clj, AOT and leiningen #37

Open mping-exo opened 15 hours ago

mping-exo commented 15 hours ago

I'm hitting the following issue with jdk11.clj (v >= 1.2.1):

❯ java -Dclojure.compiler.disable-locals-clearing=true -Djdk.attach.allowAttachSelf=true -XX:+UnlockDiagnosticVMOptions -XX:+DebugNonSafepoints -jar target/app-0.9.1346-SNAPSHOT-standalone.jar
...
Exception in thread "main" java.lang.ExceptionInInitializerError
    at java.base/java.lang.Class.forName0(Native Method)
    at java.base/java.lang.Class.forName(Class.java:534)
    at java.base/java.lang.Class.forName(Class.java:513)
    at clojure.lang.RT.classForName(RT.java:2209)
    at clojure.lang.RT.classForName(RT.java:2218)
    at clojure.lang.RT.loadClassForName(RT.java:2237)
    at clojure.lang.RT.load(RT.java:449)
    at clojure.lang.RT.load(RT.java:424)
    at clojure.core$load$fn__6908.invoke(core.clj:6161)
    at clojure.core$load.invokeStatic(core.clj:6160)
    at clojure.core$load.doInvoke(core.clj:6144)
    at clojure.lang.RestFn.invoke(RestFn.java:408)
    at clj_async_profiler.core__init.load(Unknown Source)
    at clj_async_profiler.core__init.<clinit>(Unknown Source)
    at java.base/java.lang.Class.forName0(Native Method)
    at java.base/java.lang.Class.forName(Class.java:534)
    at java.base/java.lang.Class.forName(Class.java:513)
    at clojure.lang.RT.classForName(RT.java:2209)
    at clojure.lang.RT.classForName(RT.java:2218)
    at clojure.lang.RT.loadClassForName(RT.java:2237)
    at clojure.lang.RT.load(RT.java:449)
    at clojure.lang.RT.load(RT.java:424)
    at clojure.core$load$fn__6908.invoke(core.clj:6161)
    at clojure.core$load.invokeStatic(core.clj:6160)
    at clojure.core$load.doInvoke(core.clj:6144)
    at clojure.lang.RestFn.invoke(RestFn.java:408)
    at clojure.core$load_one.invokeStatic(core.clj:5933)
    at clojure.core$load_one.invoke(core.clj:5928)
    at clojure.core$load_lib$fn__6850.invoke(core.clj:5975)
    at clojure.core$load_lib.invokeStatic(core.clj:5974)
    at clojure.core$load_lib.doInvoke(core.clj:5953)
    at clojure.lang.RestFn.applyTo(RestFn.java:142)
    at clojure.core$apply.invokeStatic(core.clj:669)
    at clojure.core$load_libs.invokeStatic(core.clj:6016)
    at clojure.core$load_libs.doInvoke(core.clj:6000)
    at clojure.lang.RestFn.applyTo(RestFn.java:137)
    at clojure.core$apply.invokeStatic(core.clj:669)
    at clojure.core$require.invokeStatic(core.clj:6038)
    at clojure.core$require.doInvoke(core.clj:6038)
    at clojure.lang.RestFn.invoke(RestFn.java:482)
    at app.proxy.profiler$loading__6789__auto____18889.invoke(profiler.clj:1)
    at app.proxy.profiler__init.load(Unknown Source)
    at app.proxy.profiler__init.<clinit>(Unknown Source)
    at java.base/java.lang.Class.forName0(Native Method)
    at java.base/java.lang.Class.forName(Class.java:534)
    at java.base/java.lang.Class.forName(Class.java:513)
    at clojure.lang.RT.classForName(RT.java:2209)
    at clojure.lang.RT.classForName(RT.java:2218)
    at clojure.lang.RT.loadClassForName(RT.java:2237)
    at clojure.lang.RT.load(RT.java:449)
    at clojure.lang.RT.load(RT.java:424)
    at clojure.core$load$fn__6908.invoke(core.clj:6161)
    at clojure.core$load.invokeStatic(core.clj:6160)
    at clojure.core$load.doInvoke(core.clj:6144)
    at clojure.lang.RestFn.invoke(RestFn.java:408)
    at clojure.core$load_one.invokeStatic(core.clj:5933)
    at clojure.core$load_one.invoke(core.clj:5928)
    at clojure.core$load_lib$fn__6850.invoke(core.clj:5975)
    at clojure.core$load_lib.invokeStatic(core.clj:5974)
    at clojure.core$load_lib.doInvoke(core.clj:5953)
    at clojure.lang.RestFn.applyTo(RestFn.java:142)
    at clojure.core$apply.invokeStatic(core.clj:669)
    at clojure.core$load_libs.invokeStatic(core.clj:6016)
    at clojure.core$load_libs.doInvoke(core.clj:6000)
    at clojure.lang.RestFn.applyTo(RestFn.java:137)
    at clojure.core$apply.invokeStatic(core.clj:669)
    at clojure.core$require.invokeStatic(core.clj:6038)
    at clojure.core$require.doInvoke(core.clj:6038)
    at clojure.lang.RestFn.invoke(RestFn.java:3894)
    at app.proxy.system$loading__6789__auto____1358.invoke(system.clj:1)
    at app.proxy.system__init.load(Unknown Source)
    at app.proxy.system__init.<clinit>(Unknown Source)
    at java.base/java.lang.Class.forName0(Native Method)
    at java.base/java.lang.Class.forName(Class.java:534)
    at java.base/java.lang.Class.forName(Class.java:513)
    at clojure.lang.RT.classForName(RT.java:2209)
    at clojure.lang.RT.classForName(RT.java:2218)
    at clojure.lang.RT.loadClassForName(RT.java:2237)
    at clojure.lang.RT.load(RT.java:449)
    at clojure.lang.RT.load(RT.java:424)
    at clojure.core$load$fn__6908.invoke(core.clj:6161)
    at clojure.core$load.invokeStatic(core.clj:6160)
    at clojure.core$load.doInvoke(core.clj:6144)
    at clojure.lang.RestFn.invoke(RestFn.java:408)
    at clojure.core$load_one.invokeStatic(core.clj:5933)
    at clojure.core$load_one.invoke(core.clj:5928)
    at clojure.core$load_lib$fn__6850.invoke(core.clj:5975)
    at clojure.core$load_lib.invokeStatic(core.clj:5974)
    at clojure.core$load_lib.doInvoke(core.clj:5953)
    at clojure.lang.RestFn.applyTo(RestFn.java:142)
    at clojure.core$apply.invokeStatic(core.clj:669)
    at clojure.core$load_libs.invokeStatic(core.clj:6016)
    at clojure.core$load_libs.doInvoke(core.clj:6000)
    at clojure.lang.RestFn.applyTo(RestFn.java:137)
    at clojure.core$apply.invokeStatic(core.clj:669)
    at clojure.core$require.invokeStatic(core.clj:6038)
    at clojure.core$require.doInvoke(core.clj:6038)
    at clojure.lang.RestFn.invoke(RestFn.java:482)
    at app.proxy.main$loading__6789__auto____1356.invoke(main.clj:1)
    at app.proxy.main__init.load(Unknown Source)
    at app.proxy.main__init.<clinit>(Unknown Source)
    at java.base/java.lang.Class.forName0(Native Method)
    at java.base/java.lang.Class.forName(Class.java:534)
    at java.base/java.lang.Class.forName(Class.java:513)
    at clojure.lang.RT.classForName(RT.java:2209)
    at clojure.lang.RT.classForName(RT.java:2218)
    at clojure.lang.RT.loadClassForName(RT.java:2237)
    at clojure.lang.RT.load(RT.java:449)
    at clojure.lang.RT.load(RT.java:424)
    at clojure.core$load$fn__6908.invoke(core.clj:6161)
    at clojure.core$load.invokeStatic(core.clj:6160)
    at clojure.core$load.doInvoke(core.clj:6144)
    at clojure.lang.RestFn.invoke(RestFn.java:408)
    at clojure.lang.Var.invoke(Var.java:384)
    at clojure.lang.Util.loadWithClass(Util.java:251)
    at app.proxy.main.<clinit>(Unknown Source)
Caused by: java.lang.NullPointerException: Cannot invoke "clojure.lang.Namespace.importClass(java.lang.Class)" because the return value of "clojure.lang.Var.deref()" is null
    at clj_async_profiler.util.jdk11__init.load(Unknown Source)
    at clj_async_profiler.util.jdk11__init.<clinit>(Unknown Source)
    ... 116 more

The only thing I could find on this was that somehow, clojure is expecting a namespace declaration on util.clj, other than that I don't think its related to any jar. If I use eg 1.2.0 it works OK.

alexander-yakushev commented 13 hours ago

You are AOT-compiling clj-async-profiler, right? With 1.2.1 I introduced some changes that apparently broke AOT.

Also, do you use Leiningen?

mping-exo commented 12 hours ago

Yes to both: using lein, and AOT'ing.

alexander-yakushev commented 12 hours ago

You can try to either:

I will work on a fix soon; however, I don't recommend aot-compiling this library as it depends on JDK version. Compiled for JDK8 it won't work with later versions and vice versa.