-
Bug
-
Resolution: Other
-
P2
-
8u201, 11.0.2, 12, 13
ADDITIONAL SYSTEM INFORMATION :
Mac OS X 10.13.6 on 2018 Macbook Pro
A DESCRIPTION OF THE PROBLEM :
I am part of the Clojure core team. I have received at least 4 reports in the last day of significantly degraded performance for Clojure when using the latest Java 1.8 and 11 releases (1.8.0_201 and 11.0.2) vs the prior releases (1.8.0_192 and 11.0.1), with no other changes.
REGRESSION : Last worked in version 11.0.1
STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
You can find a reproducible case at https://github.com/hiredman/weird-user-load-performance.
1) Install the Clojure clj dependency manager / runner (see https://clojure.org/guides/getting_started)
2) Clone the repo https://github.com/hiredman/weird-user-load-performance.git
3) cd weird-user-load-performance
4) clj -A:user
clj is used basically just to download the dependency jars from Maven, form the classpath, and start the Clojure runtime to run a script, which just loads a Clojure namespace (and subsequently all downstream namespaces). The "work" happening here is loading .clj files from jar files on the classpath, running the compiler, generating bytecode, and loading it in a classloader.
The first run of clj will download all of the transitive deps so that run should be discarded. All subsequent runs should use the cached jars in ~/.m2/repository and a cached classpath, so should not use the network.
This is a narrowed down use case from a more complicated library, but one aspect that seems to aggravate things is that there is very macro-heavy code, which is single-thread CPU-intensive.
EXPECTED VERSUS ACTUAL BEHAVIOR :
EXPECTED -
The program will print a timing of loading the namespaces. The expected result is that the performance is approximately the same in 1.8.0_192 vs 1.8.0_201 or 11.0.1 vs 11.0.2.
ACTUAL -
1.8.0_192: 2834.550371 msecs
1.8.0_201: 9545.118397 msecs (3.3x performance degradation)
11.0.1: 2945.72692 msecs
11.0.2: 10817.427187 msecs (3.7x performance degradation)
---------- BEGIN SOURCE ----------
Unfortunately, I have been unable to narrow this down enough to be able to reproduce it in a Java-only environment. The Clojure source files are at the root of the repo - there are only 3 lines of Clojure code that just trigger a lot of compilation. I am hoping there is enough information or that this report can be combined with others to discover the cause.
---------- END SOURCE ----------
CUSTOMER SUBMITTED WORKAROUND :
Clojure users are currently downgrading to the prior version to avoid the issue.
FREQUENCY : always
Mac OS X 10.13.6 on 2018 Macbook Pro
A DESCRIPTION OF THE PROBLEM :
I am part of the Clojure core team. I have received at least 4 reports in the last day of significantly degraded performance for Clojure when using the latest Java 1.8 and 11 releases (1.8.0_201 and 11.0.2) vs the prior releases (1.8.0_192 and 11.0.1), with no other changes.
REGRESSION : Last worked in version 11.0.1
STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
You can find a reproducible case at https://github.com/hiredman/weird-user-load-performance.
1) Install the Clojure clj dependency manager / runner (see https://clojure.org/guides/getting_started)
2) Clone the repo https://github.com/hiredman/weird-user-load-performance.git
3) cd weird-user-load-performance
4) clj -A:user
clj is used basically just to download the dependency jars from Maven, form the classpath, and start the Clojure runtime to run a script, which just loads a Clojure namespace (and subsequently all downstream namespaces). The "work" happening here is loading .clj files from jar files on the classpath, running the compiler, generating bytecode, and loading it in a classloader.
The first run of clj will download all of the transitive deps so that run should be discarded. All subsequent runs should use the cached jars in ~/.m2/repository and a cached classpath, so should not use the network.
This is a narrowed down use case from a more complicated library, but one aspect that seems to aggravate things is that there is very macro-heavy code, which is single-thread CPU-intensive.
EXPECTED VERSUS ACTUAL BEHAVIOR :
EXPECTED -
The program will print a timing of loading the namespaces. The expected result is that the performance is approximately the same in 1.8.0_192 vs 1.8.0_201 or 11.0.1 vs 11.0.2.
ACTUAL -
1.8.0_192: 2834.550371 msecs
1.8.0_201: 9545.118397 msecs (3.3x performance degradation)
11.0.1: 2945.72692 msecs
11.0.2: 10817.427187 msecs (3.7x performance degradation)
---------- BEGIN SOURCE ----------
Unfortunately, I have been unable to narrow this down enough to be able to reproduce it in a Java-only environment. The Clojure source files are at the root of the repo - there are only 3 lines of Clojure code that just trigger a lot of compilation. I am hoping there is enough information or that this report can be combined with others to discover the cause.
---------- END SOURCE ----------
CUSTOMER SUBMITTED WORKAROUND :
Clojure users are currently downgrading to the prior version to avoid the issue.
FREQUENCY : always
- relates to
-
JDK-8223173 Implement fast class initialization checks on AARCH64
- Resolved
-
JDK-8188133 C2: Static field accesses in clinit can trigger deoptimizations
- Resolved
-
JDK-8223213 Implement fast class initialization checks on x86-64
- Resolved