src/hotspot/share/gc/g1/g1SerialFullCollector.cpp
author tschatzl
Mon, 06 Nov 2017 14:25:18 +0100
changeset 47790 4925ee84b4ac
parent 47216 71c04702a3d5
permissions -rw-r--r--
8140255: Move the management of G1YoungRemSetSamplingThread from G1ConcurrentRefine Reviewed-by: sjohanss, sangheki
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
46828
19b0b4ceb75d 8177544: Restructure G1 Full GC code
sjohanss
parents:
diff changeset
     1
/*
19b0b4ceb75d 8177544: Restructure G1 Full GC code
sjohanss
parents:
diff changeset
     2
 * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved.
19b0b4ceb75d 8177544: Restructure G1 Full GC code
sjohanss
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
19b0b4ceb75d 8177544: Restructure G1 Full GC code
sjohanss
parents:
diff changeset
     4
 *
19b0b4ceb75d 8177544: Restructure G1 Full GC code
sjohanss
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
19b0b4ceb75d 8177544: Restructure G1 Full GC code
sjohanss
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
19b0b4ceb75d 8177544: Restructure G1 Full GC code
sjohanss
parents:
diff changeset
     7
 * published by the Free Software Foundation.
19b0b4ceb75d 8177544: Restructure G1 Full GC code
sjohanss
parents:
diff changeset
     8
 *
19b0b4ceb75d 8177544: Restructure G1 Full GC code
sjohanss
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
19b0b4ceb75d 8177544: Restructure G1 Full GC code
sjohanss
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
19b0b4ceb75d 8177544: Restructure G1 Full GC code
sjohanss
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
19b0b4ceb75d 8177544: Restructure G1 Full GC code
sjohanss
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
19b0b4ceb75d 8177544: Restructure G1 Full GC code
sjohanss
parents:
diff changeset
    13
 * accompanied this code).
19b0b4ceb75d 8177544: Restructure G1 Full GC code
sjohanss
parents:
diff changeset
    14
 *
19b0b4ceb75d 8177544: Restructure G1 Full GC code
sjohanss
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
19b0b4ceb75d 8177544: Restructure G1 Full GC code
sjohanss
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
19b0b4ceb75d 8177544: Restructure G1 Full GC code
sjohanss
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
19b0b4ceb75d 8177544: Restructure G1 Full GC code
sjohanss
parents:
diff changeset
    18
 *
19b0b4ceb75d 8177544: Restructure G1 Full GC code
sjohanss
parents:
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
19b0b4ceb75d 8177544: Restructure G1 Full GC code
sjohanss
parents:
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
19b0b4ceb75d 8177544: Restructure G1 Full GC code
sjohanss
parents:
diff changeset
    21
 * questions.
19b0b4ceb75d 8177544: Restructure G1 Full GC code
sjohanss
parents:
diff changeset
    22
 *
19b0b4ceb75d 8177544: Restructure G1 Full GC code
sjohanss
parents:
diff changeset
    23
 */
19b0b4ceb75d 8177544: Restructure G1 Full GC code
sjohanss
parents:
diff changeset
    24
19b0b4ceb75d 8177544: Restructure G1 Full GC code
sjohanss
parents:
diff changeset
    25
#include "precompiled.hpp"
19b0b4ceb75d 8177544: Restructure G1 Full GC code
sjohanss
parents:
diff changeset
    26
#include "gc/g1/g1CollectedHeap.inline.hpp"
19b0b4ceb75d 8177544: Restructure G1 Full GC code
sjohanss
parents:
diff changeset
    27
#include "gc/g1/g1FullGCScope.hpp"
19b0b4ceb75d 8177544: Restructure G1 Full GC code
sjohanss
parents:
diff changeset
    28
#include "gc/g1/g1MarkSweep.hpp"
19b0b4ceb75d 8177544: Restructure G1 Full GC code
sjohanss
parents:
diff changeset
    29
#include "gc/g1/g1RemSet.inline.hpp"
19b0b4ceb75d 8177544: Restructure G1 Full GC code
sjohanss
parents:
diff changeset
    30
#include "gc/g1/g1SerialFullCollector.hpp"
19b0b4ceb75d 8177544: Restructure G1 Full GC code
sjohanss
parents:
diff changeset
    31
#include "gc/g1/heapRegionRemSet.hpp"
19b0b4ceb75d 8177544: Restructure G1 Full GC code
sjohanss
parents:
diff changeset
    32
