Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

OpenJ9 startup performance on a Spring Boot application #5918

Closed
jsimomaa opened this issue May 28, 2019 · 109 comments · Fixed by #6174
Closed

OpenJ9 startup performance on a Spring Boot application #5918

jsimomaa opened this issue May 28, 2019 · 109 comments · Fixed by #6174

Comments

@jsimomaa
Copy link

jsimomaa commented May 28, 2019

Java -version output

openjdk version "1.8.0_212"
OpenJDK Runtime Environment (build 1.8.0_212-b04)
Eclipse OpenJ9 VM (build openj9-0.14.2, JRE 1.8.0 Windows 10 amd64-64-Bit Compressed References 20190521_368 (JIT enabled, AOT enabled)
OpenJ9   - 4b1df46fe
OMR      - b56045d2
JCL      - a8c217d402 based on jdk8u212-b04)

Summary of problem

I'm experimenting with both AdoptOpenJDK and openJ9 but I'm having weirdly poor performance with our Spring Boot based application in comparison to OpenJDK and HotSpot.

The exact version of AdoptOpenJDK is:

C:\Program Files\Java>"jdk-12.0.1+12\bin\java.exe" -version
openjdk version "12.0.1" 2019-04-16
OpenJDK Runtime Environment AdoptOpenJDK (build 12.0.1+12)
Eclipse OpenJ9 VM AdoptOpenJDK (build openj9-0.14.1, JRE 12 Windows 10 amd64-64-Bit Compressed References 20190418_57 (JIT enabled, AOT enabled)
OpenJ9   - 412258978
OMR      - 4a4278e6
JCL      - 9fad1c64af based on jdk-12.0.1+12)

And the version of OpenJDK is:

C:\Program Files\Java>jdk-12.0.1\bin\java -version
openjdk version "12.0.1" 2019-04-16
OpenJDK Runtime Environment (build 12.0.1+12)
OpenJDK 64-Bit Server VM (build 12.0.1+12, mixed mode, sharing)

I know the following results are not real benchmarks or anything but just to give an idea of the magnitude how much slower the openJ9 is in comparison.

With HotSpot:

20:42:12.197 [main] INFO  c.y.p.application.Application        - Starting Application on ...
20:42:20.064 [main] INFO  org.reflections.Reflections          - Reflections took 92 ms to scan 1 urls, producing 1 keys and 1 values 
20:42:25.918 [main] INFO  c.y.p.application.Application        - Started Application in 14.462 seconds (JVM running for 16.663)

And then with openJ9:

20:37:33.995 [main] INFO  c.y.p.application.Application        - Starting Application on ...
20:39:01.341 [main] INFO  org.reflections.Reflections          - Reflections took 3333 ms to scan 1 urls, producing 1 keys and 1 values 
20:40:05.520 [main] INFO  c.y.p.application.Application        - Started Application in 161.122 seconds (JVM running for 168.174)

I am launching the openJ9 version with flags -Xms256m -Xmx1G -Xshareclasses -Xquickstart.

Also, partial output of systeminfo cmd:

$ systeminfo

Host Name:                 xxx
OS Name:                   Microsoft Windows 10 Pro
OS Version:                10.0.17763 N/A Build 17763
OS Manufacturer:           Microsoft Corporation
OS Configuration:          Standalone Workstation
OS Build Type:             Multiprocessor Free
Registered Owner:          Jani
Registered Organization:   Microsoft
Product ID:                00330-80000-00000-AA476
Original Install Date:     21.2.2019, 16.44.02
System Boot Time:          28.5.2019, 21.27.11
System Manufacturer:       Dell Inc.
System Model:              XPS 15 9550
System Type:               x64-based PC
Processor(s):              1 Processor(s) Installed.
                           [01]: Intel64 Family 6 Model 94 Stepping 3 GenuineIntel ~2601 Mhz
BIOS Version:              Dell Inc. 1.3.0, 11.8.2017
Windows Directory:         C:\WINDOWS
System Directory:          C:\WINDOWS\system32
Boot Device:               \Device\HarddiskVolume1
System Locale:             en-us;English (United States)
Input Locale:              fi;Finnish
Time Zone:                 (UTC+02:00) Helsinki, Kyiv, Riga, Sofia, Tallinn, Vilnius
Total Physical Memory:     32 630 MB
Available Physical Memory: 23 378 MB
Virtual Memory: Max Size:  44 553 MB
Virtual Memory: Available: 34 241 MB
Virtual Memory: In Use:    10 312 MB
Page File Location(s):     C:\pagefile.sys

