RFR 8225582: Shenandoah: Enable concurrent evacuation of JNIHandles

Aleksey Shipilev shade at redhat.com
Tue Jun 18 20:18:29 UTC 2019

On 6/17/19 9:15 PM, Zhengyu Gu wrote:
> Narrowed CR to only evacuating JNIHandles.
> Updated Webrev: http://cr.openjdk.java.net/~zgu/JDK-8225582/webrev.02/

I know you have updated patch in works, but here are the things that caught my eye in current patch.

*) Do we really need separate shenandoahConcurrentRoots.*? I.e. is there an additional value over
keeping those deciders in ShenandoahHeap, given they are accessing ShenandoahHeap anyway?

*) The local var can probably be inlined, and comment be a little clearer, e.g.:

Instead of:

1076     // Include concurrent roots if current cycle can not process those roots concurrently
1077     bool include_concurrent_roots = !ShenandoahConcurrentRoots::should_do_concurrent_roots();
1079     ShenandoahRootEvacuator rp(workers()->active_workers(), ShenandoahPhaseTimings::init_evac,


   // If concurrent cycle cannot process concurrent roots, force their processing here, at safepoint
    ShenandoahRootEvacuator rp(workers()->active_workers(), ShenandoahPhaseTimings::init_evac,

*) I think it is more consistent to call it "entry_roots" and "op_roots", without "concurrent":

 389   // Entry methods to normally concurrent GC operations. These set up logging, monitoring
 390   // for concurrent operation.
 391   void entry_reset();
 392   void entry_mark();
 393   void entry_preclean();
 394   void entry_concurrent_roots(); //  <---- ere
 395   void entry_cleanup();
 396   void entry_evac();
 397   void entry_updaterefs();

 415   void op_reset();
 416   void op_mark();
 417   void op_preclean();
 418   void op_concurrent_roots(); // <--- and here
 419   void op_cleanup();
 420   void op_conc_evac();
 421   void op_stw_evac();
 422   void op_updaterefs();
 423   void op_traversal();

*) Can we drop default template argument, and use explicit "false" where needed?

template <bool CONCURRENT = false>
class ShenandoahJNIHandleRoots {

*) Maybe use ShenandoahSharedFlag::try_set() here? This would also give you automatic padding.

Instead of this:

  47     if (!_claimed && Atomic::cmpxchg(true, &_claimed, false) == false) {


  47     if (_claimed.try_set()) {

*) New-line to separate "private" and "public" blocks here:

1588 class ShenandoahConcurrentRootsEvacUpdateTask : public AbstractGangTask {
1589 private:
1590   ShenandoahJNIHandleRoots<true /*concurrent*/>         _jni_roots;
1591 public:


-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 833 bytes
Desc: OpenPGP digital signature
URL: <https://mail.openjdk.java.net/pipermail/hotspot-gc-dev/attachments/20190618/8b9f0811/signature.asc>

More information about the hotspot-gc-dev mailing list