#include "gc/shared/referenceProcessor.hpp"
19b0b4ceb75d 8177544: Restructure G1 Full GC code
sjohanss
parents:
diff changeset
    33
19b0b4ceb75d 8177544: Restructure G1 Full GC code
sjohanss
parents:
diff changeset
    34
G1SerialFullCollector::G1SerialFullCollector(G1FullGCScope* scope,
19b0b4ceb75d 8177544: Restructure G1 Full GC code
sjohanss
parents:
diff changeset
    35
                                             ReferenceProcessor* reference_processor) :
19b0b4ceb75d 8177544: Restructure G1 Full GC code
sjohanss
parents:
diff changeset
    36
    _scope(scope),
19b0b4ceb75d 8177544: Restructure G1 Full GC code
sjohanss
parents:
diff changeset
    37
    _reference_processor(reference_processor),
19b0b4ceb75d 8177544: Restructure G1 Full GC code
sjohanss
parents:
diff changeset
    38
    _is_alive_mutator(_reference_processor, NULL),
19b0b4ceb75d 8177544: Restructure G1 Full GC code
sjohanss
parents:
diff changeset
    39
    _mt_discovery_mutator(_reference_processor, false) {
19b0b4ceb75d 8177544: Restructure G1 Full GC code
sjohanss
parents:
diff changeset
    40
  // Temporarily make discovery by the STW ref processor single threaded (non-MT)
19b0b4ceb75d 8177544: Restructure G1 Full GC code
sjohanss
parents:
diff changeset
    41
  // and clear the STW ref processor's _is_alive_non_header field.
19b0b4ceb75d 8177544: Restructure G1 Full GC code
sjohanss
parents:
diff changeset
    42
}
19b0b4ceb75d 8177544: Restructure G1 Full GC code
sjohanss
parents:
diff changeset
    43
19b0b4ceb75d 8177544: Restructure G1 Full GC code
sjohanss
parents:
diff changeset
    44
void G1SerialFullCollector::prepare_collection() {
19b0b4ceb75d 8177544: Restructure G1 Full GC code
sjohanss
parents:
diff changeset
    45
  _reference_processor->enable_discovery();
19b0b4ceb75d 8177544: Restructure G1 Full GC code
sjohanss
parents:
diff changeset
    46
  _reference_processor->setup_policy(_scope->should_clear_soft_refs());
19b0b4ceb75d 8177544: Restructure G1 Full GC code
sjohanss
parents:
diff changeset
    47
}
19b0b4ceb75d 8177544: Restructure G1 Full GC code
sjohanss
parents:
diff changeset
    48
19b0b4ceb75d 8177544: Restructure G1 Full GC code
sjohanss
parents:
diff changeset
    49
void G1SerialFullCollector::complete_collection() {
19b0b4ceb75d 8177544: Restructure G1 Full GC code
sjohanss
parents:
diff changeset
    50
  // Enqueue any discovered reference objects that have
19b0b4ceb75d 8177544: Restructure G1 Full GC code
sjohanss
parents:
diff changeset
    51
  // not been removed from the discovered lists.
19b0b4ceb75d 8177544: Restructure G1 Full GC code
sjohanss
parents:
diff changeset
    52
  ReferenceProcessorPhaseTimes pt(NULL, _reference_processor->num_q());
19b0b4ceb75d 8177544: Restructure G1 Full GC code
sjohanss
parents:
diff changeset
    53
  _reference_processor->enqueue_discovered_references(NULL, &pt);
19b0b4ceb75d 8177544: Restructure G1 Full GC code
sjohanss
parents:
diff changeset
    54
  pt.print_enqueue_phase();
19b0b4ceb75d 8177544: Restructure G1 Full GC code
sjohanss
parents:
diff changeset
    55
19b0b4ceb75d 8177544: Restructure G1 Full GC code
sjohanss
parents:
diff changeset
    56
  // Iterate the heap and rebuild the remembered sets.
19b0b4ceb75d 8177544: Restructure G1 Full GC code
sjohanss
parents:
diff changeset
    57
  rebuild_remembered_sets();
19b0b4ceb75d 8177544: Restructure G1 Full GC code
sjohanss
parents:
diff changeset
    58
}
19b0b4ceb75d 8177544: Restructure G1 Full GC code
sjohanss
parents:
diff changeset
    59
19b0b4ceb75d 8177544: Restructure G1 Full GC code
sjohanss
parents:
diff changeset
    60