Any tips or pointers what could be wrong with my setup here? Thanks!

Some followup discussion can be found from openj9 slack #newcomers: https://openj9.slack.com/archives/C862YFGL9/p1559066270001000

@jsimomaa
Copy link
Author

Also testing the performance with JDK8:

openjdk version "1.8.0_212"
OpenJDK Runtime Environment (build 1.8.0_212-b04)
Eclipse OpenJ9 VM (build openj9-0.14.2, JRE 1.8.0 Windows 10 amd64-64-Bit Compressed References 20190521_368 (JIT enabled, AOT enabled)
OpenJ9   - 4b1df46fe
OMR      - b56045d2
JCL      - a8c217d402 based on jdk8u212-b04)

And the startup time with args -Xms256m -Xmx1G -Xshareclasses:

21:42:37.876 [main] INFO  c.y.p.application.Application        - Started Application in 83.586 seconds (JVM running for 86.686)

Then another try with JDK8 and args -Xms256m -Xmx1G -Xshareclasses -Xjit:verbose={compilePerformance},vlog=vlog:

21:45:31.391 [main] INFO  c.y.p.application.Application        - Started Application in 35.898 seconds (JVM running for 38.25)

@jsimomaa
Copy link
Author

Here is the vlog file (changed the file type to .txt to make GitHub happy)
vlog.20190528.220511.15780.txt

@dsouzai
Copy link
Contributor

dsouzai commented May 28, 2019

$ perl avgCompTime.pl vlog.20190528.220511.15780.txt 
+ (warm) org/opensaml/core/xml/config/XMLConfigurator.initializeObjectProviders(Lorg/w3c/dom/Element;)V @ 0x00000000579A92C0-0x00000000579B40D8 OrdinaryMethod - Q_SZ=23 Q_SZI=23 QW=48 j9m=0000000003F80978 bcsz=233 OSR time=1533159us mem=[region=65216 system=65536]KB compThread=1 CpuLoad=178%(22%avg) JvmCpu=163%
vlog.20190528.220511.15780.txt
	Samples MAX(ms) TOTAL(ms)	AVG(usec)	MIN(usec)
