src/hotspot/share/gc/z/zDriver.cpp
author pliden
Wed, 20 Nov 2019 10:37:46 +0100
changeset 59148 877c000fd688
parent 58701 5d10ba4a0468
permissions -rw-r--r--
8234312: ZGC: Adjust warmup criteria Reviewed-by: eosterlund, stefank
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
50525
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
     1
/*
53540
9f75dc382445 8217857: ZGC: Move SvcGCMarker to ZServiceabilityTracer
pliden
parents: 52877
diff changeset
     2
 * Copyright (c) 2015, 2019, Oracle and/or its affiliates. All rights reserved.
50525
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
     4
 *
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
     7
 * published by the Free Software Foundation.
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
     8
 *
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    13
 * accompanied this code).
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    14
 *
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    18
 *
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    21
 * questions.
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    22
 */
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    23
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    24
#include "precompiled.hpp"
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    25
#include "gc/shared/gcId.hpp"
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    26
#include "gc/shared/gcLocker.hpp"
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    27
#include "gc/shared/isGCActiveMark.hpp"
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    28
#include "gc/z/zCollectedHeap.hpp"
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    29
#include "gc/z/zDriver.hpp"
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    30
#include "gc/z/zHeap.inline.hpp"
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    31
#include "gc/z/zMessagePort.inline.hpp"
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    32
#include "gc/z/zServiceability.hpp"
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    33
#include "gc/z/zStat.hpp"
55603
3868dde58ebb 8227175: ZGC: ZHeapIterator visits potentially dead objects
stefank
parents: 55002
diff changeset
    34
#include "gc/z/zVerify.hpp"
50525
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    35
#include "logging/log.hpp"
52382
2e280ecec246 8212921: ZGC: Move verification to after resurrection unblocked
pliden
parents: 52140
diff changeset
    36
#include "memory/universe.hpp"
52877
9e041366c764 8214850: Rename vm_operations.?pp files to vmOperations.?pp files
tschatzl
parents: 52876
diff changeset
    37
#include "runtime/vmOperations.hpp"
50525
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    38
#include "runtime/vmThread.hpp"
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    39
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    40
static const ZStatPhaseCycle      ZPhaseCycle("Garbage Collection Cycle");
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    41
static const ZStatPhasePause      ZPhasePauseMarkStart("Pause Mark Start");
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    42
static const ZStatPhaseConcurrent ZPhaseConcurrentMark("Concurrent Mark");
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    43
static const ZStatPhaseConcurrent ZPhaseConcurrentMarkContinue("Concurrent Mark Continue");
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    44
static const ZStatPhasePause      ZPhasePauseMarkEnd("Pause Mark End");
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    45
static const ZStatPhaseConcurrent ZPhaseConcurrentProcessNonStrongReferences("Concurrent Process Non-Strong References");
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    46
static const ZStatPhaseConcurrent ZPhaseConcurrentResetRelocationSet("Concurrent Reset Relocation Set");
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    47
static const ZStatPhaseConcurrent ZPhaseConcurrentSelectRelocationSet("Concurrent Select Relocation Set");
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    48
static const ZStatPhasePause      ZPhasePauseRelocateStart("Pause Relocate Start");
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    49
static const ZStatPhaseConcurrent ZPhaseConcurrentRelocated("Concurrent Relocate");
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    50
static const ZStatCriticalPhase   ZCriticalPhaseGCLockerStall("GC Locker Stall", false /* verbose */);
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    51
static const ZStatSampler         ZSamplerJavaThreads("System", "Java Threads", ZStatUnitThreads);
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    52
53541
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
    53