void G1SerialFullCollector::collect() {
19b0b4ceb75d 8177544: Restructure G1 Full GC code
sjohanss
parents:
diff changeset
    61
  // Do the actual collection work.
19b0b4ceb75d 8177544: Restructure G1 Full GC code
sjohanss
parents:
diff changeset
    62
  G1MarkSweep::invoke_at_safepoint(_reference_processor, _scope->should_clear_soft_refs());
19b0b4ceb75d 8177544: Restructure G1 Full GC code
sjohanss
parents:
diff changeset
    63
}
19b0b4ceb75d 8177544: Restructure G1 Full GC code
sjohanss
parents:
diff changeset
    64
19b0b4ceb75d 8177544: Restructure G1 Full GC code
sjohanss
parents:
diff changeset
    65
class PostMCRemSetClearClosure: public HeapRegionClosure {
19b0b4ceb75d 8177544: Restructure G1 Full GC code
sjohanss
parents:
diff changeset
    66
  G1CollectedHeap* _g1h;
19b0b4ceb75d 8177544: Restructure G1 Full GC code
sjohanss
parents:
diff changeset
    67
  ModRefBarrierSet* _mr_bs;
19b0b4ceb75d 8177544: Restructure G1 Full GC code
sjohanss
parents:
diff changeset
    68
public:
19b0b4ceb75d 8177544: Restructure G1 Full GC code
sjohanss
parents:
diff changeset
    69
  PostMCRemSetClearClosure(G1CollectedHeap* g1h, ModRefBarrierSet* mr_bs) :
19b0b4ceb75d 8177544: Restructure G1 Full GC code
sjohanss
parents:
diff changeset
    70
    _g1h(g1h), _mr_bs(mr_bs) {}
19b0b4ceb75d 8177544: Restructure G1 Full GC code
sjohanss
parents:
diff changeset
    71
19b0b4ceb75d 8177544: Restructure G1 Full GC code
sjohanss
parents:
diff changeset
    72
  bool doHeapRegion(HeapRegion* r) {
19b0b4ceb75d 8177544: Restructure G1 Full GC code
sjohanss
parents:
diff changeset
    73
    HeapRegionRemSet* hrrs = r->rem_set();
19b0b4ceb75d 8177544: Restructure G1 Full GC code
sjohanss
parents:
diff changeset
    74
19b0b4ceb75d 8177544: Restructure G1 Full GC code
sjohanss
parents:
diff changeset
    75
    _g1h->reset_gc_time_stamps(r);
19b0b4ceb75d 8177544: Restructure G1 Full GC code
sjohanss
parents:
diff changeset
    76
19b0b4ceb75d 8177544: Restructure G1 Full GC code
sjohanss
parents:
diff changeset
    77
    if (r->is_continues_humongous()) {
19b0b4ceb75d 8177544: Restructure G1 Full GC code
sjohanss
parents:
diff changeset
    78
      // We'll assert that the strong code root list and RSet is empty
19b0b4ceb75d 8177544: Restructure G1 Full GC code
sjohanss
parents:
diff changeset
    79
      assert(hrrs->strong_code_roots_list_length() == 0, "sanity");
19b0b4ceb75d 8177544: Restructure G1 Full GC code
sjohanss
parents:
diff changeset
    80
      assert(hrrs->occupied() == 0, "RSet should be empty");
19b0b4ceb75d 8177544: Restructure G1 Full GC code
sjohanss
parents:
diff changeset
    81
    } else {
19b0b4ceb75d 8177544: Restructure G1 Full GC code
sjohanss
parents:
diff changeset
    82
      hrrs->clear();
19b0b4ceb75d 8177544: Restructure G1 Full GC code
sjohanss
parents:
diff changeset
    83
    }
19b0b4ceb75d 8177544: Restructure G1 Full GC code
sjohanss
parents:
diff changeset
    84
    // You might think here that we could clear just the cards
19b0b4ceb75d 8177544: Restructure G1 Full GC code
sjohanss
parents:
diff changeset
    85
    // corresponding to the used region.  But no: if we leave a dirty card
19b0b4ceb75d 8177544: Restructure G1 Full GC code
sjohanss
parents:
diff changeset
    86
    // in a region we might allocate into, then it would prevent that card
19b0b4ceb75d 8177544: Restructure G1 Full GC code
sjohanss
parents:
diff changeset
    87
    // from being enqueued, and cause it to be missed.
19b0b4ceb75d 8177544: Restructure G1 Full GC code
sjohanss
parents:
diff changeset
    88
    // Re: the performance cost: we shouldn't be doing full GC anyway!
19b0b4ceb75d 8177544: Restructure G1 Full GC code
sjohanss
parents:
diff changeset
    89
    _mr_bs->clear(MemRegion(r->bottom(), r->end()));
19b0b4ceb75d 8177544: Restructure G1 Full GC code
sjohanss
parents:
diff changeset
    90
19b0b4ceb75d 8177544: Restructure G1 Full GC code
sjohanss
parents:
diff changeset
    91
    return false;
19b0b4ceb75d 8177544: Restructure G1 Full GC code
sjohanss
parents:
diff changeset
    92
  }
19b0b4ceb75d 8177544: Restructure G1 Full GC code
sjohanss
parents:
diff changeset
    93
};
19b0b4ceb75d 8177544: Restructure G1 Full GC code
sjohanss
parents:
diff changeset
    94
