src/hotspot/share/gc/z/zDriver.cpp
author pliden
Mon, 18 Mar 2019 11:50:41 +0100
changeset 54174 6d1caebf8d37
parent 54163 790679f86a51
child 55002 da9840e2f7da
permissions -rw-r--r--
8220600: ZGC: Delete ZPages using ZSafeDelete Reviewed-by: stefank, eosterlund
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"
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    34
#include "logging/log.hpp"
52382
2e280ecec246 8212921: ZGC: Move verification to after resurrection unblocked
pliden
parents: 52140
diff changeset
    35
#include "memory/universe.hpp"
52877
9e041366c764 8214850: Rename vm_operations.?pp files to vmOperations.?pp files
tschatzl
parents: 52876
diff changeset
    36
#include "runtime/vmOperations.hpp"
50525
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    37
#include "runtime/vmThread.hpp"
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    38
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    39
static const ZStatPhaseCycle      ZPhaseCycle("Garbage Collection Cycle");
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    40
static const ZStatPhasePause      ZPhasePauseMarkStart("Pause Mark Start");
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    41
static const ZStatPhaseConcurrent ZPhaseConcurrentMark("Concurrent Mark");
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    42
static const ZStatPhaseConcurrent ZPhaseConcurrentMarkContinue("Concurrent Mark Continue");
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    43
static const ZStatPhasePause      ZPhasePauseMarkEnd("Pause Mark End");
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    44
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
    45
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
    46
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
    47
static const ZStatPhasePause      ZPhasePauseRelocateStart("Pause Relocate Start");
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    48
static const ZStatPhaseConcurrent ZPhaseConcurrentRelocated("Concurrent Relocate");
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    49
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
    50
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
    51
53541
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
    52