class VM_ZOperation : public VM_Operation {
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
    54
private:
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
    55
  const uint _gc_id;
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
    56
  bool       _gc_locked;
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
    57
  bool       _success;
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
    58
50525
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    59
public:
53541
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
    60
  VM_ZOperation() :
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
    61
      _gc_id(GCId::current()),
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
    62
      _gc_locked(false),
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
    63
      _success(false) {}
50525
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    64
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    65
  virtual bool needs_inactive_gc_locker() const {
53541
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
    66
    // An inactive GC locker is needed in operations where we change the bad
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
    67
    // mask or move objects. Changing the bad mask will invalidate all oops,
50525
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    68
    // which makes it conceptually the same thing as moving all objects.
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    69
    return false;
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    70
  }
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    71
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    72
  virtual bool do_operation() = 0;
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    73
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    74
  virtual bool doit_prologue() {
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    75
    Heap_lock->lock();
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    76
    return true;
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    77
  }
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    78
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    79
  virtual void doit() {
53541
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
    80
    // Abort if GC locker state is incompatible
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
    81
    if (needs_inactive_gc_locker() && GCLocker::check_active_before_gc()) {
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
    82
      _gc_locked = true;
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
    83
      return;
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
    84
    }
50525
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    85
53541
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
    86
    // Setup GC id and active marker
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
    87
    GCIdMark gc_id_mark(_gc_id);
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
    88
    IsGCActiveMark gc_active_mark;
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
    89
57656
9429ecaee2e0 8229135: ZGC: Adding missing ZStatTimerDisable before call to ZVerify::roots_strong()
pliden
parents: 55603
diff changeset
    90
    // Verify before operation
9429ecaee2e0 8229135: ZGC: Adding missing ZStatTimerDisable before call to ZVerify::roots_strong()
pliden
parents: 55603
diff changeset
    91
    ZVerify::before_zoperation();
55603
3868dde58ebb 8227175: ZGC: ZHeapIterator visits potentially dead objects
stefank
parents: 55002
diff changeset
    92
53541
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
    93
    // Execute operation
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
    94
    _success = do_operation();
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
    95
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
    96
    // Update statistics
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
    97
    ZStatSample(ZSamplerJavaThreads, Threads::number_of_threads());
50525
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    98
  }
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    99
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   100
  virtual void doit_epilogue() {
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   101
    Heap_lock->unlock();
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   102
  }
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   103
53541
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   104
  bool gc_locked() const {
50525
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   105
    return _gc_locked;
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   106
  }
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   107
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   108
  bool success() const {
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   109
    return _success;
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   110
  }
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   111
};
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   112
50582
6464882498b5 8205022: ZGC: SoftReferences not always cleared before throwing OOME
pliden
parents: 50525
diff changeset
   113
static bool should_clear_soft_references() {
6464882498b5 8205022: ZGC: SoftReferences not always cleared before throwing OOME
pliden
parents: 50525
diff changeset
   114
  // Clear if one or more allocations have stalled
6464882498b5 8205022: ZGC: SoftReferences not always cleared before throwing OOME
pliden
parents: 50525
diff changeset
   115
  const bool stalled = ZHeap::heap()->is_alloc_stalled();
6464882498b5 8205022: ZGC: SoftReferences not always cleared before throwing OOME
pliden
parents: 50525
diff changeset
   116
  if (stalled) {
6464882498b5 8205022: ZGC: SoftReferences not always cleared before throwing OOME
pliden
parents: 50525
diff changeset
   117
    // Clear
6464882498b5 8205022: ZGC: SoftReferences not always cleared before throwing OOME
pliden
parents: 50525
diff changeset
   118
    return true;
6464882498b5 8205022: ZGC: SoftReferences not always cleared before throwing OOME
pliden
parents: 50525
diff changeset
   119
  }
6464882498b5 8205022: ZGC: SoftReferences not always cleared before throwing OOME
pliden
parents: 50525
diff changeset
   120
6464882498b5 8205022: ZGC: SoftReferences not always cleared before throwing OOME
pliden
parents: 50525
diff changeset
   121
  // Clear if implied by the GC cause
6464882498b5 8205022: ZGC: SoftReferences not always cleared before throwing OOME
pliden
parents: 50525
diff changeset
   122
  const GCCause::Cause cause = ZCollectedHeap::heap()->gc_cause();
6464882498b5 8205022: ZGC: SoftReferences not always cleared before throwing OOME
pliden
parents: 50525
diff changeset
   123
  if (cause == GCCause::_wb_full_gc ||
6464882498b5 8205022: ZGC: SoftReferences not always cleared before throwing OOME
pliden
parents: 50525
diff changeset
   124
      cause == GCCause::_metadata_GC_clear_soft_refs) {
6464882498b5 8205022: ZGC: SoftReferences not always cleared before throwing OOME
pliden
parents: 50525
diff changeset
   125
    // Clear
6464882498b5 8205022: ZGC: SoftReferences not always cleared before throwing OOME
pliden
parents: 50525
diff changeset
   126
    return true;
6464882498b5 8205022: ZGC: SoftReferences not always cleared before throwing OOME
pliden
parents: 50525
diff changeset
   127
  }
6464882498b5 8205022: ZGC: SoftReferences not always cleared before throwing OOME
pliden
parents: 50525
diff changeset
   128
6464882498b5 8205022: ZGC: SoftReferences not always cleared before throwing OOME
pliden
parents: 50525
diff changeset
   129
  // Don't clear
6464882498b5 8205022: ZGC: SoftReferences not always cleared before throwing OOME
pliden
parents: 50525
diff changeset
   130
  return false;
6464882498b5 8205022: ZGC: SoftReferences not always cleared before throwing OOME
pliden
parents: 50525
diff changeset
   131
}
6464882498b5 8205022: ZGC: SoftReferences not always cleared before throwing OOME
pliden
parents: 50525
diff changeset
   132