Total	2771	1533.2	27939.7		10083		308
cold	2046	136.2	12358.8		6040		308
warm	724	1533.2	15545.3		21471		771
hot	1	35.6	35.6		35614		35614
MAXLINE=+ (warm) org/opensaml/core/xml/config/XMLConfigurator.initializeObjectProviders(Lorg/w3c/dom/Element;)V @ 0x00000000579A92C0-0x00000000579B40D8 OrdinaryMethod - Q_SZ=23 Q_SZI=23 QW=48 j9m=0000000003F80978 bcsz=233 OSR time=1533159us mem=[region=65216 system=65536]KB compThread=1 CpuLoad=178%(22%avg) JvmCpu=163%
numCGR   recompilations = 0
numgcr   recompilations = 0
pushy    recompilations = 0
coldupgr recompilations = 8 (AOT=0, JIT=8
forcedAOTupgrades       = 0
numAOTLoadsNotRecompiled= 0
inv      recompilations = 0
sync compilations = 0
DLT compilations  = 0
numFailures       = 202
max_Q_SZ          = 56
lastTimestamp     = 199922
total compilation time = 27939.71 ms

Doesn't look like any AOT compilations happened :S. From the vlog:

#INFO:  Shared Class Cache Information:
#INFO:          SCCname:sharedcc_Jani Simomaa   SCCpath:C:\Users\Jani\AppData\Local\javasharedresources\C290M4F1A64P_sharedcc_Jani_G37
#INFO:          SCC_stats_bytes: size=314572192 free=19665902 ROMClass=40628752 AOTCode=0 AOTData=0 JITHint=0 JITProfile=0
#INFO:          SCC_stats_#:     ROMClasses=16814 AOTMethods=0 AOTDataEntries=0 AOTHints=0 AOTJitProfiles=0

there isn't even any AOT code in the SCC, which is weird...

Could you destroy the cache and run your program again, collecting the vlog both times? to destroy the cache, do java -Xshareclasses:destroyAll

@jsimomaa
Copy link
Author

Could you destroy the cache and run your program again, collecting the vlog both times? to destroy the cache, do java -Xshareclasses:destroyAll

I destroyed the cache by invoking:

java -Xshareclasses:destroyAll -Xjit:verbose={compilePerformance},vlog=vlog

but this outputted an empty vlog file. However, the cache was deleted.

Rerun with

java -Xms256m -Xmx1G -Xshareclasses -Xjit:verbose={compilePerformance},vlog=vlog

produced this vlog:

vlog.20190528.222507.6492.txt

@dsouzai
Copy link
Contributor

dsouzai commented May 28, 2019

I destroyed the cache by invoking:

java -Xshareclasses:destroyAll -Xjit:verbose={compilePerformance},vlog=vlog
but this outputted an empty vlog file. However, the cache was deleted.

Sorry, I should've been more clear, I meant collecting the vlog for both invocations of your benchmark :). However, doesn't look like we need the second invocation; we didn't do any AOT compilations in that vlog...I don't know why :S.

For the sake of sanity, could you do the following:

#destroy cache
java -Xshareclasses:destroyAll

#run version
java -Xshareclasses -Xjit:count=0,verbose={compilePerformance},vlog=vlog -version

I did this with

openjdk version "1.8.0_212"
OpenJDK Runtime Environment (build 1.8.0_212-b04)
Eclipse OpenJ9 VM (build openj9-0.14.2, JRE 1.8.0 Linux amd64-64-Bit Compressed References 20190521_315 (JIT enabled, AOT enabled)
OpenJ9   - 4b1df46fe
OMR      - b56045d2
JCL      - a8c217d402 based on jdk8u212-b04)

from https://github.com/AdoptOpenJDK/openjdk8-binaries/releases/download/jdk8u212-b04_openj9-(0.14.2/OpenJDK8U-jdk_x64_linux_openj9_8u212b04_openj9-0.14.2.tar.gz)

And the vlog does show AOT compilations happening:

	Samples MAX(ms) TOTAL(ms)	AVG(usec)	MIN(usec)
Total	1344	170.7	3156.0		2348		32
aotl	11	0.1	0.5		48		32
cold	7	1.7	3.6		519		146
aotw	1275	170.7	3138.0		2461		202
jni	50	0.7	13.7		274		160
fails	1	0.1	0.1		116		116

This will verify that you're able to at least get AOT compilations going.

@jsimomaa
Copy link
Author

I destroyed the cache and invoked

java -Xshareclasses -Xjit:count=0,verbose={compilePerformance},vlog=C:/git/vlog -version
openjdk version "1.8.0_212"
OpenJDK Runtime Environment (build 1.8.0_212-b04)
Eclipse OpenJ9 VM (build openj9-0.14.2, JRE 1.8.0 Windows 10 amd64-64-Bit Compressed References 20190521_368 (JIT enabled, AOT enabled)
OpenJ9   - 4b1df46fe
OMR      - b56045d2
JCL      - a8c217d402 based on jdk8u212-b04)

The only difference seems to be that I'm on Windows 10 host

Here is the vlog of that:
vlog.20190528.224833.7220.txt

@dsouzai
Copy link
Contributor

dsouzai commented May 28, 2019

Ok, so looks like you did get AOT compilations when running -version:

Total	1256	110.0	2284.1		1819		60
aotl	12	0.4	1.3		106		60
cold	7	1.2	3.8		536		193
aotw	1183	110.0	2261.9		1912		221
jni	53	0.9	16.9		318		183
fails	1	0.3	0.3		336		336

so now the question becomes, why are there no AOT compilations when you run your benchmark..

@jsimomaa
Copy link
Author

Here is how my cache dir looks like:

C:\Users\Jani\AppData\Local\javasharedresources>dir
 Volume in drive C is OS
 Volume Serial Number is F2BE-BE2C

 Directory of C:\Users\Jani\AppData\Local\javasharedresources

28.05.2019  22.48    <DIR>          .
28.05.2019  22.48    <DIR>          ..
28.05.2019  11.50       314 572 800 C290M12F1A64P_sharedcc_Jani_G37
28.05.2019  22.48       314 572 800 C290M4F1A64P_sharedcc_Jani_G37
               2 File(s)    629 145 600 bytes
               2 Dir(s)  12 341 964 800 bytes free

@dsouzai
Copy link
Contributor

dsouzai commented May 28, 2019

Ok, just for the sake of doing a second sanity, and also to get a sense of how much perf could improve, could you do the following:

# destroy cache
java -Xshareclasses:destroyAll

# Benchmark run 1 (populate SCC)
java -Xms256m -Xmx1G -Xshareclasses -Xaot:forceAOT -Xjit:forceAOT,verbose={compilePerformance},vlog=vlog1 ...

# Benchmark run 2 (load from SCC)
java -Xms256m -Xmx1G -Xshareclasses -Xaot:forceAOT -Xjit:forceAOT,verbose={compilePerformance},vlog=vlog2 ...

@mpirvu
Copy link
Contributor

mpirvu commented May 28, 2019

I think the key lies in the large number of compilation failures. A quick glance at the vlog shows many "compilationIlGenFailure". We need to understand the reason of that. I'll look at the code.

@dsouzai
Copy link
Contributor

dsouzai commented May 28, 2019

There's 200 failures out of ~2900 methods, but that doesn't explain why methods like java/lang/StringBuffer.lengthInternalUnsynchronized()I aren't AOT compiled.

@mpirvu
Copy link
Contributor

mpirvu commented May 28, 2019

There are many possible reasons why the JIT throws ILGenFailure
@jsimomaa To get a better understanding of the failures could you please do a run with -Xjit:printErrorInfoOnCompFailure. For example:
java -Xms256m -Xmx1G -Xshareclasses -Xjit:printErrorInfoOnCompFailure,verbose={compilePerformance},vlog=vlog ...
There will be some messages printed to stderr about the reason for those failures.

@JamesKingdon
Copy link
Contributor

@dsouzai Can you update the script to give the total time spent in failed compilations?

@dsouzai
Copy link
Contributor

dsouzai commented May 28, 2019

The script already prints that out, eg:

	Samples MAX(ms) TOTAL(ms)	AVG(usec)	MIN(usec)
Total	2944	1679.9	29779.0		10115		65
cold	1792	67.8	8044.6		4489		334
warm	949	334.5	17365.6		18299		692
hot	2	1437.3	1447.8		723914		10552
fails	201	1679.9	2921.0		14532		65

@JamesKingdon
Copy link
Contributor

ah, ok. Looked straight past that. Thanks.

@mpirvu
Copy link
Contributor

mpirvu commented May 28, 2019

The problem with compilationIlGenFailures is that compilations are not retried, so the methods subject to these failures will run interpreted for the entire duration of the JVM. This could lead to severe slowdowns depending on the importance of these methods.

@JamesKingdon
Copy link
Contributor

That fits - the 10x deficit made me wonder if we were running in the interpreter. If we fail some hot methods it would be similar.

@jsimomaa
Copy link
Author

Ok, just for the sake of doing a second sanity, and also to get a sense of how much perf could improve, could you do the following:

# destroy cache
java -Xshareclasses:destroyAll

# Benchmark run 1 (populate SCC)
java -Xms256m -Xmx1G -Xshareclasses -Xaot:forceAOT -Xjit:forceAOT,verbose={compilePerformance},vlog=vlog1 ...

# Benchmark run 2 (load from SCC)
java -Xms256m -Xmx1G -Xshareclasses -Xaot:forceAOT -Xjit:forceAOT,verbose={compilePerformance},vlog=vlog2 ...

Please find attached here both vlogs:
vlog1.20190528.233827.17284.txt
vlog2.20190528.233925.15140.txt

@jsimomaa
Copy link
Author

There are many possible reasons why the JIT throws ILGenFailure
@jsimomaa To get a better understanding of the failures could you please do a run with -Xjit:printErrorInfoOnCompFailure. For example:
java -Xms256m -Xmx1G -Xshareclasses -Xjit:printErrorInfoOnCompFailure,verbose={compilePerformance},vlog=vlog ...
There will be some messages printed to stderr about the reason for those failures.

Here are the prints from stderr:

Compilation Failed Because: IL Gen Failure
Compilation Failed Because: IL Gen Failure
Compilation Failed Because: IL Gen Failure
Compilation Failed Because: IL Gen Failure
Compilation Failed Because: IL Gen Failure
Compilation Failed Because: IL Gen Failure
Compilation Failed Because: IL Gen Failure
... (totaling 168 hits)

Compilation Failed Because: FSD_HAS_INVOKEHANDLE 0
... (totaling 18 hits)

Compilation Failed Because: FSD_HAS_INVOKEHANDLE 2

@dsouzai
Copy link
Contributor

dsouzai commented May 28, 2019

What did the perf look like for the run that produced vlog2?

vlog2.20190528.233925.15140.txt
	Samples MAX(ms) TOTAL(ms)	AVG(usec)	MIN(usec)
Total	5064	4589.7	15643.5		3089		22
aotl	4117	14.3	2253.0		547		22
cold	322	75.8	2436.7		7567		291
aotw	106	276.6	3030.0		28585		386
warm	96	520.2	2514.5		26193		559
hot	1	4589.7	4589.7		4589724		4589724
jni	183	17.0	314.9		1721		191
fails	239	31.5	504.6		2111		171
$ grep '!' vlog2.20190528.233925.15140.txt | wc
    239    2390   56293
$ grep '!' vlog2.20190528.233925.15140.txt | grep 'compilationAotClassReloFailure' | wc
    206    2060   47232

Looks like the majority of failures were due to AOT relocations when doing forceAOT. Additionally, there weren't as many failures in the compile run.

@dsouzai
Copy link
Contributor

dsouzai commented May 28, 2019

Compilation Failed Because: FSD_HAS_INVOKEHANDLE 0

are you running with an agent attached by any chance for debugging purposes? Because that might explain why there's no AOT happening (when we don't specify forceAOT)