19b0b4ceb75d 8177544: Restructure G1 Full GC code
sjohanss
parents:
diff changeset
    95
19b0b4ceb75d 8177544: Restructure G1 Full GC code
sjohanss
parents:
diff changeset
    96
class RebuildRSOutOfRegionClosure: public HeapRegionClosure {
19b0b4ceb75d 8177544: Restructure G1 Full GC code
sjohanss
parents:
diff changeset
    97
  G1CollectedHeap*   _g1h;
19b0b4ceb75d 8177544: Restructure G1 Full GC code
sjohanss
parents:
diff changeset
    98
  RebuildRSOopClosure _cl;
19b0b4ceb75d 8177544: Restructure G1 Full GC code
sjohanss
parents:
diff changeset
    99
public:
19b0b4ceb75d 8177544: Restructure G1 Full GC code
sjohanss
parents:
diff changeset
   100
  RebuildRSOutOfRegionClosure(G1CollectedHeap* g1, uint worker_i = 0) :
19b0b4ceb75d 8177544: Restructure G1 Full GC code
sjohanss
parents:
diff changeset
   101
    _cl(g1->g1_rem_set(), worker_i),
19b0b4ceb75d 8177544: Restructure G1 Full GC code
sjohanss
parents:
diff changeset
   102
    _g1h(g1)
19b0b4ceb75d 8177544: Restructure G1 Full GC code
sjohanss
parents:
diff changeset
   103
  { }
19b0b4ceb75d 8177544: Restructure G1 Full GC code
sjohanss
parents:
diff changeset
   104
19b0b4ceb75d 8177544: Restructure G1 Full GC code
sjohanss
parents:
diff changeset
   105
  bool doHeapRegion(HeapRegion* r) {
19b0b4ceb75d 8177544: Restructure G1 Full GC code
sjohanss
parents:
diff changeset
   106
    if (!r->is_continues_humongous()) {
19b0b4ceb75d 8177544: Restructure G1 Full GC code
sjohanss
parents:
diff changeset
   107
      _cl.set_from(r);
19b0b4ceb75d 8177544: Restructure G1 Full GC code
sjohanss
parents:
diff changeset
   108
      r->oop_iterate(&_cl);
19b0b4ceb75d 8177544: Restructure G1 Full GC code
sjohanss
parents:
diff changeset
   109
    }
19b0b4ceb75d 8177544: Restructure G1 Full GC code
sjohanss
parents:
diff changeset
   110
    return false;
19b0b4ceb75d 8177544: Restructure G1 Full GC code
sjohanss
parents:
diff changeset
   111
  }
19b0b4ceb75d 8177544: Restructure G1 Full GC code
sjohanss
parents:
diff changeset
   112
};
19b0b4ceb75d 8177544: Restructure G1 Full GC code
sjohanss
parents:
diff changeset
   113
19b0b4ceb75d 8177544: Restructure G1 Full GC code
sjohanss
parents:
diff changeset
   114