50583
f0ff230e2546 8205024: ZGC: Worker threads boost mode not always enabled when is should be
pliden
parents: 50582
diff changeset
   133
static bool should_boost_worker_threads() {
f0ff230e2546 8205024: ZGC: Worker threads boost mode not always enabled when is should be
pliden
parents: 50582
diff changeset
   134
  // Boost worker threads if one or more allocations have stalled
f0ff230e2546 8205024: ZGC: Worker threads boost mode not always enabled when is should be
pliden
parents: 50582
diff changeset
   135
  const bool stalled = ZHeap::heap()->is_alloc_stalled();
f0ff230e2546 8205024: ZGC: Worker threads boost mode not always enabled when is should be
pliden
parents: 50582
diff changeset
   136
  if (stalled) {
f0ff230e2546 8205024: ZGC: Worker threads boost mode not always enabled when is should be
pliden
parents: 50582
diff changeset
   137
    // Boost
f0ff230e2546 8205024: ZGC: Worker threads boost mode not always enabled when is should be
pliden
parents: 50582
diff changeset
   138
    return true;
f0ff230e2546 8205024: ZGC: Worker threads boost mode not always enabled when is should be
pliden
parents: 50582
diff changeset
   139
  }
f0ff230e2546 8205024: ZGC: Worker threads boost mode not always enabled when is should be
pliden
parents: 50582
diff changeset
   140
f0ff230e2546 8205024: ZGC: Worker threads boost mode not always enabled when is should be
pliden
parents: 50582
diff changeset
   141
  // Boost worker threads if implied by the GC cause
f0ff230e2546 8205024: ZGC: Worker threads boost mode not always enabled when is should be
pliden
parents: 50582
diff changeset
   142
  const GCCause::Cause cause = ZCollectedHeap::heap()->gc_cause();
f0ff230e2546 8205024: ZGC: Worker threads boost mode not always enabled when is should be
pliden
parents: 50582
diff changeset
   143
  if (cause == GCCause::_wb_full_gc ||
f0ff230e2546 8205024: ZGC: Worker threads boost mode not always enabled when is should be
pliden
parents: 50582
diff changeset
   144
      cause == GCCause::_java_lang_system_gc ||
f0ff230e2546 8205024: ZGC: Worker threads boost mode not always enabled when is should be
pliden
parents: 50582
diff changeset
   145
      cause == GCCause::_metadata_GC_clear_soft_refs) {
f0ff230e2546 8205024: ZGC: Worker threads boost mode not always enabled when is should be
pliden
parents: 50582
diff changeset
   146
    // Boost
f0ff230e2546 8205024: ZGC: Worker threads boost mode not always enabled when is should be
pliden
parents: 50582
diff changeset
   147
    return true;
f0ff230e2546 8205024: ZGC: Worker threads boost mode not always enabled when is should be
pliden
parents: 50582
diff changeset
   148
  }
f0ff230e2546 8205024: ZGC: Worker threads boost mode not always enabled when is should be
pliden
parents: 50582
diff changeset
   149
f0ff230e2546 8205024: ZGC: Worker threads boost mode not always enabled when is should be
pliden
parents: 50582
diff changeset
   150
  // Don't boost
f0ff230e2546 8205024: ZGC: Worker threads boost mode not always enabled when is should be
pliden
parents: 50582
diff changeset
   151
  return false;
f0ff230e2546 8205024: ZGC: Worker threads boost mode not always enabled when is should be
pliden
parents: 50582
diff changeset
   152
}
f0ff230e2546 8205024: ZGC: Worker threads boost mode not always enabled when is should be
pliden
parents: 50582
diff changeset
   153