@jsimomaa
Copy link
Author

First run (vlog1):

23:39:14.749 [main] INFO  c.y.p.application.Application        - Started Application in 44.284 seconds (JVM running for 47.72)

Second run (vlog2):

23:39:59.526 [main] INFO  c.y.p.application.Application        - Started Application in 32.227 seconds (JVM running for 33.905)

@jsimomaa
Copy link
Author

jsimomaa commented May 28, 2019

Compilation Failed Because: FSD_HAS_INVOKEHANDLE 0

are you running with an agent attached by any chance for debugging purposes? Because that might explain why there's no AOT happening.

Yes, that is actually true! I should have stated that in the beginning that I was using Visual Studio Code for the first vlogs and it attaches a debugger.

The vlog1 and vlog2 was then purely with cmd and no debuggers attached or anything. Sorry about this, I should have mentioned about this in the setup.

@jsimomaa
Copy link
Author

But without the debugger attached I wasn't able to get any output to stderr with printErrorInfoOnCompFailure.

@dsouzai
Copy link
Contributor

dsouzai commented May 28, 2019

Ahh ok, that at least explains why there was no AOT before. For the sake a comparison to allow OpenJ9 to get the benefit of AOT heh, would you mind doing a run without the debugger :). ie:

  1. Destroy SCC
  2. Populate SCC; options -Xms256m -Xmx1G -Xshareclasses -Xjit:verbose={compilePerformance},vlog=vlog1 ...
  3. Load from SCC; options -Xms256m -Xmx1G -Xshareclasses -Xjit:verbose={compilePerformance},vlog=vlog2 ...

