hotspot/src/share/vm/gc_implementation/g1/heapRegion.cpp
author tonyp
Sat, 16 Oct 2010 17:12:19 -0400
changeset 6983 a8c50cedbce9
parent 6260 fba83fd3adc7
child 7397 5b173b4ca846
permissions -rw-r--r--
6991377: G1: race between concurrent refinement and humongous object allocation Summary: There is a race between the concurrent refinement threads and the humongous object allocation that can cause the concurrent refinement threads to corrupt the part of the BOT that it is being initialized by the humongous object allocation operation. The solution is to do the humongous object allocation in careful steps to ensure that the concurrent refinement threads always have a consistent view over the BOT, region contents, and top. The fix includes some very minor tidying up in sparsePRT. Reviewed-by: jcoomes, johnc, ysr
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
     1
/*
5547
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 5545
diff changeset
     2
 * Copyright (c) 2001, 2010, Oracle and/or its affiliates. All rights reserved.
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
     4
 *
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
     7
 * published by the Free Software Foundation.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
     8
 *
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    13
 * accompanied this code).
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    14
 *
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    18
 *
5547
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 5545
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 5545
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 5545
diff changeset
    21
 * questions.
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    22
 *
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    23
 */
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    24
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    25
#include "incls/_precompiled.incl"
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    26
#include "incls/_heapRegion.cpp.incl"
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    27
3697
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3283
diff changeset
    28
int HeapRegion::LogOfHRGrainBytes = 0;
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3283
diff changeset
    29
int HeapRegion::LogOfHRGrainWords = 0;
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3283
diff changeset
    30
int HeapRegion::GrainBytes        = 0;
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3283
diff changeset
    31
int HeapRegion::GrainWords        = 0;
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3283
diff changeset
    32