53541
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   154
class VM_ZMarkStart : public VM_ZOperation {
50525
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   155
public:
53541
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   156
  virtual VMOp_Type type() const {
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   157
    return VMOp_ZMarkStart;
50525
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   158
  }
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   159
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   160
  virtual bool needs_inactive_gc_locker() const {
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   161
    return true;
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   162
  }
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   163
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   164
  virtual bool do_operation() {
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   165
    ZStatTimer timer(ZPhasePauseMarkStart);
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   166
    ZServiceabilityMarkStartTracer tracer;
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   167
50875
2217b2fc29ea 8205993: ZGC: Fix typos and incorrect indentations
pliden
parents: 50583
diff changeset
   168
    // Set up soft reference policy
50582
6464882498b5 8205022: ZGC: SoftReferences not always cleared before throwing OOME
pliden
parents: 50525
diff changeset
   169
    const bool clear = should_clear_soft_references();
6464882498b5 8205022: ZGC: SoftReferences not always cleared before throwing OOME
pliden
parents: 50525
diff changeset
   170
    ZHeap::heap()->set_soft_reference_policy(clear);
6464882498b5 8205022: ZGC: SoftReferences not always cleared before throwing OOME
pliden
parents: 50525
diff changeset
   171
50875
2217b2fc29ea 8205993: ZGC: Fix typos and incorrect indentations
pliden
parents: 50583
diff changeset
   172
    // Set up boost mode
50583
f0ff230e2546 8205024: ZGC: Worker threads boost mode not always enabled when is should be
pliden
parents: 50582
diff changeset
   173
    const bool boost = should_boost_worker_threads();
f0ff230e2546 8205024: ZGC: Worker threads boost mode not always enabled when is should be
pliden
parents: 50582
diff changeset
   174
    ZHeap::heap()->set_boost_worker_threads(boost);
f0ff230e2546 8205024: ZGC: Worker threads boost mode not always enabled when is should be
pliden
parents: 50582
diff changeset
   175
50525
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   176
    ZCollectedHeap::heap()->increment_total_collections(true /* full */);
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   177
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   178
    ZHeap::heap()->mark_start();
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   179
    return true;
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   180
  }
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   181
};
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   182
53541
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   183
class VM_ZMarkEnd : public VM_ZOperation {
50525
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   184
public:
53541
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   185
  virtual VMOp_Type type() const {
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   186
    return VMOp_ZMarkEnd;
50525
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   187
  }
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   188
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   189
  virtual bool do_operation() {
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   190
    ZStatTimer timer(ZPhasePauseMarkEnd);
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   191
    ZServiceabilityMarkEndTracer tracer;
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   192
    return ZHeap::heap()->mark_end();
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   193
  }
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   194
};
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   195
53541
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   196
class VM_ZRelocateStart : public VM_ZOperation {
52382
2e280ecec246 8212921: ZGC: Move verification to after resurrection unblocked
pliden
parents: 52140
diff changeset
   197
public:
53541
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   198
  virtual VMOp_Type type() const {
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   199
    return VMOp_ZRelocateStart;
50525
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   200
  }
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   201
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   202
  virtual bool needs_inactive_gc_locker() const {
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   203
    return true;
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   204
  }
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   205
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   206
  virtual bool do_operation() {
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   207
    ZStatTimer timer(ZPhasePauseRelocateStart);
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   208
    ZServiceabilityRelocateStartTracer tracer;
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   209
    ZHeap::heap()->relocate_start();
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   210
    return true;
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   211
  }
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   212
};
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   213
57658
0022b39ae5ae 8229017: ZGC: Various cleanups of ZVerify
pliden
parents: 57656
diff changeset
   214