Thanks!

@jsimomaa
Copy link
Author

Here is one more vlog no debuggers attached and with args: -Xms256m -Xmx1G -Xshareclasses -Xjit:printErrorInfoOnCompFailure,verbose={compilePerformance},vlog=vlog-new.

vlog-new.20190529.000410.16028.txt

Also, with the shareclasses populated on previous runs the result of the "benchmark" is now ~31s (compared to ~16s with HotSpot):

00:04:43.525 [main] INFO  c.y.p.application.Application        - Started Application in 31.485 seconds (JVM running for 33.054)

@dsouzai
Copy link
Contributor

dsouzai commented May 28, 2019

Haha beat me to it :)

@JamesKingdon
Copy link
Contributor

JamesKingdon commented May 31, 2019

I wonder why this test shows so much more impact - maybe Spring boot brings in a larger number of jars?

-- looks like the whole app is in only one jar on the filesystem which is spring.boot.openj9-0.0.1-SNAPSHOT.jar. That jar contains 157 jars inside it, but it wouldn't make sense to be checking timestamps of those would it? There seems to be an element of mystery here.

edit 2, delta is still reproducible, a solid 30% from disabling timestamp checks.

edit 3: -verbose indicates we load 9072 classes during startup for this app, I can't imagine that's a lot more than a typical liberty test case, but it would be interesting to know what that number is.

@charliegracie
Copy link
Contributor

I was also able to reproduce a big win on Linux launching this spring application by adding the noTimestampChecks. I definitely think this is something we should investigate further! With -Xshareclasses:noTimestampCheck on Linux this application starts up 2X as fast as HotSpot.