int HeapRegion::CardsPerRegion    = 0;
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3283
diff changeset
    33
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    34
HeapRegionDCTOC::HeapRegionDCTOC(G1CollectedHeap* g1,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    35
                                 HeapRegion* hr, OopClosure* cl,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    36
                                 CardTableModRefBS::PrecisionStyle precision,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    37
                                 FilterKind fk) :
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    38
  ContiguousSpaceDCTOC(hr, cl, precision, NULL),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    39
  _hr(hr), _fk(fk), _g1(g1)
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    40
{}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    41
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    42
FilterOutOfRegionClosure::FilterOutOfRegionClosure(HeapRegion* r,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    43
                                                   OopClosure* oc) :
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    44
  _r_bottom(r->bottom()), _r_end(r->end()),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    45
  _oc(oc), _out_of_region(0)
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    46
{}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    47
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    48
class VerifyLiveClosure: public OopClosure {
3000
bbce6052b595 6850846: G1: extend G1 marking verification
tonyp
parents: 2883
diff changeset
    49
private:
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    50
  G1CollectedHeap* _g1h;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    51
  CardTableModRefBS* _bs;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    52
  oop _containing_obj;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    53
  bool _failures;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    54
  int _n_failures;
3000
bbce6052b595 6850846: G1: extend G1 marking verification
tonyp
parents: 2883
diff changeset
    55
  bool _use_prev_marking;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    56
public:
3000
bbce6052b595 6850846: G1: extend G1 marking verification
tonyp
parents: 2883
diff changeset
    57
  // use_prev_marking == true  -> use "prev" marking information,
bbce6052b595 6850846: G1: extend G1 marking verification
tonyp
parents: 2883
diff changeset
    58
  // use_prev_marking == false -> use "next" marking information
bbce6052b595 6850846: G1: extend G1 marking verification
tonyp
parents: 2883
diff changeset
    59
  VerifyLiveClosure(G1CollectedHeap* g1h, bool use_prev_marking) :
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    60
    _g1h(g1h), _bs(NULL), _containing_obj(NULL),
3000
bbce6052b595 6850846: G1: extend G1 marking verification
tonyp
parents: 2883
diff changeset
    61
    _failures(false), _n_failures(0), _use_prev_marking(use_prev_marking)
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    62
  {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    63
    BarrierSet* bs = _g1h->barrier_set();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    64
    if (bs->is_a(BarrierSet::CardTableModRef))
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    65
      _bs = (CardTableModRefBS*)bs;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    66
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    67
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    68
  void set_containing_obj(oop obj) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    69
    _containing_obj = obj;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    70
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    71
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    72
  bool failures() { return _failures; }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    73
  int n_failures() { return _n_failures; }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    74
3262
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
    75
  virtual void do_oop(narrowOop* p) { do_oop_work(p); }
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
    76
  virtual void do_oop(      oop* p) { do_oop_work(p); }
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    77
5344
f78ef2531f44 6937142: G1: improvements to debugging output (S-M)
tonyp
parents: 4023
diff changeset
    78
  void print_object(outputStream* out, oop obj) {
f78ef2531f44 6937142: G1: improvements to debugging output (S-M)
tonyp
parents: 4023
diff changeset
    79
#ifdef PRODUCT
f78ef2531f44 6937142: G1: improvements to debugging output (S-M)
tonyp
parents: 4023
diff changeset
    80
    klassOop k = obj->klass();
f78ef2531f44 6937142: G1: improvements to debugging output (S-M)
tonyp
parents: 4023
diff changeset
    81
    const char* class_name = instanceKlass::cast(k)->external_name();
f78ef2531f44 6937142: G1: improvements to debugging output (S-M)
tonyp
parents: 4023
diff changeset
    82
    out->print_cr("class name %s", class_name);
f78ef2531f44 6937142: G1: improvements to debugging output (S-M)
tonyp
parents: 4023
diff changeset
    83
#else // PRODUCT
f78ef2531f44 6937142: G1: improvements to debugging output (S-M)
tonyp
parents: 4023
diff changeset
    84
    obj->print_on(out);
f78ef2531f44 6937142: G1: improvements to debugging output (S-M)
tonyp
parents: 4023
diff changeset
    85
#endif // PRODUCT
f78ef2531f44 6937142: G1: improvements to debugging output (S-M)
tonyp
parents: 4023
diff changeset
    86
  }
f78ef2531f44 6937142: G1: improvements to debugging output (S-M)
tonyp
parents: 4023
diff changeset
    87
3262
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
    88
  template <class T> void do_oop_work(T* p) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    89
    assert(_containing_obj != NULL, "Precondition");
3000
bbce6052b595 6850846: G1: extend G1 marking verification
tonyp
parents: 2883
diff changeset
    90
    assert(!_g1h->is_obj_dead_cond(_containing_obj, _use_prev_marking),
bbce6052b595 6850846: G1: extend G1 marking verification
tonyp
parents: 2883
diff changeset
    91
           "Precondition");
3262
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
    92
    T heap_oop = oopDesc::load_heap_oop(p);
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
    93
    if (!oopDesc::is_null(heap_oop)) {
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
    94
      oop obj = oopDesc::decode_heap_oop_not_null(heap_oop);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    95
      bool failed = false;
3000
bbce6052b595 6850846: G1: extend G1 marking verification
tonyp
parents: 2883
diff changeset
    96
      if (!_g1h->is_in_closed_subset(obj) ||
bbce6052b595 6850846: G1: extend G1 marking verification
tonyp
parents: 2883
diff changeset
    97
          _g1h->is_obj_dead_cond(obj, _use_prev_marking)) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    98
        if (!_failures) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    99
          gclog_or_tty->print_cr("");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   100
          gclog_or_tty->print_cr("----------");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   101
        }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   102
        if (!_g1h->is_in_closed_subset(obj)) {
5344
f78ef2531f44 6937142: G1: improvements to debugging output (S-M)
tonyp
parents: 4023
diff changeset
   103
          HeapRegion* from = _g1h->heap_region_containing((HeapWord*)p);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   104
          gclog_or_tty->print_cr("Field "PTR_FORMAT
5344
f78ef2531f44 6937142: G1: improvements to debugging output (S-M)
tonyp
parents: 4023
diff changeset
   105
                                 " of live obj "PTR_FORMAT" in region "
f78ef2531f44 6937142: G1: improvements to debugging output (S-M)
tonyp
parents: 4023
diff changeset
   106
                                 "["PTR_FORMAT", "PTR_FORMAT")",
f78ef2531f44 6937142: G1: improvements to debugging output (S-M)
tonyp
parents: 4023
diff changeset
   107
                                 p, (void*) _containing_obj,
f78ef2531f44 6937142: G1: improvements to debugging output (S-M)
tonyp
parents: 4023
diff changeset
   108
                                 from->bottom(), from->end());
f78ef2531f44 6937142: G1: improvements to debugging output (S-M)
tonyp
parents: 4023
diff changeset
   109
          print_object(gclog_or_tty, _containing_obj);
f78ef2531f44 6937142: G1: improvements to debugging output (S-M)
tonyp
parents: 4023
diff changeset
   110
          gclog_or_tty->print_cr("points to obj "PTR_FORMAT" not in the heap",
f78ef2531f44 6937142: G1: improvements to debugging output (S-M)
tonyp
parents: 4023
diff changeset
   111
                                 (void*) obj);
f78ef2531f44 6937142: G1: improvements to debugging output (S-M)
tonyp
parents: 4023
diff changeset
   112
        } else {
f78ef2531f44 6937142: G1: improvements to debugging output (S-M)
tonyp
parents: 4023
diff changeset
   113
          HeapRegion* from = _g1h->heap_region_containing((HeapWord*)p);
f78ef2531f44 6937142: G1: improvements to debugging output (S-M)
tonyp
parents: 4023
diff changeset
   114
          HeapRegion* to   = _g1h->heap_region_containing((HeapWord*)obj);
f78ef2531f44 6937142: G1: improvements to debugging output (S-M)
tonyp
parents: 4023
diff changeset
   115
          gclog_or_tty->print_cr("Field "PTR_FORMAT
f78ef2531f44 6937142: G1: improvements to debugging output (S-M)
tonyp
parents: 4023
diff changeset
   116
                                 " of live obj "PTR_FORMAT" in region "
f78ef2531f44 6937142: G1: improvements to debugging output (S-M)
tonyp
parents: 4023
diff changeset
   117
                                 "["PTR_FORMAT", "PTR_FORMAT")",
f78ef2531f44 6937142: G1: improvements to debugging output (S-M)
tonyp
parents: 4023
diff changeset
   118
                                 p, (void*) _containing_obj,
f78ef2531f44 6937142: G1: improvements to debugging output (S-M)
tonyp
parents: 4023
diff changeset
   119
                                 from->bottom(), from->end());
f78ef2531f44 6937142: G1: improvements to debugging output (S-M)
tonyp
parents: 4023
diff changeset
   120
          print_object(gclog_or_tty, _containing_obj);
f78ef2531f44 6937142: G1: improvements to debugging output (S-M)
tonyp
parents: 4023
diff changeset
   121
          gclog_or_tty->print_cr("points to dead obj "PTR_FORMAT" in region "
f78ef2531f44 6937142: G1: improvements to debugging output (S-M)
tonyp
parents: 4023
diff changeset
   122
                                 "["PTR_FORMAT", "PTR_FORMAT")",
f78ef2531f44 6937142: G1: improvements to debugging output (S-M)
tonyp
parents: 4023
diff changeset
   123
                                 (void*) obj, to->bottom(), to->end());
f78ef2531f44 6937142: G1: improvements to debugging output (S-M)
tonyp
parents: 4023
diff changeset
   124
          print_object(gclog_or_tty, obj);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   125
        }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   126
        gclog_or_tty->print_cr("----------");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   127
        _failures = true;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   128
        failed = true;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   129
        _n_failures++;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   130
      }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   131
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   132
      if (!_g1h->full_collection()) {
3262
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
   133
        HeapRegion* from = _g1h->heap_region_containing((HeapWord*)p);
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
   134
        HeapRegion* to   = _g1h->heap_region_containing(obj);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   135
        if (from != NULL && to != NULL &&
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   136
            from != to &&
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   137
            !to->isHumongous()) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   138
          jbyte cv_obj = *_bs->byte_for_const(_containing_obj);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   139
          jbyte cv_field = *_bs->byte_for_const(p);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   140
          const jbyte dirty = CardTableModRefBS::dirty_card_val();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   141
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   142
          bool is_bad = !(from->is_young()
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   143
                          || to->rem_set()->contains_reference(p)
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   144
                          || !G1HRRSFlushLogBuffersOnVerify && // buffers were not flushed
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   145
                              (_containing_obj->is_objArray() ?
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   146
                                  cv_field == dirty
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   147
                               : cv_obj == dirty || cv_field == dirty));
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   148
          if (is_bad) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   149
            if (!_failures) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   150
              gclog_or_tty->print_cr("");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   151
              gclog_or_tty->print_cr("----------");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   152
            }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   153
            gclog_or_tty->print_cr("Missing rem set entry:");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   154
            gclog_or_tty->print_cr("Field "PTR_FORMAT
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   155
                          " of obj "PTR_FORMAT
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   156
                          ", in region %d ["PTR_FORMAT
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   157
                          ", "PTR_FORMAT"),",
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   158
                          p, (void*) _containing_obj,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   159
                          from->hrs_index(),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   160
                          from->bottom(),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   161
                          from->end());
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   162
            _containing_obj->print_on(gclog_or_tty);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   163
            gclog_or_tty->print_cr("points to obj "PTR_FORMAT
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   164
                          " in region %d ["PTR_FORMAT
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   165
                          ", "PTR_FORMAT").",
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   166
                          (void*) obj, to->hrs_index(),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   167
                          to->bottom(), to->end());
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   168
            obj->print_on(gclog_or_tty);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   169
            gclog_or_tty->print_cr("Obj head CTE = %d, field CTE = %d.",
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   170
                          cv_obj, cv_field);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   171
            gclog_or_tty->print_cr("----------");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   172
            _failures = true;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   173
            if (!failed) _n_failures++;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   174
          }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   175
        }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   176
      }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   177
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   178
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   179
};
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   180
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   181
template<class ClosureType>
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   182
HeapWord* walk_mem_region_loop(ClosureType* cl, G1CollectedHeap* g1h,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   183
                               HeapRegion* hr,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   184
                               HeapWord* cur, HeapWord* top) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   185
  oop cur_oop = oop(cur);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   186
  int oop_size = cur_oop->size();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   187
  HeapWord* next_obj = cur + oop_size;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   188
  while (next_obj < top) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   189
    // Keep filtering the remembered set.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   190
    if (!g1h->is_obj_dead(cur_oop, hr)) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   191
      // Bottom lies entirely below top, so we can call the
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   192
      // non-memRegion version of oop_iterate below.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   193
      cur_oop->oop_iterate(cl);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   194
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   195
    cur = next_obj;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   196
    cur_oop = oop(cur);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   197
    oop_size = cur_oop->size();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   198
    next_obj = cur + oop_size;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   199
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   200
  return cur;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   201
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   202
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   203
void HeapRegionDCTOC::walk_mem_region_with_cl(MemRegion mr,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   204
                                              HeapWord* bottom,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   205
                                              HeapWord* top,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   206
                                              OopClosure* cl) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   207
  G1CollectedHeap* g1h = _g1;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   208
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   209
  int oop_size;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   210
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   211
  OopClosure* cl2 = cl;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   212
  FilterIntoCSClosure intoCSFilt(this, g1h, cl);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   213
  FilterOutOfRegionClosure outOfRegionFilt(_hr, cl);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   214
  switch (_fk) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   215
  case IntoCSFilterKind:      cl2 = &intoCSFilt; break;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   216
  case OutOfRegionFilterKind: cl2 = &outOfRegionFilt; break;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   217
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   218
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   219
  // Start filtering what we add to the remembered set. If the object is
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   220
  // not considered dead, either because it is marked (in the mark bitmap)
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   221
  // or it was allocated after marking finished, then we add it. Otherwise
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   222
  // we can safely ignore the object.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   223
  if (!g1h->is_obj_dead(oop(bottom), _hr)) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   224
    oop_size = oop(bottom)->oop_iterate(cl2, mr);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   225
  } else {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   226
    oop_size = oop(bottom)->size();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   227
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   228
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   229
  bottom += oop_size;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   230
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   231
  if (bottom < top) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   232
    // We replicate the loop below for several kinds of possible filters.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   233
    switch (_fk) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   234
    case NoFilterKind:
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   235
      bottom = walk_mem_region_loop(cl, g1h, _hr, bottom, top);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   236
      break;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   237
    case IntoCSFilterKind: {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   238
      FilterIntoCSClosure filt(this, g1h, cl);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   239
      bottom = walk_mem_region_loop(&filt, g1h, _hr, bottom, top);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   240
      break;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   241
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   242
    case OutOfRegionFilterKind: {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   243
      FilterOutOfRegionClosure filt(_hr, cl);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   244
      bottom = walk_mem_region_loop(&filt, g1h, _hr, bottom, top);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   245
      break;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   246
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   247
    default:
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   248
      ShouldNotReachHere();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   249
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   250
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   251
    // Last object. Need to do dead-obj filtering here too.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   252
    if (!g1h->is_obj_dead(oop(bottom), _hr)) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   253
      oop(bottom)->oop_iterate(cl2, mr);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   254
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   255
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   256
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   257
3697
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3283
diff changeset
   258
// Minimum region size; we won't go lower than that.
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3283
diff changeset
   259
// We might want to decrease this in the future, to deal with small
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3283
diff changeset
   260
// heaps a bit more efficiently.
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3283
diff changeset
   261
#define MIN_REGION_SIZE  (      1024 * 1024 )
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3283
diff changeset
   262
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3283
diff changeset
   263
// Maximum region size; we don't go higher than that. There's a good
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3283
diff changeset
   264
// reason for having an upper bound. We don't want regions to get too
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3283
diff changeset
   265
// large, otherwise cleanup's effectiveness would decrease as there
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3283
diff changeset
   266
// will be fewer opportunities to find totally empty regions after
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3283
diff changeset
   267
// marking.
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3283
diff changeset
   268
#define MAX_REGION_SIZE  ( 32 * 1024 * 1024 )
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3283
diff changeset
   269
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3283
diff changeset
   270
// The automatic region size calculation will try to have around this
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3283
diff changeset
   271
// many regions in the heap (based on the min heap size).
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3283
diff changeset
   272
#define TARGET_REGION_NUMBER          2048
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3283
diff changeset
   273
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3283
diff changeset
   274
void HeapRegion::setup_heap_region_size(uintx min_heap_size) {
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3283
diff changeset
   275
  // region_size in bytes
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3283
diff changeset
   276
  uintx region_size = G1HeapRegionSize;
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3283
diff changeset
   277
  if (FLAG_IS_DEFAULT(G1HeapRegionSize)) {
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3283
diff changeset
   278
    // We base the automatic calculation on the min heap size. This
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3283
diff changeset
   279
    // can be problematic if the spread between min and max is quite
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3283
diff changeset
   280
    // wide, imagine -Xms128m -Xmx32g. But, if we decided it based on
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3283
diff changeset
   281
    // the max size, the region size might be way too large for the
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3283
diff changeset
   282
    // min size. Either way, some users might have to set the region
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3283
diff changeset
   283
    // size manually for some -Xms / -Xmx combos.
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3283
diff changeset
   284
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3283
diff changeset
   285
    region_size = MAX2(min_heap_size / TARGET_REGION_NUMBER,
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3283
diff changeset
   286
                       (uintx) MIN_REGION_SIZE);
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3283
diff changeset
   287
  }
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3283
diff changeset
   288
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3283
diff changeset
   289
  int region_size_log = log2_long((jlong) region_size);
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3283
diff changeset
   290
  // Recalculate the region size to make sure it's a power of
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3283
diff changeset
   291
  // 2. This means that region_size is the largest power of 2 that's
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3283
diff changeset
   292
  // <= what we've calculated so far.
5377
bcf55c5acf4e 6931180: Migration to recent versions of MS Platform SDK
prr
parents: 5350
diff changeset
   293
  region_size = ((uintx)1 << region_size_log);
3697
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3283
diff changeset
   294
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3283
diff changeset
   295
  // Now make sure that we don't go over or under our limits.
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3283
diff changeset
   296
  if (region_size < MIN_REGION_SIZE) {
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3283
diff changeset
   297
    region_size = MIN_REGION_SIZE;
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3283
diff changeset
   298
  } else if (region_size > MAX_REGION_SIZE) {
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3283
diff changeset
   299
    region_size = MAX_REGION_SIZE;
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3283
diff changeset
   300
  }
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3283
diff changeset
   301
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3283
diff changeset
   302
  // And recalculate the log.
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3283
diff changeset
   303
  region_size_log = log2_long((jlong) region_size);
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3283
diff changeset
   304
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3283
diff changeset
   305
  // Now, set up the globals.
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3283
diff changeset
   306
  guarantee(LogOfHRGrainBytes == 0, "we should only set it once");
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3283
diff changeset
   307
  LogOfHRGrainBytes = region_size_log;
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3283
diff changeset
   308
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3283
diff changeset
   309
  guarantee(LogOfHRGrainWords == 0, "we should only set it once");
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3283
diff changeset
   310
  LogOfHRGrainWords = LogOfHRGrainBytes - LogHeapWordSize;
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3283
diff changeset
   311
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3283
diff changeset
   312
  guarantee(GrainBytes == 0, "we should only set it once");
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3283
diff changeset
   313
  // The cast to int is safe, given that we've bounded region_size by
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3283
diff changeset
   314
  // MIN_REGION_SIZE and MAX_REGION_SIZE.
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3283
diff changeset
   315
  GrainBytes = (int) region_size;
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3283
diff changeset
   316
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3283
diff changeset
   317
  guarantee(GrainWords == 0, "we should only set it once");
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3283
diff changeset
   318
  GrainWords = GrainBytes >> LogHeapWordSize;
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3283
diff changeset
   319
  guarantee(1 << LogOfHRGrainWords == GrainWords, "sanity");
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3283
diff changeset
   320
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3283
diff changeset
   321
  guarantee(CardsPerRegion == 0, "we should only set it once");
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3283
diff changeset
   322
  CardsPerRegion = GrainBytes >> CardTableModRefBS::card_shift;
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3283
diff changeset
   323
}
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3283
diff changeset
   324
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   325
void HeapRegion::reset_after_compaction() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   326
  G1OffsetTableContigSpace::reset_after_compaction();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   327
  // After a compaction the mark bitmap is invalid, so we must
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   328
  // treat all objects as being inside the unmarked area.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   329
  zero_marked_bytes();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   330
  init_top_at_mark_start();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   331
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   332
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   333
DirtyCardToOopClosure*
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   334
HeapRegion::new_dcto_closure(OopClosure* cl,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   335
                             CardTableModRefBS::PrecisionStyle precision,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   336
                             HeapRegionDCTOC::FilterKind fk) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   337
  return new HeapRegionDCTOC(G1CollectedHeap::heap(),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   338
                             this, cl, precision, fk);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   339
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   340
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   341
void HeapRegion::hr_clear(bool par, bool clear_space) {
1387
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1385
diff changeset
   342
  _humongous_type = NotHumongous;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   343
  _humongous_start_region = NULL;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   344
  _in_collection_set = false;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   345
  _is_gc_alloc_region = false;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   346
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   347
  // Age stuff (if parallel, this will be done separately, since it needs
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   348
  // to be sequential).
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   349
  G1CollectedHeap* g1h = G1CollectedHeap::heap();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   350
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   351
  set_young_index_in_cset(-1);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   352
  uninstall_surv_rate_group();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   353
  set_young_type(NotYoung);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   354
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   355
  // In case it had been the start of a humongous sequence, reset its end.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   356
  set_end(_orig_end);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   357
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   358
  if (!par) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   359
    // If this is parallel, this will be done later.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   360
    HeapRegionRemSet* hrrs = rem_set();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   361
    if (hrrs != NULL) hrrs->clear();
1387
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1385
diff changeset
   362
    _claimed = InitialClaimValue;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   363
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   364
  zero_marked_bytes();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   365
  set_sort_index(-1);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   366
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   367
  _offsets.resize(HeapRegion::GrainWords);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   368
  init_top_at_mark_start();
1388
tonyp
parents: 1387
diff changeset
   369
  if (clear_space) clear(SpaceDecorator::Mangle);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   370
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   371
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   372
// <PREDICTION>
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   373
void HeapRegion::calc_gc_efficiency() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   374
  G1CollectedHeap* g1h = G1CollectedHeap::heap();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   375
  _gc_efficiency = (double) garbage_bytes() /
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   376
                            g1h->predict_region_elapsed_time_ms(this, false);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   377
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   378
// </PREDICTION>
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   379
6983
a8c50cedbce9 6991377: G1: race between concurrent refinement and humongous object allocation
tonyp
parents: 6260
diff changeset
   380
void HeapRegion::set_startsHumongous(HeapWord* new_end) {
a8c50cedbce9 6991377: G1: race between concurrent refinement and humongous object allocation
tonyp
parents: 6260
diff changeset
   381
  assert(end() == _orig_end,
a8c50cedbce9 6991377: G1: race between concurrent refinement and humongous object allocation
tonyp
parents: 6260
diff changeset
   382
         "Should be normal before the humongous object allocation");
a8c50cedbce9 6991377: G1: race between concurrent refinement and humongous object allocation
tonyp
parents: 6260
diff changeset
   383
  assert(top() == bottom(), "should be empty");
a8c50cedbce9 6991377: G1: race between concurrent refinement and humongous object allocation
tonyp
parents: 6260
diff changeset
   384
1387
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1385
diff changeset
   385
  _humongous_type = StartsHumongous;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   386
  _humongous_start_region = this;
6983
a8c50cedbce9 6991377: G1: race between concurrent refinement and humongous object allocation
tonyp
parents: 6260
diff changeset
   387
a8c50cedbce9 6991377: G1: race between concurrent refinement and humongous object allocation
tonyp
parents: 6260
diff changeset
   388
  set_end(new_end);
a8c50cedbce9 6991377: G1: race between concurrent refinement and humongous object allocation
tonyp
parents: 6260
diff changeset
   389
  _offsets.set_for_starts_humongous(new_end);
a8c50cedbce9 6991377: G1: race between concurrent refinement and humongous object allocation
tonyp
parents: 6260
diff changeset
   390
}
a8c50cedbce9 6991377: G1: race between concurrent refinement and humongous object allocation
tonyp
parents: 6260
diff changeset
   391
a8c50cedbce9 6991377: G1: race between concurrent refinement and humongous object allocation
tonyp
parents: 6260
diff changeset
   392
void HeapRegion::set_continuesHumongous(HeapRegion* start) {
a8c50cedbce9 6991377: G1: race between concurrent refinement and humongous object allocation
tonyp
parents: 6260
diff changeset
   393
  assert(end() == _orig_end,
a8c50cedbce9 6991377: G1: race between concurrent refinement and humongous object allocation
tonyp
parents: 6260
diff changeset
   394
         "Should be normal before the humongous object allocation");
a8c50cedbce9 6991377: G1: race between concurrent refinement and humongous object allocation
tonyp
parents: 6260
diff changeset
   395
  assert(top() == bottom(), "should be empty");
a8c50cedbce9 6991377: G1: race between concurrent refinement and humongous object allocation
tonyp
parents: 6260
diff changeset
   396
  assert(start->startsHumongous(), "pre-condition");
a8c50cedbce9 6991377: G1: race between concurrent refinement and humongous object allocation
tonyp
parents: 6260
diff changeset
   397
a8c50cedbce9 6991377: G1: race between concurrent refinement and humongous object allocation
tonyp
parents: 6260
diff changeset
   398
  _humongous_type = ContinuesHumongous;
a8c50cedbce9 6991377: G1: race between concurrent refinement and humongous object allocation
tonyp
parents: 6260
diff changeset
   399
  _humongous_start_region = start;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   400
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   401
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   402
bool HeapRegion::claimHeapRegion(jint claimValue) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   403
  jint current = _claimed;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   404
  if (current != claimValue) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   405
    jint res = Atomic::cmpxchg(claimValue, &_claimed, current);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   406
    if (res == current) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   407
      return true;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   408
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   409
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   410
  return false;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   411
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   412
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   413
HeapWord* HeapRegion::next_block_start_careful(HeapWord* addr) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   414
  HeapWord* low = addr;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   415
  HeapWord* high = end();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   416
  while (low < high) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   417
    size_t diff = pointer_delta(high, low);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   418
    // Must add one below to bias toward the high amount.  Otherwise, if
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   419
  // "high" were at the desired value, and "low" were one less, we
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   420
    // would not converge on "high".  This is not symmetric, because
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   421
    // we set "high" to a block start, which might be the right one,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   422
    // which we don't do for "low".
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   423
    HeapWord* middle = low + (diff+1)/2;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   424
    if (middle == high) return high;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   425
    HeapWord* mid_bs = block_start_careful(middle);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   426
    if (mid_bs < addr) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   427
      low = middle;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   428
    } else {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   429
      high = mid_bs;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   430
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   431
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   432
  assert(low == high && low >= addr, "Didn't work.");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   433
  return low;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   434
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   435
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   436
void HeapRegion::set_next_on_unclean_list(HeapRegion* r) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   437
  assert(r == NULL || r->is_on_unclean_list(), "Malformed unclean list.");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   438
  _next_in_special_set = r;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   439
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   440
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   441
void HeapRegion::set_on_unclean_list(bool b) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   442
  _is_on_unclean_list = b;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   443
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   444
1388
tonyp
parents: 1387
diff changeset
   445
void HeapRegion::initialize(MemRegion mr, bool clear_space, bool mangle_space) {
tonyp
parents: 1387
diff changeset
   446
  G1OffsetTableContigSpace::initialize(mr, false, mangle_space);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   447
  hr_clear(false/*par*/, clear_space);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   448
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   449
#ifdef _MSC_VER // the use of 'this' below gets a warning, make it go away
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   450
#pragma warning( disable:4355 ) // 'this' : used in base member initializer list
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   451
#endif // _MSC_VER
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   452
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   453
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   454
HeapRegion::
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   455
HeapRegion(G1BlockOffsetSharedArray* sharedOffsetArray,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   456
                     MemRegion mr, bool is_zeroed)
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   457
  : G1OffsetTableContigSpace(sharedOffsetArray, mr, is_zeroed),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   458
    _next_fk(HeapRegionDCTOC::NoFilterKind),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   459
    _hrs_index(-1),
1387
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1385
diff changeset
   460
    _humongous_type(NotHumongous), _humongous_start_region(NULL),
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   461
    _in_collection_set(false), _is_gc_alloc_region(false),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   462
    _is_on_free_list(false), _is_on_unclean_list(false),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   463
    _next_in_special_set(NULL), _orig_end(NULL),
1387
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1385
diff changeset
   464
    _claimed(InitialClaimValue), _evacuation_failed(false),
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   465
    _prev_marked_bytes(0), _next_marked_bytes(0), _sort_index(-1),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   466
    _young_type(NotYoung), _next_young_region(NULL),
2883
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2741
diff changeset
   467
    _next_dirty_cards_region(NULL),
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   468
    _young_index_in_cset(-1), _surv_rate_group(NULL), _age_index(-1),
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5344
diff changeset
   469
    _rem_set(NULL), _zfs(NotZeroFilled),
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5344
diff changeset
   470
    _recorded_rs_length(0), _predicted_elapsed_time_ms(0),
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5344
diff changeset
   471
    _predicted_bytes_to_copy(0)
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   472
{
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   473
  _orig_end = mr.end();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   474
  // Note that initialize() will set the start of the unmarked area of the
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   475
  // region.
1388
tonyp
parents: 1387
diff changeset
   476
  this->initialize(mr, !is_zeroed, SpaceDecorator::Mangle);
tonyp
parents: 1387
diff changeset
   477
  set_top(bottom());
tonyp
parents: 1387
diff changeset
   478
  set_saved_mark();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   479
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   480
  _rem_set =  new HeapRegionRemSet(sharedOffsetArray, this);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   481
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   482
  assert(HeapRegionRemSet::num_par_rem_sets() > 0, "Invariant.");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   483
  // In case the region is allocated during a pause, note the top.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   484
  // We haven't done any counting on a brand new region.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   485
  _top_at_conc_mark_count = bottom();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   486
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   487
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   488
class NextCompactionHeapRegionClosure: public HeapRegionClosure {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   489
  const HeapRegion* _target;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   490
  bool _target_seen;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   491
  HeapRegion* _last;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   492
  CompactibleSpace* _res;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   493
public:
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   494
  NextCompactionHeapRegionClosure(const HeapRegion* target) :
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   495
    _target(target), _target_seen(false), _res(NULL) {}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   496
  bool doHeapRegion(HeapRegion* cur) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   497
    if (_target_seen) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   498
      if (!cur->isHumongous()) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   499
        _res = cur;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   500
        return true;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   501
      }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   502
    } else if (cur == _target) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   503
      _target_seen = true;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   504
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   505
    return false;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   506
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   507
  CompactibleSpace* result() { return _res; }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   508
};
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   509
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   510
CompactibleSpace* HeapRegion::next_compaction_space() const {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   511
  G1CollectedHeap* g1h = G1CollectedHeap::heap();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   512
  // cast away const-ness
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   513
  HeapRegion* r = (HeapRegion*) this;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   514
  NextCompactionHeapRegionClosure blk(r);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   515
  g1h->heap_region_iterate_from(r, &blk);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   516
  return blk.result();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   517
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   518
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   519
void HeapRegion::save_marks() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   520
  set_saved_mark();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   521
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   522
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   523
void HeapRegion::oops_in_mr_iterate(MemRegion mr, OopClosure* cl) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   524
  HeapWord* p = mr.start();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   525
  HeapWord* e = mr.end();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   526
  oop obj;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   527
  while (p < e) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   528
    obj = oop(p);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   529
    p += obj->oop_iterate(cl);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   530
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   531
  assert(p == e, "bad memregion: doesn't end on obj boundary");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   532
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   533
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   534
#define HeapRegion_OOP_SINCE_SAVE_MARKS_DEFN(OopClosureType, nv_suffix) \
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   535
void HeapRegion::oop_since_save_marks_iterate##nv_suffix(OopClosureType* cl) { \
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   536
  ContiguousSpace::oop_since_save_marks_iterate##nv_suffix(cl);              \
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   537
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   538
SPECIALIZED_SINCE_SAVE_MARKS_CLOSURES(HeapRegion_OOP_SINCE_SAVE_MARKS_DEFN)
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   539
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   540
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   541
void HeapRegion::oop_before_save_marks_iterate(OopClosure* cl) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   542
  oops_in_mr_iterate(MemRegion(bottom(), saved_mark_word()), cl);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   543
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   544
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   545
#ifdef DEBUG
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   546
HeapWord* HeapRegion::allocate(size_t size) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   547
  jint state = zero_fill_state();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   548
  assert(!G1CollectedHeap::heap()->allocs_are_zero_filled() ||
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   549
         zero_fill_is_allocated(),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   550
         "When ZF is on, only alloc in ZF'd regions");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   551
  return G1OffsetTableContigSpace::allocate(size);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   552
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   553
#endif
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   554
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   555
void HeapRegion::set_zero_fill_state_work(ZeroFillState zfs) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   556
  assert(ZF_mon->owned_by_self() ||
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   557
         Universe::heap()->is_gc_active(),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   558
         "Must hold the lock or be a full GC to modify.");
5540
e8a688e539aa 6921317: (partial) G1: assert(top() == bottom() || zfs == Allocated,"Region must be empty, or we must be setting it to
apetrusenko
parents: 5350
diff changeset
   559
#ifdef ASSERT
e8a688e539aa 6921317: (partial) G1: assert(top() == bottom() || zfs == Allocated,"Region must be empty, or we must be setting it to
apetrusenko
parents: 5350
diff changeset
   560
  if (top() != bottom() && zfs != Allocated) {
e8a688e539aa 6921317: (partial) G1: assert(top() == bottom() || zfs == Allocated,"Region must be empty, or we must be setting it to
apetrusenko
parents: 5350
diff changeset
   561
    ResourceMark rm;
e8a688e539aa 6921317: (partial) G1: assert(top() == bottom() || zfs == Allocated,"Region must be empty, or we must be setting it to
apetrusenko
parents: 5350
diff changeset
   562
    stringStream region_str;
e8a688e539aa 6921317: (partial) G1: assert(top() == bottom() || zfs == Allocated,"Region must be empty, or we must be setting it to
apetrusenko
parents: 5350
diff changeset
   563
    print_on(&region_str);
e8a688e539aa 6921317: (partial) G1: assert(top() == bottom() || zfs == Allocated,"Region must be empty, or we must be setting it to
apetrusenko
parents: 5350
diff changeset
   564
    assert(top() == bottom() || zfs == Allocated,
e8a688e539aa 6921317: (partial) G1: assert(top() == bottom() || zfs == Allocated,"Region must be empty, or we must be setting it to
apetrusenko
parents: 5350
diff changeset
   565
           err_msg("Region must be empty, or we must be setting it to allocated. "
e8a688e539aa 6921317: (partial) G1: assert(top() == bottom() || zfs == Allocated,"Region must be empty, or we must be setting it to
apetrusenko
parents: 5350
diff changeset
   566
                   "_zfs=%d, zfs=%d, region: %s", _zfs, zfs, region_str.as_string()));
e8a688e539aa 6921317: (partial) G1: assert(top() == bottom() || zfs == Allocated,"Region must be empty, or we must be setting it to
apetrusenko
parents: 5350
diff changeset
   567
  }
e8a688e539aa 6921317: (partial) G1: assert(top() == bottom() || zfs == Allocated,"Region must be empty, or we must be setting it to
apetrusenko
parents: 5350
diff changeset
   568
#endif
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   569
  _zfs = zfs;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   570
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   571
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   572
void HeapRegion::set_zero_fill_complete() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   573
  set_zero_fill_state_work(ZeroFilled);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   574
  if (ZF_mon->owned_by_self()) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   575
    ZF_mon->notify_all();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   576
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   577
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   578
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   579
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   580
void HeapRegion::ensure_zero_filled() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   581
  MutexLockerEx x(ZF_mon, Mutex::_no_safepoint_check_flag);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   582
  ensure_zero_filled_locked();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   583
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   584
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   585
void HeapRegion::ensure_zero_filled_locked() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   586
  assert(ZF_mon->owned_by_self(), "Precondition");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   587
  bool should_ignore_zf = SafepointSynchronize::is_at_safepoint();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   588
  assert(should_ignore_zf || Heap_lock->is_locked(),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   589
         "Either we're in a GC or we're allocating a region.");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   590
  switch (zero_fill_state()) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   591
  case HeapRegion::NotZeroFilled:
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   592
    set_zero_fill_in_progress(Thread::current());
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   593
    {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   594
      ZF_mon->unlock();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   595
      Copy::fill_to_words(bottom(), capacity()/HeapWordSize);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   596
      ZF_mon->lock_without_safepoint_check();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   597
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   598
    // A trap.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   599
    guarantee(zero_fill_state() == HeapRegion::ZeroFilling
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   600
              && zero_filler() == Thread::current(),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   601
              "AHA!  Tell Dave D if you see this...");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   602
    set_zero_fill_complete();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   603
    // gclog_or_tty->print_cr("Did sync ZF.");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   604
    ConcurrentZFThread::note_sync_zfs();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   605
    break;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   606
  case HeapRegion::ZeroFilling:
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   607
    if (should_ignore_zf) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   608
      // We can "break" the lock and take over the work.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   609
      Copy::fill_to_words(bottom(), capacity()/HeapWordSize);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   610
      set_zero_fill_complete();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   611
      ConcurrentZFThread::note_sync_zfs();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   612
      break;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   613
    } else {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   614
      ConcurrentZFThread::wait_for_ZF_completed(this);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   615
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   616
  case HeapRegion::ZeroFilled:
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   617
    // Nothing to do.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   618
    break;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   619
  case HeapRegion::Allocated:
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   620
    guarantee(false, "Should not call on allocated regions.");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   621
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   622
  assert(zero_fill_state() == HeapRegion::ZeroFilled, "Post");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   623
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   624
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   625
HeapWord*
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   626
HeapRegion::object_iterate_mem_careful(MemRegion mr,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   627
                                                 ObjectClosure* cl) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   628
  G1CollectedHeap* g1h = G1CollectedHeap::heap();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   629
  // We used to use "block_start_careful" here.  But we're actually happy
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   630
  // to update the BOT while we do this...
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   631
  HeapWord* cur = block_start(mr.start());
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   632
  mr = mr.intersection(used_region());
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   633
  if (mr.is_empty()) return NULL;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   634
  // Otherwise, find the obj that extends onto mr.start().
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   635
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   636
  assert(cur <= mr.start()
3262
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
   637
         && (oop(cur)->klass_or_null() == NULL ||
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   638
             cur + oop(cur)->size() > mr.start()),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   639
         "postcondition of block_start");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   640
  oop obj;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   641
  while (cur < mr.end()) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   642
    obj = oop(cur);
3262
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
   643
    if (obj->klass_or_null() == NULL) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   644
      // Ran into an unparseable point.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   645
      return cur;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   646
    } else if (!g1h->is_obj_dead(obj)) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   647
      cl->do_object(obj);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   648
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   649
    if (cl->abort()) return cur;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   650
    // The check above must occur before the operation below, since an
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   651
    // abort might invalidate the "size" operation.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   652
    cur += obj->size();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   653
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   654
  return NULL;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   655
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   656
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   657
HeapWord*
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   658
HeapRegion::
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   659
oops_on_card_seq_iterate_careful(MemRegion mr,
6068
80ef41e75a2d 6956639: G1: assert(cached_ptr != card_ptr) failed: shouldn't be, concurrentG1Refine.cpp:307
johnc
parents: 5547
diff changeset
   660
                                 FilterOutOfRegionClosure* cl,
80ef41e75a2d 6956639: G1: assert(cached_ptr != card_ptr) failed: shouldn't be, concurrentG1Refine.cpp:307
johnc
parents: 5547
diff changeset
   661
                                 bool filter_young) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   662
  G1CollectedHeap* g1h = G1CollectedHeap::heap();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   663
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   664
  // If we're within a stop-world GC, then we might look at a card in a
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   665
  // GC alloc region that extends onto a GC LAB, which may not be
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   666
  // parseable.  Stop such at the "saved_mark" of the region.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   667
  if (G1CollectedHeap::heap()->is_gc_active()) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   668
    mr = mr.intersection(used_region_at_save_marks());
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   669
  } else {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   670
    mr = mr.intersection(used_region());
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   671
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   672
  if (mr.is_empty()) return NULL;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   673
  // Otherwise, find the obj that extends onto mr.start().
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   674
6068
80ef41e75a2d 6956639: G1: assert(cached_ptr != card_ptr) failed: shouldn't be, concurrentG1Refine.cpp:307
johnc
parents: 5547
diff changeset
   675
  // The intersection of the incoming mr (for the card) and the
80ef41e75a2d 6956639: G1: assert(cached_ptr != card_ptr) failed: shouldn't be, concurrentG1Refine.cpp:307
johnc
parents: 5547
diff changeset
   676
  // allocated part of the region is non-empty. This implies that
80ef41e75a2d 6956639: G1: assert(cached_ptr != card_ptr) failed: shouldn't be, concurrentG1Refine.cpp:307
johnc
parents: 5547
diff changeset
   677
  // we have actually allocated into this region. The code in
80ef41e75a2d 6956639: G1: assert(cached_ptr != card_ptr) failed: shouldn't be, concurrentG1Refine.cpp:307
johnc
parents: 5547
diff changeset
   678
  // G1CollectedHeap.cpp that allocates a new region sets the
80ef41e75a2d 6956639: G1: assert(cached_ptr != card_ptr) failed: shouldn't be, concurrentG1Refine.cpp:307
johnc
parents: 5547
diff changeset
   679
  // is_young tag on the region before allocating. Thus we
80ef41e75a2d 6956639: G1: assert(cached_ptr != card_ptr) failed: shouldn't be, concurrentG1Refine.cpp:307
johnc
parents: 5547
diff changeset
   680
  // safely know if this region is young.
80ef41e75a2d 6956639: G1: assert(cached_ptr != card_ptr) failed: shouldn't be, concurrentG1Refine.cpp:307
johnc
parents: 5547
diff changeset
   681
  if (is_young() && filter_young) {
80ef41e75a2d 6956639: G1: assert(cached_ptr != card_ptr) failed: shouldn't be, concurrentG1Refine.cpp:307
johnc
parents: 5547
diff changeset
   682
    return NULL;
80ef41e75a2d 6956639: G1: assert(cached_ptr != card_ptr) failed: shouldn't be, concurrentG1Refine.cpp:307
johnc
parents: 5547
diff changeset
   683
  }
80ef41e75a2d 6956639: G1: assert(cached_ptr != card_ptr) failed: shouldn't be, concurrentG1Refine.cpp:307
johnc
parents: 5547
diff changeset
   684
6247
00e5cc407d03 6814437: G1: remove the _new_refs array
johnc
parents: 6068
diff changeset
   685
  assert(!is_young(), "check value of filter_young");
00e5cc407d03 6814437: G1: remove the _new_refs array
johnc
parents: 6068
diff changeset
   686
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   687
  // We used to use "block_start_careful" here.  But we're actually happy
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   688
  // to update the BOT while we do this...
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   689
  HeapWord* cur = block_start(mr.start());
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   690
  assert(cur <= mr.start(), "Postcondition");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   691
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   692
  while (cur <= mr.start()) {
3262
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
   693
    if (oop(cur)->klass_or_null() == NULL) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   694
      // Ran into an unparseable point.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   695
      return cur;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   696
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   697
    // Otherwise...
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   698
    int sz = oop(cur)->size();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   699
    if (cur + sz > mr.start()) break;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   700
    // Otherwise, go on.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   701
    cur = cur + sz;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   702
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   703
  oop obj;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   704
  obj = oop(cur);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   705
  // If we finish this loop...
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   706
  assert(cur <= mr.start()
3262
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
   707
         && obj->klass_or_null() != NULL
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   708
         && cur + obj->size() > mr.start(),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   709
         "Loop postcondition");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   710
  if (!g1h->is_obj_dead(obj)) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   711
    obj->oop_iterate(cl, mr);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   712
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   713
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   714
  HeapWord* next;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   715
  while (cur < mr.end()) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   716
    obj = oop(cur);
3262
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
   717
    if (obj->klass_or_null() == NULL) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   718
      // Ran into an unparseable point.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   719
      return cur;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   720
    };
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   721
    // Otherwise:
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   722
    next = (cur + obj->size());
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   723
    if (!g1h->is_obj_dead(obj)) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   724
      if (next < mr.end()) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   725
        obj->oop_iterate(cl);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   726
      } else {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   727
        // this obj spans the boundary.  If it's an array, stop at the
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   728
        // boundary.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   729
        if (obj->is_objArray()) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   730
          obj->oop_iterate(cl, mr);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   731
        } else {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   732
          obj->oop_iterate(cl);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   733
        }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   734
      }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   735
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   736
    cur = next;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   737
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   738
  return NULL;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   739
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   740
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   741
void HeapRegion::print() const { print_on(gclog_or_tty); }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   742
void HeapRegion::print_on(outputStream* st) const {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   743
  if (isHumongous()) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   744
    if (startsHumongous())
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   745
      st->print(" HS");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   746
    else
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   747
      st->print(" HC");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   748
  } else {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   749
    st->print("   ");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   750
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   751
  if (in_collection_set())
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   752
    st->print(" CS");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   753
  else if (is_gc_alloc_region())
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   754
    st->print(" A ");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   755
  else
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   756
    st->print("   ");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   757
  if (is_young())
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5344
diff changeset
   758
    st->print(is_survivor() ? " SU" : " Y ");
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   759
  else
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   760
    st->print("   ");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   761
  if (is_empty())
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   762
    st->print(" F");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   763
  else
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   764
    st->print("  ");
4023
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 3697
diff changeset
   765
  st->print(" %5d", _gc_time_stamp);
5344
f78ef2531f44 6937142: G1: improvements to debugging output (S-M)
tonyp
parents: 4023
diff changeset
   766
  st->print(" PTAMS "PTR_FORMAT" NTAMS "PTR_FORMAT,
f78ef2531f44 6937142: G1: improvements to debugging output (S-M)
tonyp
parents: 4023
diff changeset
   767
            prev_top_at_mark_start(), next_top_at_mark_start());
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   768
  G1OffsetTableContigSpace::print_on(st);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   769
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   770
3000
bbce6052b595 6850846: G1: extend G1 marking verification
tonyp
parents: 2883
diff changeset
   771
void HeapRegion::verify(bool allow_dirty) const {
4023
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 3697
diff changeset
   772
  bool dummy = false;
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 3697
diff changeset
   773
  verify(allow_dirty, /* use_prev_marking */ true, /* failures */ &dummy);
3000
bbce6052b595 6850846: G1: extend G1 marking verification
tonyp
parents: 2883
diff changeset
   774
}
bbce6052b595 6850846: G1: extend G1 marking verification
tonyp
parents: 2883
diff changeset
   775
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   776
#define OBJ_SAMPLE_INTERVAL 0
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   777
#define BLOCK_SAMPLE_INTERVAL 100
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   778
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   779
// This really ought to be commoned up into OffsetTableContigSpace somehow.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   780
// We would need a mechanism to make that code skip dead objects.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   781
4023
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 3697
diff changeset
   782
void HeapRegion::verify(bool allow_dirty,
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 3697
diff changeset
   783
                        bool use_prev_marking,
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 3697
diff changeset
   784
                        bool* failures) const {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   785
  G1CollectedHeap* g1 = G1CollectedHeap::heap();
4023
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 3697
diff changeset
   786
  *failures = false;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   787
  HeapWord* p = bottom();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   788
  HeapWord* prev_p = NULL;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   789
  int objs = 0;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   790
  int blocks = 0;
3000
bbce6052b595 6850846: G1: extend G1 marking verification
tonyp
parents: 2883
diff changeset
   791
  VerifyLiveClosure vl_cl(g1, use_prev_marking);
6260
fba83fd3adc7 6974928: G1: sometimes humongous objects are allocated in young regions
tonyp
parents: 6247
diff changeset
   792
  bool is_humongous = isHumongous();
fba83fd3adc7 6974928: G1: sometimes humongous objects are allocated in young regions
tonyp
parents: 6247
diff changeset
   793
  size_t object_num = 0;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   794
  while (p < top()) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   795
    size_t size = oop(p)->size();
6260
fba83fd3adc7 6974928: G1: sometimes humongous objects are allocated in young regions
tonyp
parents: 6247
diff changeset
   796
    if (is_humongous != g1->isHumongous(size)) {
fba83fd3adc7 6974928: G1: sometimes humongous objects are allocated in young regions
tonyp
parents: 6247
diff changeset
   797
      gclog_or_tty->print_cr("obj "PTR_FORMAT" is of %shumongous size ("
fba83fd3adc7 6974928: G1: sometimes humongous objects are allocated in young regions
tonyp
parents: 6247
diff changeset
   798
                             SIZE_FORMAT" words) in a %shumongous region",
fba83fd3adc7 6974928: G1: sometimes humongous objects are allocated in young regions
tonyp
parents: 6247
diff changeset
   799
                             p, g1->isHumongous(size) ? "" : "non-",
fba83fd3adc7 6974928: G1: sometimes humongous objects are allocated in young regions
tonyp
parents: 6247
diff changeset
   800
                             size, is_humongous ? "" : "non-");
fba83fd3adc7 6974928: G1: sometimes humongous objects are allocated in young regions
tonyp
parents: 6247
diff changeset
   801
       *failures = true;
fba83fd3adc7 6974928: G1: sometimes humongous objects are allocated in young regions
tonyp
parents: 6247
diff changeset
   802
    }
fba83fd3adc7 6974928: G1: sometimes humongous objects are allocated in young regions
tonyp
parents: 6247
diff changeset
   803
    object_num += 1;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   804
    if (blocks == BLOCK_SAMPLE_INTERVAL) {
4023
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 3697
diff changeset
   805
      HeapWord* res = block_start_const(p + (size/2));
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 3697
diff changeset
   806
      if (p != res) {
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 3697
diff changeset
   807
        gclog_or_tty->print_cr("offset computation 1 for "PTR_FORMAT" and "
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 3697
diff changeset
   808
                               SIZE_FORMAT" returned "PTR_FORMAT,
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 3697
diff changeset
   809
                               p, size, res);
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 3697
diff changeset
   810
        *failures = true;
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 3697
diff changeset
   811
        return;
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 3697
diff changeset
   812
      }
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   813
      blocks = 0;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   814
    } else {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   815
      blocks++;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   816
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   817
    if (objs == OBJ_SAMPLE_INTERVAL) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   818
      oop obj = oop(p);
3000
bbce6052b595 6850846: G1: extend G1 marking verification
tonyp
parents: 2883
diff changeset
   819
      if (!g1->is_obj_dead_cond(obj, this, use_prev_marking)) {
4023
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 3697
diff changeset
   820
        if (obj->is_oop()) {
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 3697
diff changeset
   821
          klassOop klass = obj->klass();
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 3697
diff changeset
   822
          if (!klass->is_perm()) {
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 3697
diff changeset
   823
            gclog_or_tty->print_cr("klass "PTR_FORMAT" of object "PTR_FORMAT" "
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 3697
diff changeset
   824
                                   "not in perm", klass, obj);
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 3697
diff changeset
   825
            *failures = true;
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 3697
diff changeset
   826
            return;
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 3697
diff changeset
   827
          } else if (!klass->is_klass()) {
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 3697
diff changeset
   828
            gclog_or_tty->print_cr("klass "PTR_FORMAT" of object "PTR_FORMAT" "
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 3697
diff changeset
   829
                                   "not a klass", klass, obj);
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 3697
diff changeset
   830
            *failures = true;
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 3697
diff changeset
   831
            return;
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 3697
diff changeset
   832
          } else {
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 3697
diff changeset
   833
            vl_cl.set_containing_obj(obj);
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 3697
diff changeset
   834
            obj->oop_iterate(&vl_cl);
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 3697
diff changeset
   835
            if (vl_cl.failures()) {
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 3697
diff changeset
   836
              *failures = true;
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 3697
diff changeset
   837
            }
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 3697
diff changeset
   838
            if (G1MaxVerifyFailures >= 0 &&
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 3697
diff changeset
   839
                vl_cl.n_failures() >= G1MaxVerifyFailures) {
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 3697
diff changeset
   840
              return;
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 3697
diff changeset
   841
            }
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 3697
diff changeset
   842
          }
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 3697
diff changeset
   843
        } else {
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 3697
diff changeset
   844
          gclog_or_tty->print_cr(PTR_FORMAT" no an oop", obj);
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 3697
diff changeset
   845
          *failures = true;
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 3697
diff changeset
   846
          return;
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 3697
diff changeset
   847
        }
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   848
      }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   849
      objs = 0;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   850
    } else {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   851
      objs++;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   852
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   853
    prev_p = p;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   854
    p += size;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   855
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   856
  HeapWord* rend = end();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   857
  HeapWord* rtop = top();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   858
  if (rtop < rend) {
4023
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 3697
diff changeset
   859
    HeapWord* res = block_start_const(rtop + (rend - rtop) / 2);
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 3697
diff changeset
   860
    if (res != rtop) {
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 3697
diff changeset
   861
        gclog_or_tty->print_cr("offset computation 2 for "PTR_FORMAT" and "
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 3697
diff changeset
   862
                               PTR_FORMAT" returned "PTR_FORMAT,
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 3697
diff changeset
   863
                               rtop, rend, res);
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 3697
diff changeset
   864
        *failures = true;
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 3697
diff changeset
   865
        return;
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 3697
diff changeset
   866
    }
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   867
  }
4023
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 3697
diff changeset
   868
6260
fba83fd3adc7 6974928: G1: sometimes humongous objects are allocated in young regions
tonyp
parents: 6247
diff changeset
   869
  if (is_humongous && object_num > 1) {
fba83fd3adc7 6974928: G1: sometimes humongous objects are allocated in young regions
tonyp
parents: 6247
diff changeset
   870
    gclog_or_tty->print_cr("region ["PTR_FORMAT","PTR_FORMAT"] is humongous "
fba83fd3adc7 6974928: G1: sometimes humongous objects are allocated in young regions
tonyp
parents: 6247
diff changeset
   871
                           "but has "SIZE_FORMAT", objects",
fba83fd3adc7 6974928: G1: sometimes humongous objects are allocated in young regions
tonyp
parents: 6247
diff changeset
   872
                           bottom(), end(), object_num);
fba83fd3adc7 6974928: G1: sometimes humongous objects are allocated in young regions
tonyp
parents: 6247
diff changeset
   873
    *failures = true;
fba83fd3adc7 6974928: G1: sometimes humongous objects are allocated in young regions
tonyp
parents: 6247
diff changeset
   874
  }
fba83fd3adc7 6974928: G1: sometimes humongous objects are allocated in young regions
tonyp
parents: 6247
diff changeset
   875
4023
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 3697
diff changeset
   876
  if (p != top()) {
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 3697
diff changeset
   877
    gclog_or_tty->print_cr("end of last object "PTR_FORMAT" "
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 3697
diff changeset
   878
                           "does not match top "PTR_FORMAT, p, top());
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 3697
diff changeset
   879
    *failures = true;
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 3697
diff changeset
   880
    return;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   881
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   882
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   883
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   884
// G1OffsetTableContigSpace code; copied from space.cpp.  Hope this can go
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   885
// away eventually.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   886
1388
tonyp
parents: 1387
diff changeset
   887
void G1OffsetTableContigSpace::initialize(MemRegion mr, bool clear_space, bool mangle_space) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   888
  // false ==> we'll do the clearing if there's clearing to be done.
1388
tonyp
parents: 1387
diff changeset
   889
  ContiguousSpace::initialize(mr, false, mangle_space);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   890
  _offsets.zero_bottom_entry();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   891
  _offsets.initialize_threshold();
1388
tonyp
parents: 1387
diff changeset
   892
  if (clear_space) clear(mangle_space);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   893
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   894
1388
tonyp
parents: 1387
diff changeset
   895
void G1OffsetTableContigSpace::clear(bool mangle_space) {
tonyp
parents: 1387
diff changeset
   896
  ContiguousSpace::clear(mangle_space);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   897
  _offsets.zero_bottom_entry();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   898
  _offsets.initialize_threshold();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   899
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   900
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   901
void G1OffsetTableContigSpace::set_bottom(HeapWord* new_bottom) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   902
  Space::set_bottom(new_bottom);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   903
  _offsets.set_bottom(new_bottom);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   904
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   905
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   906
void G1OffsetTableContigSpace::set_end(HeapWord* new_end) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   907
  Space::set_end(new_end);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   908
  _offsets.resize(new_end - bottom());
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   909
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   910
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   911
void G1OffsetTableContigSpace::print() const {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   912
  print_short();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   913
  gclog_or_tty->print_cr(" [" INTPTR_FORMAT ", " INTPTR_FORMAT ", "
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   914
                INTPTR_FORMAT ", " INTPTR_FORMAT ")",
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   915
                bottom(), top(), _offsets.threshold(), end());
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   916
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   917
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   918
HeapWord* G1OffsetTableContigSpace::initialize_threshold() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   919
  return _offsets.initialize_threshold();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   920
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   921
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   922
HeapWord* G1OffsetTableContigSpace::cross_threshold(HeapWord* start,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   923
                                                    HeapWord* end) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   924
  _offsets.alloc_block(start, end);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   925
  return _offsets.threshold();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   926
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   927
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   928
HeapWord* G1OffsetTableContigSpace::saved_mark_word() const {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   929
  G1CollectedHeap* g1h = G1CollectedHeap::heap();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   930
  assert( _gc_time_stamp <= g1h->get_gc_time_stamp(), "invariant" );
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   931
  if (_gc_time_stamp < g1h->get_gc_time_stamp())
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   932
    return top();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   933
  else
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   934
    return ContiguousSpace::saved_mark_word();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   935
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   936
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   937
void G1OffsetTableContigSpace::set_saved_mark() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   938
  G1CollectedHeap* g1h = G1CollectedHeap::heap();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   939
  unsigned curr_gc_time_stamp = g1h->get_gc_time_stamp();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   940
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   941
  if (_gc_time_stamp < curr_gc_time_stamp) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   942
    // The order of these is important, as another thread might be
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   943
    // about to start scanning this region. If it does so after
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   944
    // set_saved_mark and before _gc_time_stamp = ..., then the latter
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   945
    // will be false, and it will pick up top() as the high water mark
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   946
    // of region. If it does so after _gc_time_stamp = ..., then it
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   947
    // will pick up the right saved_mark_word() as the high water mark
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   948
    // of the region. Either way, the behaviour will be correct.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   949
    ContiguousSpace::set_saved_mark();
3262
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
   950
    OrderAccess::storestore();
1385
1751733b089b 6723570: G1: assertion failure: p == current_top or oop(p)->is_oop(),"p is not a block start" (revisited!)
iveresov
parents: 1374
diff changeset
   951
    _gc_time_stamp = curr_gc_time_stamp;
3262
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
   952
    // The following fence is to force a flush of the writes above, but
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
   953
    // is strictly not needed because when an allocating worker thread
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
   954
    // calls set_saved_mark() it does so under the ParGCRareEvent_lock;
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
   955
    // when the lock is released, the write will be flushed.
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
   956
    // OrderAccess::fence();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   957
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   958
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   959
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   960
G1OffsetTableContigSpace::
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   961
G1OffsetTableContigSpace(G1BlockOffsetSharedArray* sharedOffsetArray,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   962
                         MemRegion mr, bool is_zeroed) :
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   963
  _offsets(sharedOffsetArray, mr),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   964
  _par_alloc_lock(Mutex::leaf, "OffsetTableContigSpace par alloc lock", true),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   965
  _gc_time_stamp(0)
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   966
{
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   967
  _offsets.set_space(this);
1388
tonyp
parents: 1387
diff changeset
   968
  initialize(mr, !is_zeroed, SpaceDecorator::Mangle);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   969
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   970
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   971
size_t RegionList::length() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   972
  size_t len = 0;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   973
  HeapRegion* cur = hd();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   974
  DEBUG_ONLY(HeapRegion* last = NULL);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   975
  while (cur != NULL) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   976
    len++;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   977
    DEBUG_ONLY(last = cur);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   978
    cur = get_next(cur);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   979
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   980
  assert(last == tl(), "Invariant");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   981
  return len;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   982
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   983
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   984
void RegionList::insert_before_head(HeapRegion* r) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   985
  assert(well_formed(), "Inv");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   986
  set_next(r, hd());
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   987
  _hd = r;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   988
  _sz++;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   989
  if (tl() == NULL) _tl = r;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   990
  assert(well_formed(), "Inv");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   991
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   992
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   993
void RegionList::prepend_list(RegionList* new_list) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   994
  assert(well_formed(), "Precondition");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   995
  assert(new_list->well_formed(), "Precondition");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   996
  HeapRegion* new_tl = new_list->tl();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   997
  if (new_tl != NULL) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   998
    set_next(new_tl, hd());
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   999
    _hd = new_list->hd();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1000
    _sz += new_list->sz();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1001
    if (tl() == NULL) _tl = new_list->tl();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1002
  } else {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1003
    assert(new_list->hd() == NULL && new_list->sz() == 0, "Inv");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1004
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1005
  assert(well_formed(), "Inv");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1006
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1007
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1008
void RegionList::delete_after(HeapRegion* r) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1009
  assert(well_formed(), "Precondition");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1010
  HeapRegion* next = get_next(r);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1011
  assert(r != NULL, "Precondition");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1012
  HeapRegion* next_tl = get_next(next);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1013
  set_next(r, next_tl);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1014
  dec_sz();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1015
  if (next == tl()) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1016
    assert(next_tl == NULL, "Inv");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1017
    _tl = r;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1018
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1019
  assert(well_formed(), "Inv");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1020
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1021
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1022
HeapRegion* RegionList::pop() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1023
  assert(well_formed(), "Inv");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1024
  HeapRegion* res = hd();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1025
  if (res != NULL) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1026
    _hd = get_next(res);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1027
    _sz--;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1028
    set_next(res, NULL);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1029
    if (sz() == 0) _tl = NULL;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1030
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1031
  assert(well_formed(), "Inv");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1032
  return res;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1033
}