RFR: 8214897: ZGC: Concurrent Class Unloading

Per Liden per.liden at oracle.com
Mon Dec 10 13:43:07 UTC 2018


On 12/10/18 2:18 PM, Erik Österlund wrote:
> Hi,
> 
> Currently, ZGC lacks class unloading. We did not want this to be a STW 
> operation, because we care a lot about our latencies. Therefore, this 
> patch provides a concurrent class unloading implementation for ZGC.
> 
> First of all, I would like to thank Per for going through this patch and 
> making many improvements and cleanups to it. I would also like to thank 
> StefanK who started this investigation. And Coleen for helping me 
> prepare our runtime for this patch.

Great work everyone!

> 
> All patches to prepare our runtime for concurrent class unloading have 
> already been upstreamed at this point, and with this patch, we are 
> plugging ZGC into the provided framework for concurrent class unloading.
> 
> The main operation for concurrent class unloading is 1) unlinking of all 
> data structures that died due to class unloading, 2) a handshake with 
> all JavaThreads, 3) purging of the data that was unlinked in step 1.
> We plug in an nmethod entry barrier that heals oops and lazily resolves 
> CompiledICs to unloading nmethods, adjust the ZNMethodTable to support 
> unlinking and purging of nmethods that are unloading.
> 
> Bug:
> https://bugs.openjdk.java.net/browse/JDK-8214897
> 
> Webrev:
> http://cr.openjdk.java.net/~eosterlund/8214897/webrev.00/

Looks good!

> 
> Testing: tier1-6, gc-test-suite, manual ad-hoc testing of unloading 
> stress tests.
> We have run performance tests to check for regressions. No statistically 
> significant regression was found in throughput or marking times. What we 
> could observe though is consistently better GC pause times, as the 
> CodeCache is no longer traversed in a safepoint after these changes. 
> Instead, it is processed concurrently with the help of nmethod entry 
> barriers.

For those interested, a pause time comparison between JDK 11 and JDK 12 
running SPECjbb2015 (composite mode, 128G heap, 32 hw-threads) looks 
like this:

JDK 11: Avg=1.10ms, Max=1.96ms  (without class unloading)
JDK 12: Avg=0.59ms, Max=1.59ms  (with class unloading)

So this takes us one step closer to our long term goal of having 
sub-millisecond max pause times. Awesome!

cheers,
Per



More information about the hotspot-gc-dev mailing list