@charliegracie
Copy link
Contributor

Originally the jar of jar files did not work with -Xshareclasses so I wouldn't be surprised if the timestamp for each individual jar inside the wrapping jar file is also being checked. 157 jar files would be larger than any app I normally run by a very big margin.

@hangshao0
Copy link
Contributor

hangshao0 commented May 31, 2019

We only check the timestamp of the outside most jar, which is spring.boot.openj9-0.0.1-SNAPSHOT.jar in this case. But we are checking this every time class is loaded from the shared cache. (If the JCL patch is added back, this check would only happen once I believe)
For Liberty, one possibility is that they might have called SharedClassURLHelper.setMinimizeUpdateChecks() in their java code that disabled most timestamp checks.

@hangshao0
Copy link
Contributor

Probably on the VM side, we can change the default behavior to do timestamp check only once for each jar and introduce a new option "forceTimestampChecks" which does timestamp check on every load. @pshipton

@JamesKingdon
Copy link
Contributor

JamesKingdon commented May 31, 2019

Looking at the code, it looks like there's a need to add the concept of time-last-checked and the ability to specify an interval between checks. Checking the same jar timestamp at micro-second resolution makes little sense, particularly when walking the classpath and everything is coming from the same jar file.

@DanHeidinga
Copy link
Member

If I recall correctly, many of the design decisions for timestamp checking came about from supporting the SCC in development scenarios when you want to be sure you're running the very latest version of the code you just wrote.

@JamesKingdon
Copy link
Contributor

Wouldn't that require a mechanism to monitor the FS and pro-actively unload jitted code?

@DanHeidinga
Copy link
Member

That would be a further improvement / different feature. This was to ensure that we picked the most recent version of the class available.

@hangshao0
Copy link
Contributor

We don't really "monitor" the FS, we do timestamp check (when necessary) before returning class from the shared cache. Not sure about jitted code, but for classes, if any JVM connecting to the shared cache detects an updated jar, we will mark all potentially stale classes in the shared cache as stale pessimistically. When we later know the class is not actually updated we will remove the stale marking.

@dsouzai
Copy link
Contributor

dsouzai commented May 31, 2019

Wouldn't that require a mechanism to monitor the FS and pro-actively unload jitted code?

Wouldn't that be equivalent (in a non SCC run) to a JVM loading classes, and then someone modified the jars on disk? I don't think the currently running JVM is expected to now start using the updated jars is it? I would've thought that it just affected the next JVM instance.

@JamesKingdon
Copy link
Contributor

Yes, that's where I was heading. I don't think we can be sure that we're running the very latest version of the code, so it probably doesn't matter to anyone if we only check for updates every 100ms instead of on every class load.

@pshipton
Copy link
Member

it probably doesn't matter to anyone if we only check for updates every 100ms instead of on every class load

if classes are modified and we get some from the cache and some from the jar, they may not be compatible with each other

@JamesKingdon
Copy link
Contributor

JamesKingdon commented May 31, 2019

What has been described so far certainly doesn't prevent that case.

@andrewcraik
Copy link
Contributor

File timestamps are not atomically updated and are not guaranteed to be updated for any given file update. Given the limited resolution of operating system timers and the aforementioned limitations of timestamps no scheme based on timestamp checking can ensure a file read twice at two different points in time is actually the same file.

@DanHeidinga
Copy link
Member

@pshipton and I have been discussing alternative approaches. There is a tentative design being considered but it needs more discussion in particular input from @hangshao0 is needed.

This will be updated when that design has been fleshed out more.

@hangshao0
Copy link
Contributor

Peter just discussed with me. In Java 11+, we can get the jar file open information from the class loader rather than using the JCL zip_hook. Since this change may not make it to the 0.15.0 release, we can change the code to check the timestamp only once for each jar during the startup phase for the 0.15.0 release. This will at least partially solve this problem for 0.15.0. Later with jar file open info from class loader, this issue should be fully solved.

@DanHeidinga
Copy link
Member

Moving this to 0.16.0 as the changes aren't ready yet.

@pshipton
Copy link
Member

pshipton commented Jul 8, 2019

This should be resolved now by #6174

@pshipton
Copy link
Member

pshipton commented Jul 9, 2019

Fixed for the 0.15 release via #6401

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging a pull request may close this issue.

9 participants