class VM_ZOperation : public VM_Operation {
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
    53
private:
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
    54
  const uint _gc_id;
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
    55
  bool       _gc_locked;
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
    56
  bool       _success;
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
    57
50525
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    58
public:
53541
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
    59
  VM_ZOperation() :
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
    60
      _gc_id(GCId::current()),
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
    61
      _gc_locked(false),
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
    62
      _success(false) {}
50525
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    63
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    64
  virtual bool needs_inactive_gc_locker() const {
53541
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
    65
    // An inactive GC locker is needed in operations where we change the bad
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
    66
    // 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
    67
    // 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
    68
    return false;
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    69
  }
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
  virtual bool do_operation() = 0;
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    72
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    73
  virtual bool doit_prologue() {
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    74
    Heap_lock->lock();
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    75
    return true;
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    76
  }
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
  virtual void doit() {
53541
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
    79
    // Abort if GC locker state is incompatible
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
    80
    if (needs_inactive_gc_locker() && GCLocker::check_active_before_gc()) {
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
    81
      _gc_locked = true;
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
    82
      return;
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
    83
    }
50525
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    84
53541
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
    85
    // Setup GC id and active marker
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
    86
    GCIdMark gc_id_mark(_gc_id);
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
    87
    IsGCActiveMark gc_active_mark;
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
    88
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
    89
    // Execute operation
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
    90
    _success = do_operation();
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
    91
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
    92
    // Update statistics
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
    93
    ZStatSample(ZSamplerJavaThreads, Threads::number_of_threads());
50525
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    94
  }
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    95
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    96
  virtual void doit_epilogue() {
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    97
    Heap_lock->unlock();
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
53541
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   100
  bool gc_locked() const {
50525
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   101
    return _gc_locked;
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
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   104
  bool success() const {
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   105
    return _success;
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
50582
6464882498b5 8205022: ZGC: SoftReferences not always cleared before throwing OOME
pliden
parents: 50525
diff changeset
   109
static bool should_clear_soft_references() {
6464882498b5 8205022: ZGC: SoftReferences not always cleared before throwing OOME
pliden
parents: 50525
diff changeset
   110
  // Clear if one or more allocations have stalled
6464882498b5 8205022: ZGC: SoftReferences not always cleared before throwing OOME
pliden
parents: 50525
diff changeset
   111
  const bool stalled = ZHeap::heap()->is_alloc_stalled();
6464882498b5 8205022: ZGC: SoftReferences not always cleared before throwing OOME
pliden
parents: 50525
diff changeset
   112
  if (stalled) {
6464882498b5 8205022: ZGC: SoftReferences not always cleared before throwing OOME
pliden
parents: 50525
diff changeset
   113
    // Clear
6464882498b5 8205022: ZGC: SoftReferences not always cleared before throwing OOME
pliden
parents: 50525
diff changeset
   114
    return true;
6464882498b5 8205022: ZGC: SoftReferences not always cleared before throwing OOME
pliden
parents: 50525
diff changeset
   115
  }
6464882498b5 8205022: ZGC: SoftReferences not always cleared before throwing OOME
pliden
parents: 50525
diff changeset
   116
6464882498b5 8205022: ZGC: SoftReferences not always cleared before throwing OOME
pliden
parents: 50525
diff changeset
   117
  // Clear if implied by the GC cause
6464882498b5 8205022: ZGC: SoftReferences not always cleared before throwing OOME
pliden
parents: 50525
diff changeset
   118
  const GCCause::Cause cause = ZCollectedHeap::heap()->gc_cause();
6464882498b5 8205022: ZGC: SoftReferences not always cleared before throwing OOME
pliden
parents: 50525
diff changeset
   119
  if (cause == GCCause::_wb_full_gc ||
6464882498b5 8205022: ZGC: SoftReferences not always cleared before throwing OOME
pliden
parents: 50525
diff changeset
   120
      cause == GCCause::_metadata_GC_clear_soft_refs) {
6464882498b5 8205022: ZGC: SoftReferences not always cleared before throwing OOME
pliden
parents: 50525
diff changeset
   121
    // Clear
6464882498b5 8205022: ZGC: SoftReferences not always cleared before throwing OOME
pliden
parents: 50525
diff changeset
   122
    return true;
6464882498b5 8205022: ZGC: SoftReferences not always cleared before throwing OOME
pliden
parents: 50525
diff changeset
   123
  }
6464882498b5 8205022: ZGC: SoftReferences not always cleared before throwing OOME
pliden
parents: 50525
diff changeset
   124
6464882498b5 8205022: ZGC: SoftReferences not always cleared before throwing OOME
pliden
parents: 50525
diff changeset
   125
  // Don't clear
6464882498b5 8205022: ZGC: SoftReferences not always cleared before throwing OOME
pliden
parents: 50525
diff changeset
   126
  return false;
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
50583
f0ff230e2546 8205024: ZGC: Worker threads boost mode not always enabled when is should be
pliden
parents: 50582
diff changeset
   129
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
   130
  // 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
   131
  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
   132
  if (stalled) {
f0ff230e2546 8205024: ZGC: Worker threads boost mode not always enabled when is should be
pliden
parents: 50582
diff changeset
   133
    // Boost
f0ff230e2546 8205024: ZGC: Worker threads boost mode not always enabled when is should be
pliden
parents: 50582
diff changeset
   134
    return true;
f0ff230e2546 8205024: ZGC: Worker threads boost mode not always enabled when is should be
pliden
parents: 50582
diff changeset
   135
  }
f0ff230e2546 8205024: ZGC: Worker threads boost mode not always enabled when is should be
pliden
parents: 50582
diff changeset
   136
f0ff230e2546 8205024: ZGC: Worker threads boost mode not always enabled when is should be
pliden
parents: 50582
diff changeset
   137
  // 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
   138
  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
   139
  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
   140
      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
   141
      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
   142
    // Boost
f0ff230e2546 8205024: ZGC: Worker threads boost mode not always enabled when is should be
pliden
parents: 50582
diff changeset
   143
    return true;
f0ff230e2546 8205024: ZGC: Worker threads boost mode not always enabled when is should be
pliden
parents: 50582
diff changeset
   144
  }
f0ff230e2546 8205024: ZGC: Worker threads boost mode not always enabled when is should be
pliden
parents: 50582
diff changeset
   145
f0ff230e2546 8205024: ZGC: Worker threads boost mode not always enabled when is should be
pliden
parents: 50582
diff changeset
   146
  // Don't boost
f0ff230e2546 8205024: ZGC: Worker threads boost mode not always enabled when is should be
pliden
parents: 50582
diff changeset
   147
  return false;
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
53541
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   150
class VM_ZMarkStart : public VM_ZOperation {
50525
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   151
public:
53541
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   152
  virtual VMOp_Type type() const {
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   153
    return VMOp_ZMarkStart;
50525
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   154
  }
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   155
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   156
  virtual bool needs_inactive_gc_locker() const {
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   157
    return true;
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 do_operation() {
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   161
    ZStatTimer timer(ZPhasePauseMarkStart);
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   162
    ZServiceabilityMarkStartTracer tracer;
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   163
50875
2217b2fc29ea 8205993: ZGC: Fix typos and incorrect indentations
pliden
parents: 50583
diff changeset
   164
    // Set up soft reference policy
50582
6464882498b5 8205022: ZGC: SoftReferences not always cleared before throwing OOME
pliden
parents: 50525
diff changeset
   165
    const bool clear = should_clear_soft_references();
6464882498b5 8205022: ZGC: SoftReferences not always cleared before throwing OOME
pliden
parents: 50525
diff changeset
   166
    ZHeap::heap()->set_soft_reference_policy(clear);
6464882498b5 8205022: ZGC: SoftReferences not always cleared before throwing OOME
pliden
parents: 50525
diff changeset
   167
50875
2217b2fc29ea 8205993: ZGC: Fix typos and incorrect indentations
pliden
parents: 50583
diff changeset
   168
    // Set up boost mode
50583
f0ff230e2546 8205024: ZGC: Worker threads boost mode not always enabled when is should be
pliden
parents: 50582
diff changeset
   169
    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
   170
    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
   171
50525
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   172
    ZCollectedHeap::heap()->increment_total_collections(true /* full */);
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   173
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   174
    ZHeap::heap()->mark_start();
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   175
    return true;
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   176
  }
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
53541
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   179
class VM_ZMarkEnd : public VM_ZOperation {
50525
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   180
public:
53541
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   181
  virtual VMOp_Type type() const {
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   182
    return VMOp_ZMarkEnd;
50525
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   183
  }
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   184
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   185
  virtual bool do_operation() {
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   186
    ZStatTimer timer(ZPhasePauseMarkEnd);
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   187
    ZServiceabilityMarkEndTracer tracer;
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   188
    return ZHeap::heap()->mark_end();
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   189
  }
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   190
};
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   191
53541
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   192
class VM_ZRelocateStart : public VM_ZOperation {
52382
2e280ecec246 8212921: ZGC: Move verification to after resurrection unblocked
pliden
parents: 52140
diff changeset
   193
public:
53541
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   194
  virtual VMOp_Type type() const {
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   195
    return VMOp_ZRelocateStart;
50525
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   196
  }
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   197
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   198
  virtual bool needs_inactive_gc_locker() const {
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   199
    return true;
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 do_operation() {
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   203
    ZStatTimer timer(ZPhasePauseRelocateStart);
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   204
    ZServiceabilityRelocateStartTracer tracer;
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   205
    ZHeap::heap()->relocate_start();
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   206
    return true;
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   207
  }
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   208
};
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   209
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   210
ZDriver::ZDriver() :
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   211
    _gc_cycle_port(),
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   212
    _gc_locker_port() {
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   213
  set_name("ZDriver");
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   214
  create_and_start();
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   215
}
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   216
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   217
void ZDriver::collect(GCCause::Cause cause) {
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   218
  switch (cause) {
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   219
  case GCCause::_wb_young_gc:
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   220
  case GCCause::_wb_conc_mark:
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   221
  case GCCause::_wb_full_gc:
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   222
  case GCCause::_dcmd_gc_run:
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   223
  case GCCause::_java_lang_system_gc:
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   224
  case GCCause::_full_gc_alot:
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   225
  case GCCause::_scavenge_alot:
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   226
  case GCCause::_jvmti_force_gc:
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   227
  case GCCause::_metadata_GC_clear_soft_refs:
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   228
    // Start synchronous GC
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   229
    _gc_cycle_port.send_sync(cause);
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   230
    break;
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
  case GCCause::_z_timer:
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   233
  case GCCause::_z_warmup:
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   234
  case GCCause::_z_allocation_rate:
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   235
  case GCCause::_z_allocation_stall:
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   236
  case GCCause::_z_proactive:
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   237
  case GCCause::_metadata_GC_threshold:
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   238
    // Start asynchronous GC
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   239
    _gc_cycle_port.send_async(cause);
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   240
    break;
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   241
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   242
  case GCCause::_gc_locker:
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   243
    // 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
   244
    _gc_locker_port.signal();
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
  default:
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   248
    // Other causes not supported
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   249
    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
   250
    break;
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   251
  }
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   252
}
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   253
53541
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   254
template <typename T>
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   255
bool ZDriver::pause() {
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   256
  for (;;) {
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   257
    T op;
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   258
    VMThread::execute(&op);
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   259
    if (op.gc_locked()) {
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   260
      // Wait for GC to become unlocked and restart the VM operation
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   261
      ZStatTimer timer(ZCriticalPhaseGCLockerStall);
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   262
      _gc_locker_port.wait();
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   263
      continue;
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   264
    }
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   265
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   266
    // Notify VM operation completed
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   267
    _gc_locker_port.ack();
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   268
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   269
    return op.success();
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   270
  }
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   271
}
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   272
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   273
void ZDriver::pause_mark_start() {
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   274
  pause<VM_ZMarkStart>();
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   275
}
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   276
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   277
void ZDriver::concurrent_mark() {
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   278
  ZStatTimer timer(ZPhaseConcurrentMark);
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   279
  ZHeap::heap()->mark(true /* initial */);
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
bool ZDriver::pause_mark_end() {
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   283
  return pause<VM_ZMarkEnd>();
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   284
}
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   285
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   286
void ZDriver::concurrent_mark_continue() {
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   287
  ZStatTimer timer(ZPhaseConcurrentMarkContinue);
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   288
  ZHeap::heap()->mark(false /* initial */);
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   289
}
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   290
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   291
void ZDriver::concurrent_process_non_strong_references() {
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   292
  ZStatTimer timer(ZPhaseConcurrentProcessNonStrongReferences);
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   293
  ZHeap::heap()->process_non_strong_references();
50525
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   294
}
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   295
53541
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   296
void ZDriver::concurrent_reset_relocation_set() {
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   297
  ZStatTimer timer(ZPhaseConcurrentResetRelocationSet);
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   298
  ZHeap::heap()->reset_relocation_set();
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   299
}
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   300
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   301
void ZDriver::pause_verify() {
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   302
  if (VerifyBeforeGC || VerifyDuringGC || VerifyAfterGC) {
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   303
    VM_Verify op;
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   304
    VMThread::execute(&op);
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
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   308
void ZDriver::concurrent_select_relocation_set() {
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   309
  ZStatTimer timer(ZPhaseConcurrentSelectRelocationSet);
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   310
  ZHeap::heap()->select_relocation_set();
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   311
}
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   312
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   313
void ZDriver::pause_relocate_start() {
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   314
  pause<VM_ZRelocateStart>();
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::concurrent_relocate() {
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   318
  ZStatTimer timer(ZPhaseConcurrentRelocated);
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   319
  ZHeap::heap()->relocate();
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   320
}
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   321
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   322
void ZDriver::check_out_of_memory() {
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   323
  ZHeap::heap()->check_out_of_memory();
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   324
}
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   325
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   326
class ZDriverGCScope : public StackObj {
50525
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   327
private:
50582
6464882498b5 8205022: ZGC: SoftReferences not always cleared before throwing OOME
pliden
parents: 50525
diff changeset
   328
  GCIdMark      _gc_id;
6464882498b5 8205022: ZGC: SoftReferences not always cleared before throwing OOME
pliden
parents: 50525
diff changeset
   329
  GCCauseSetter _gc_cause_setter;
6464882498b5 8205022: ZGC: SoftReferences not always cleared before throwing OOME
pliden
parents: 50525
diff changeset
   330
  ZStatTimer    _timer;
50525
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   331
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   332
public:
53541
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   333
  ZDriverGCScope(GCCause::Cause cause) :
50525
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   334
      _gc_id(),
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   335
      _gc_cause_setter(ZCollectedHeap::heap(), cause),
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   336
      _timer(ZPhaseCycle) {
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   337
    // Update statistics
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   338
    ZStatCycle::at_start();
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   339
  }
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   340
53541
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   341
  ~ZDriverGCScope() {
50525
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   342
    // Calculate boost factor
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   343
    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
   344
                                (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
   345
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   346
    // Update statistics
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   347
    ZStatCycle::at_end(boost_factor);
50582
6464882498b5 8205022: ZGC: SoftReferences not always cleared before throwing OOME
pliden
parents: 50525
diff changeset
   348
6464882498b5 8205022: ZGC: SoftReferences not always cleared before throwing OOME
pliden
parents: 50525
diff changeset
   349
    // Update data used by soft reference policy
6464882498b5 8205022: ZGC: SoftReferences not always cleared before throwing OOME
pliden
parents: 50525
diff changeset
   350
    Universe::update_heap_info_at_gc();
50525
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   351
  }
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   352
};
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   353
53541
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   354
void ZDriver::gc(GCCause::Cause cause) {
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   355
  ZDriverGCScope scope(cause);
50525
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   356
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   357
  // Phase 1: Pause Mark Start
53541
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   358
  pause_mark_start();
50525
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   359
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   360
  // Phase 2: Concurrent Mark
53541
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   361
  concurrent_mark();
50525
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
  // Phase 3: Pause Mark End
53541
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   364
  while (!pause_mark_end()) {
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   365
    // Phase 3.5: Concurrent Mark Continue
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   366
    concurrent_mark_continue();
50525
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   367
  }
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
  // Phase 4: Concurrent Process Non-Strong References
53541
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   370
  concurrent_process_non_strong_references();
50525
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   371
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   372
  // Phase 5: Concurrent Reset Relocation Set
53541
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   373
  concurrent_reset_relocation_set();
50525
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   374
54174
6d1caebf8d37 8220600: ZGC: Delete ZPages using ZSafeDelete
pliden
parents: 54163
diff changeset
   375
  // Phase 6: Pause Verify
53541
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   376
  pause_verify();
52382
2e280ecec246 8212921: ZGC: Move verification to after resurrection unblocked
pliden
parents: 52140
diff changeset
   377
54174
6d1caebf8d37 8220600: ZGC: Delete ZPages using ZSafeDelete
pliden
parents: 54163
diff changeset
   378
  // Phase 7: Concurrent Select Relocation Set
53541
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   379
  concurrent_select_relocation_set();
50525
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   380
54174
6d1caebf8d37 8220600: ZGC: Delete ZPages using ZSafeDelete
pliden
parents: 54163
diff changeset
   381
  // Phase 8: Pause Relocate Start
53541
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   382
  pause_relocate_start();
50525
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   383
54174
6d1caebf8d37 8220600: ZGC: Delete ZPages using ZSafeDelete
pliden
parents: 54163
diff changeset
   384
  // Phase 9: Concurrent Relocate
53541
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   385
  concurrent_relocate();
50525
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   386
}
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   387
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   388
void ZDriver::run_service() {
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   389
  // Main loop
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   390
  while (!should_terminate()) {
53541
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   391
    // Wait for GC request
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   392
    const GCCause::Cause cause = _gc_cycle_port.receive();
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   393
    if (cause == GCCause::_no_gc) {
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   394
      continue;
50525
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   395
    }
53541
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   396
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   397
    // Run GC
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   398
    gc(cause);
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   399
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   400
    // Notify GC completed
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   401
    _gc_cycle_port.ack();
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   402
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   403
    // Check for out of memory condition
4e325f8b50ce 8217858: ZGC: Clean up ZDriver
pliden
parents: 53540
diff changeset
   404
    check_out_of_memory();
50525
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   405
  }
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   406
}
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   407
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   408
void ZDriver::stop_service() {
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   409
  _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
   410
}