class ParRebuildRSTask: public AbstractGangTask {
19b0b4ceb75d 8177544: Restructure G1 Full GC code
sjohanss
parents:
diff changeset
   115
  G1CollectedHeap* _g1;
19b0b4ceb75d 8177544: Restructure G1 Full GC code
sjohanss
parents:
diff changeset
   116
  HeapRegionClaimer _hrclaimer;
19b0b4ceb75d 8177544: Restructure G1 Full GC code
sjohanss
parents:
diff changeset
   117
19b0b4ceb75d 8177544: Restructure G1 Full GC code
sjohanss
parents:
diff changeset
   118
public:
19b0b4ceb75d 8177544: Restructure G1 Full GC code
sjohanss
parents:
diff changeset
   119
  ParRebuildRSTask(G1CollectedHeap* g1) :
19b0b4ceb75d 8177544: Restructure G1 Full GC code
sjohanss
parents:
diff changeset
   120
      AbstractGangTask("ParRebuildRSTask"), _g1(g1), _hrclaimer(g1->workers()->active_workers()) {}
19b0b4ceb75d 8177544: Restructure G1 Full GC code
sjohanss
parents:
diff changeset
   121
19b0b4ceb75d 8177544: Restructure G1 Full GC code
sjohanss
parents:
diff changeset
   122
  void work(uint worker_id) {
19b0b4ceb75d 8177544: Restructure G1 Full GC code
sjohanss
parents:
diff changeset
   123
    RebuildRSOutOfRegionClosure rebuild_rs(_g1, worker_id);
19b0b4ceb75d 8177544: Restructure G1 Full GC code
sjohanss
parents:
diff changeset
   124
    _g1->heap_region_par_iterate(&rebuild_rs, worker_id, &_hrclaimer);
19b0b4ceb75d 8177544: Restructure G1 Full GC code
sjohanss
parents:
diff changeset
   125
  }
19b0b4ceb75d 8177544: Restructure G1 Full GC code
sjohanss
parents:
diff changeset
   126
};
19b0b4ceb75d 8177544: Restructure G1 Full GC code
sjohanss
parents:
diff changeset
   127
19b0b4ceb75d 8177544: Restructure G1 Full GC code
sjohanss
parents:
diff changeset
   128
void G1SerialFullCollector::rebuild_remembered_sets() {
19b0b4ceb75d 8177544: Restructure G1 Full GC code
sjohanss
parents:
diff changeset
   129
  G1CollectedHeap* g1h = G1CollectedHeap::heap();
19b0b4ceb75d 8177544: Restructure G1 Full GC code
sjohanss
parents:
diff changeset
   130
  // First clear the stale remembered sets.
19b0b4ceb75d 8177544: Restructure G1 Full GC code
sjohanss
parents:
diff changeset
   131
  PostMCRemSetClearClosure rs_clear(g1h, g1h->g1_barrier_set());
19b0b4ceb75d 8177544: Restructure G1 Full GC code
sjohanss
parents:
diff changeset
   132
  g1h->heap_region_iterate(&rs_clear);
19b0b4ceb75d 8177544: Restructure G1 Full GC code
sjohanss
parents:
diff changeset
   133
19b0b4ceb75d 8177544: Restructure G1 Full GC code
sjohanss
parents:
diff changeset
   134
  // Rebuild remembered sets of all regions.
19b0b4ceb75d 8177544: Restructure G1 Full GC code
sjohanss
parents:
diff changeset
   135
  uint n_workers = AdaptiveSizePolicy::calc_active_workers(g1h->workers()->total_workers(),
19b0b4ceb75d 8177544: Restructure G1 Full GC code
sjohanss
parents:
diff changeset
   136
                                                           g1h->workers()->active_workers(),
19b0b4ceb75d 8177544: Restructure G1 Full GC code
sjohanss
parents:
diff changeset
   137
                                                           Threads::number_of_non_daemon_threads());
19b0b4ceb75d 8177544: Restructure G1 Full GC code
sjohanss
parents:
diff changeset
   138
  g1h->workers()->update_active_workers(n_workers);
19b0b4ceb75d 8177544: Restructure G1 Full GC code
sjohanss
parents:
diff changeset
   139
  log_info(gc,task)("Using %u workers of %u to rebuild remembered set", n_workers, g1h->workers()->total_workers());
19b0b4ceb75d 8177544: Restructure G1 Full GC code
sjohanss
parents:
diff changeset
   140
19b0b4ceb75d 8177544: Restructure G1 Full GC code
sjohanss
parents:
diff changeset
   141
  ParRebuildRSTask rebuild_rs_task(g1h);
19b0b4ceb75d 8177544: Restructure G1 Full GC code
sjohanss
parents:
diff changeset
   142
  g1h->workers()->run_task(&rebuild_rs_task);
19b0b4ceb75d 8177544: Restructure G1 Full GC code
sjohanss
parents:
diff changeset
   143
}