class VM_ZVerify : public VM_Operation {
0022b39ae5ae 8229017: ZGC: Various cleanups of ZVerify
pliden
parents: 57656
diff changeset
   215
public:
0022b39ae5ae 8229017: ZGC: Various cleanups of ZVerify
pliden
parents: 57656
diff changeset
   216
  virtual VMOp_Type type() const {
0022b39ae5ae 8229017: ZGC: Various cleanups of ZVerify
pliden
parents: 57656
diff changeset
   217
    return VMOp_ZVerify;
0022b39ae5ae 8229017: ZGC: Various cleanups of ZVerify
pliden
parents: 57656
diff changeset
   218
  }
0022b39ae5ae 8229017: ZGC: Various cleanups of ZVerify
pliden
parents: 57656
diff changeset
   219
0022b39ae5ae 8229017: ZGC: Various cleanups of ZVerify
pliden
parents: 57656
diff changeset
   220
  virtual void doit() {
0022b39ae5ae 8229017: ZGC: Various cleanups of ZVerify
pliden
parents: 57656
diff changeset
   221
    ZVerify::after_weak_processing();
0022b39ae5ae 8229017: ZGC: Various cleanups of ZVerify
pliden
parents: 57656
diff changeset
   222
  }
0022b39ae5ae 8229017: ZGC: Various cleanups of ZVerify
pliden
parents: 57656
diff changeset
   223
};
0022b39ae5ae 8229017: ZGC: Various cleanups of ZVerify
pliden
parents: 57656
diff changeset
   224
50525
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   225
ZDriver::ZDriver() :
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   226
    _gc_cycle_port(),
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   227
    _gc_locker_port() {
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   228
  set_name("ZDriver");
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   229
  create_and_start();
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   230
}
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   231
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   232
void ZDriver::collect(GCCause::Cause cause) {
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   233
  switch (cause) {
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   234
  case GCCause::_wb_young_gc:
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   235
  case GCCause::_wb_conc_mark:
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   236
  case GCCause::_wb_full_gc:
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   237
  case GCCause::_dcmd_gc_run:
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   238
  case GCCause::_java_lang_system_gc:
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   239
  case GCCause::_full_gc_alot:
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   240
  case GCCause::_scavenge_alot:
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   241
  case GCCause::_jvmti_force_gc:
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   242
  case GCCause::_metadata_GC_clear_soft_refs:
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   243
    // Start synchronous GC
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   244
    _gc_cycle_port.send_sync(cause);
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   245
    break;
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   246
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   247
  case GCCause::_z_timer:
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   248
  case GCCause::_z_warmup:
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   249
  case GCCause::_z_allocation_rate:
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   250
  case GCCause::_z_allocation_stall:
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   251
  case GCCause::_z_proactive:
55002
da9840e2f7da 8224185: ZGC: Introduce "High Usage" rule
pliden
parents: 54174
diff changeset
   252
  case GCCause::_z_high_usage:
59148
877c000fd688 8234312: ZGC: Adjust warmup criteria
pliden
parents: 58701
diff changeset
   253
  case GCCause::_metadata_GC_threshold:
50525
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   254
    // Start asynchronous GC
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   255
    _gc_cycle_port.send_async(cause);
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   256
    break;
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   257
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   258
  case GCCause::_gc_locker:
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   259
    // Restart VM operation previously blocked by the GC locker
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   260
    _gc_locker_port.signal();
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   261
    break;
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   262
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   263
  default:
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   264
    // Other causes not supported
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   265
    fatal("Unsupported GC cause (%s)", GCCause::to_string(cause));
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   266
    break;
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   267
  }
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   268
}
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   269
53541
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   270
template <typename T>
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   271
bool ZDriver::pause() {
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   272
  for (;;) {
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   273
    T op;
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   274
    VMThread::execute(&op);
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   275
    if (op.gc_locked()) {
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   276
      // Wait for GC to become unlocked and restart the VM operation
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   277
      ZStatTimer timer(ZCriticalPhaseGCLockerStall);
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   278
      _gc_locker_port.wait();
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   279
      continue;
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   280
    }
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   281
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   282
    // Notify VM operation completed
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   283
    _gc_locker_port.ack();
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   284
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   285
    return op.success();
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   286
  }
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   287
}
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   288
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   289
void ZDriver::pause_mark_start() {
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   290
  pause<VM_ZMarkStart>();
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   291
}
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   292
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   293
void ZDriver::concurrent_mark() {
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   294
  ZStatTimer timer(ZPhaseConcurrentMark);
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   295
  ZHeap::heap()->mark(true /* initial */);
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   296
}
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   297
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   298
bool ZDriver::pause_mark_end() {
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   299
  return pause<VM_ZMarkEnd>();
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   300
}
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   301
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   302
void ZDriver::concurrent_mark_continue() {
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   303
  ZStatTimer timer(ZPhaseConcurrentMarkContinue);
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   304
  ZHeap::heap()->mark(false /* initial */);
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   305
}
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   306
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   307
void ZDriver::concurrent_process_non_strong_references() {
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   308
  ZStatTimer timer(ZPhaseConcurrentProcessNonStrongReferences);
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   309
  ZHeap::heap()->process_non_strong_references();
50525
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   310
}
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   311
53541
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   312
void ZDriver::concurrent_reset_relocation_set() {
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   313
  ZStatTimer timer(ZPhaseConcurrentResetRelocationSet);
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   314
  ZHeap::heap()->reset_relocation_set();
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   315
}
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   316
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   317
void ZDriver::pause_verify() {
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   318
  if (VerifyBeforeGC || VerifyDuringGC || VerifyAfterGC) {
55603
3868dde58ebb 8227175: ZGC: ZHeapIterator visits potentially dead objects
stefank
parents: 55002
diff changeset
   319
    // Full verification
53541
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   320
    VM_Verify op;
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   321
    VMThread::execute(&op);
55603
3868dde58ebb 8227175: ZGC: ZHeapIterator visits potentially dead objects
stefank
parents: 55002
diff changeset
   322
  } else if (ZVerifyRoots || ZVerifyObjects) {
3868dde58ebb 8227175: ZGC: ZHeapIterator visits potentially dead objects
stefank
parents: 55002
diff changeset
   323
    // Limited verification
57658
0022b39ae5ae 8229017: ZGC: Various cleanups of ZVerify
pliden
parents: 57656
diff changeset
   324
    VM_ZVerify op;
55603
3868dde58ebb 8227175: ZGC: ZHeapIterator visits potentially dead objects
stefank
parents: 55002
diff changeset
   325
    VMThread::execute(&op);
53541
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   326
  }
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   327
}
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   328
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   329
void ZDriver::concurrent_select_relocation_set() {
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   330
  ZStatTimer timer(ZPhaseConcurrentSelectRelocationSet);
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   331
  ZHeap::heap()->select_relocation_set();
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   332
}
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   333
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   334
void ZDriver::pause_relocate_start() {
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   335
  pause<VM_ZRelocateStart>();
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   336
}
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   337
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   338
void ZDriver::concurrent_relocate() {
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   339
  ZStatTimer timer(ZPhaseConcurrentRelocated);
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   340
  ZHeap::heap()->relocate();
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   341
}
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   342
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   343
void ZDriver::check_out_of_memory() {
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   344
  ZHeap::heap()->check_out_of_memory();
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   345
}
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   346
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   347
class ZDriverGCScope : public StackObj {
50525
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   348
private:
59148
877c000fd688 8234312: ZGC: Adjust warmup criteria
pliden
parents: 58701
diff changeset
   349
  GCIdMark       _gc_id;
877c000fd688 8234312: ZGC: Adjust warmup criteria
pliden
parents: 58701
diff changeset
   350
  GCCause::Cause _gc_cause;
877c000fd688 8234312: ZGC: Adjust warmup criteria
pliden
parents: 58701
diff changeset
   351
  GCCauseSetter  _gc_cause_setter;
877c000fd688 8234312: ZGC: Adjust warmup criteria
pliden
parents: 58701
diff changeset
   352
  ZStatTimer     _timer;
50525
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   353
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   354
public:
53541
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   355
  ZDriverGCScope(GCCause::Cause cause) :
50525
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   356
      _gc_id(),
59148
877c000fd688 8234312: ZGC: Adjust warmup criteria
pliden
parents: 58701
diff changeset
   357
      _gc_cause(cause),
50525
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   358
      _gc_cause_setter(ZCollectedHeap::heap(), cause),
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   359
      _timer(ZPhaseCycle) {
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   360
    // Update statistics
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   361
    ZStatCycle::at_start();
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   362
  }
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   363
53541
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   364
  ~ZDriverGCScope() {
50525
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   365
    // Calculate boost factor
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   366
    const double boost_factor = (double)ZHeap::heap()->nconcurrent_worker_threads() /
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   367
                                (double)ZHeap::heap()->nconcurrent_no_boost_worker_threads();
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   368
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   369
    // Update statistics
59148
877c000fd688 8234312: ZGC: Adjust warmup criteria
pliden
parents: 58701
diff changeset
   370
    ZStatCycle::at_end(_gc_cause, boost_factor);
50582
6464882498b5 8205022: ZGC: SoftReferences not always cleared before throwing OOME
pliden
parents: 50525
diff changeset
   371
6464882498b5 8205022: ZGC: SoftReferences not always cleared before throwing OOME
pliden
parents: 50525
diff changeset
   372
    // Update data used by soft reference policy
6464882498b5 8205022: ZGC: SoftReferences not always cleared before throwing OOME
pliden
parents: 50525
diff changeset
   373
    Universe::update_heap_info_at_gc();
50525
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   374
  }
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   375
};
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   376
53541
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   377
void ZDriver::gc(GCCause::Cause cause) {
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   378
  ZDriverGCScope scope(cause);
50525
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   379
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   380
  // Phase 1: Pause Mark Start
53541
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   381
  pause_mark_start();
50525
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   382
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   383
  // Phase 2: Concurrent Mark
53541
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   384
  concurrent_mark();
50525
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   385
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   386
  // Phase 3: Pause Mark End
53541
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   387
  while (!pause_mark_end()) {
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   388
    // Phase 3.5: Concurrent Mark Continue
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   389
    concurrent_mark_continue();
50525
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   390
  }
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   391
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   392
  // Phase 4: Concurrent Process Non-Strong References
53541
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   393
  concurrent_process_non_strong_references();
50525
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   394
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   395
  // Phase 5: Concurrent Reset Relocation Set
53541
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   396
  concurrent_reset_relocation_set();
50525
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   397
54174
6d1caebf8d37 8220600: ZGC: Delete ZPages using ZSafeDelete
pliden
parents: 54163
diff changeset
   398
  // Phase 6: Pause Verify
53541
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   399
  pause_verify();
52382
2e280ecec246 8212921: ZGC: Move verification to after resurrection unblocked
pliden
parents: 52140
diff changeset
   400
54174
6d1caebf8d37 8220600: ZGC: Delete ZPages using ZSafeDelete
pliden
parents: 54163
diff changeset
   401
  // Phase 7: Concurrent Select Relocation Set
53541
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   402
  concurrent_select_relocation_set();
50525
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   403
54174
6d1caebf8d37 8220600: ZGC: Delete ZPages using ZSafeDelete
pliden
parents: 54163
diff changeset
   404
  // Phase 8: Pause Relocate Start
53541
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   405
  pause_relocate_start();
50525
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   406
54174
6d1caebf8d37 8220600: ZGC: Delete ZPages using ZSafeDelete
pliden
parents: 54163
diff changeset
   407
  // Phase 9: Concurrent Relocate
53541
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   408
  concurrent_relocate();
50525
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   409
}
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   410
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   411
void ZDriver::run_service() {
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   412
  // Main loop
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   413
  while (!should_terminate()) {
53541
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   414
    // Wait for GC request
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   415
    const GCCause::Cause cause = _gc_cycle_port.receive();
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   416
    if (cause == GCCause::_no_gc) {
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   417
      continue;
50525
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   418
    }
53541
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   419
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   420
    // Run GC
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   421
    gc(cause);
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   422
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   423
    // Notify GC completed
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   424
    _gc_cycle_port.ack();
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   425
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   426
    // Check for out of memory condition
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   427
    check_out_of_memory();
50525
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   428
  }
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   429
}
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   430
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   431
void ZDriver::stop_service() {
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   432
  _gc_cycle_port.send_async(GCCause::_no_gc);
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   433
}