hotspot/src/share/vm/gc_implementation/g1/heapRegion.cpp
author tonyp
Wed, 15 Feb 2012 13:06:53 -0500
changeset 11756 28b6fe22e43d
parent 11586 ccc217c177ee
child 12379 2cf45b79ce3a
permissions -rw-r--r--
7132029: G1: mixed GC phase lasts for longer than it should Summary: Revamp of the mechanism that chooses old regions for inclusion in the CSet. It simplifies the code and introduces min and max bounds on the number of old regions added to the CSet at each mixed GC to avoid pathological cases. It also ensures that when we do a mixed GC we'll always find old regions to add to the CSet (i.e., it eliminates the case where a mixed GC will collect no old regions which can happen today). Reviewed-by: johnc, brutisso
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
/*
11455
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11393
diff changeset
     2
 * Copyright (c) 2001, 2012, 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
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6983
diff changeset
    25
#include "precompiled.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6983
diff changeset
    26
#include "gc_implementation/g1/g1BlockOffsetTable.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6983
diff changeset
    27
#include "gc_implementation/g1/g1CollectedHeap.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6983
diff changeset
    28
#include "gc_implementation/g1/g1OopClosures.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6983
diff changeset
    29
#include "gc_implementation/g1/heapRegion.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6983
diff changeset
    30
#include "gc_implementation/g1/heapRegionRemSet.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6983
diff changeset
    31
#include "gc_implementation/g1/heapRegionSeq.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6983
diff changeset
    32
#include "memory/genOopClosures.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6983
diff changeset
    33
#include "memory/iterator.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6983
diff changeset
    34
#include "oops/oop.inline.hpp"
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    35
10677
370a8da2d63f 7095194: G1: HeapRegion::GrainBytes, GrainWords, and CardsPerRegion should be size_t
johnc
parents: 10674
diff changeset
    36
int    HeapRegion::LogOfHRGrainBytes = 0;
370a8da2d63f 7095194: G1: HeapRegion::GrainBytes, GrainWords, and CardsPerRegion should be size_t
johnc
parents: 10674
diff changeset
    37
int    HeapRegion::LogOfHRGrainWords = 0;
370a8da2d63f 7095194: G1: HeapRegion::GrainBytes, GrainWords, and CardsPerRegion should be size_t
johnc
parents: 10674
diff changeset
    38
size_t HeapRegion::GrainBytes        = 0;
370a8da2d63f 7095194: G1: HeapRegion::GrainBytes, GrainWords, and CardsPerRegion should be size_t
johnc
parents: 10674
diff changeset
    39
size_t HeapRegion::GrainWords        = 0;
370a8da2d63f 7095194: G1: HeapRegion::GrainBytes, GrainWords, and CardsPerRegion should be size_t
johnc
parents: 10674
diff changeset
    40
size_t HeapRegion::CardsPerRegion    = 0;
3697
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3283
diff changeset
    41
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    42
HeapRegionDCTOC::HeapRegionDCTOC(G1CollectedHeap* g1,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    43
                                 HeapRegion* hr, OopClosure* cl,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    44
                                 CardTableModRefBS::PrecisionStyle precision,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    45
                                 FilterKind fk) :
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    46
  ContiguousSpaceDCTOC(hr, cl, precision, NULL),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    47
  _hr(hr), _fk(fk), _g1(g1)
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10669
diff changeset
    48
{ }
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    49
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    50
FilterOutOfRegionClosure::FilterOutOfRegionClosure(HeapRegion* r,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    51
                                                   OopClosure* oc) :
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    52
  _r_bottom(r->bottom()), _r_end(r->end()),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    53
  _oc(oc), _out_of_region(0)
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    54
{}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    55
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    56
class VerifyLiveClosure: public OopClosure {
3000
bbce6052b595 6850846: G1: extend G1 marking verification
tonyp
parents: 2883
diff changeset
    57
private:
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    58
  G1CollectedHeap* _g1h;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    59
  CardTableModRefBS* _bs;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    60
  oop _containing_obj;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    61
  bool _failures;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    62
  int _n_failures;
9995
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
    63
  VerifyOption _vo;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    64
public:
9995
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
    65
  // _vo == UsePrevMarking -> use "prev" marking information,
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
    66
  // _vo == UseNextMarking -> use "next" marking information,
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
    67
  // _vo == UseMarkWord    -> use mark word from object header.
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
    68
  VerifyLiveClosure(G1CollectedHeap* g1h, VerifyOption vo) :
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    69
    _g1h(g1h), _bs(NULL), _containing_obj(NULL),
9995
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
    70
    _failures(false), _n_failures(0), _vo(vo)
1374
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
    BarrierSet* bs = _g1h->barrier_set();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    73
    if (bs->is_a(BarrierSet::CardTableModRef))
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    74
      _bs = (CardTableModRefBS*)bs;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    75
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    76
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    77
  void set_containing_obj(oop obj) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    78
    _containing_obj = obj;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    79
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    80
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    81
  bool failures() { return _failures; }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    82
  int n_failures() { return _n_failures; }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    83
3262
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
    84
  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
    85
  virtual void do_oop(      oop* p) { do_oop_work(p); }
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    86
5344
f78ef2531f44 6937142: G1: improvements to debugging output (S-M)
tonyp
parents: 4023
diff changeset
    87
  void print_object(outputStream* out, oop obj) {
f78ef2531f44 6937142: G1: improvements to debugging output (S-M)
tonyp
parents: 4023
diff changeset
    88
#ifdef PRODUCT
f78ef2531f44 6937142: G1: improvements to debugging output (S-M)
tonyp
parents: 4023
diff changeset
    89
    klassOop k = obj->klass();
f78ef2531f44 6937142: G1: improvements to debugging output (S-M)
tonyp
parents: 4023
diff changeset
    90
    const char* class_name = instanceKlass::cast(k)->external_name();
f78ef2531f44 6937142: G1: improvements to debugging output (S-M)
tonyp
parents: 4023
diff changeset
    91
    out->print_cr("class name %s", class_name);
f78ef2531f44 6937142: G1: improvements to debugging output (S-M)
tonyp
parents: 4023
diff changeset
    92
#else // PRODUCT
f78ef2531f44 6937142: G1: improvements to debugging output (S-M)
tonyp
parents: 4023
diff changeset
    93
    obj->print_on(out);
f78ef2531f44 6937142: G1: improvements to debugging output (S-M)
tonyp
parents: 4023
diff changeset
    94
#endif // PRODUCT
f78ef2531f44 6937142: G1: improvements to debugging output (S-M)
tonyp
parents: 4023
diff changeset
    95
  }
f78ef2531f44 6937142: G1: improvements to debugging output (S-M)
tonyp
parents: 4023
diff changeset
    96
11393
68bcbca24f4e 7123165: G1: output during parallel verification can get messed up
tonyp
parents: 10997
diff changeset
    97
  template <class T>
68bcbca24f4e 7123165: G1: output during parallel verification can get messed up
tonyp
parents: 10997
diff changeset
    98
  void do_oop_work(T* p) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    99
    assert(_containing_obj != NULL, "Precondition");
9995
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
   100
    assert(!_g1h->is_obj_dead_cond(_containing_obj, _vo),
3000
bbce6052b595 6850846: G1: extend G1 marking verification
tonyp
parents: 2883
diff changeset
   101
           "Precondition");
3262
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
   102
    T heap_oop = oopDesc::load_heap_oop(p);
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
   103
    if (!oopDesc::is_null(heap_oop)) {
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
   104
      oop obj = oopDesc::decode_heap_oop_not_null(heap_oop);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   105
      bool failed = false;
11393
68bcbca24f4e 7123165: G1: output during parallel verification can get messed up
tonyp
parents: 10997
diff changeset
   106
      if (!_g1h->is_in_closed_subset(obj) || _g1h->is_obj_dead_cond(obj, _vo)) {
68bcbca24f4e 7123165: G1: output during parallel verification can get messed up
tonyp
parents: 10997
diff changeset
   107
        MutexLockerEx x(ParGCRareEvent_lock,
68bcbca24f4e 7123165: G1: output during parallel verification can get messed up
tonyp
parents: 10997
diff changeset
   108
                        Mutex::_no_safepoint_check_flag);
68bcbca24f4e 7123165: G1: output during parallel verification can get messed up
tonyp
parents: 10997
diff changeset
   109
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   110
        if (!_failures) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   111
          gclog_or_tty->print_cr("");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   112
          gclog_or_tty->print_cr("----------");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   113
        }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   114
        if (!_g1h->is_in_closed_subset(obj)) {
5344
f78ef2531f44 6937142: G1: improvements to debugging output (S-M)
tonyp
parents: 4023
diff changeset
   115
          HeapRegion* from = _g1h->heap_region_containing((HeapWord*)p);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   116
          gclog_or_tty->print_cr("Field "PTR_FORMAT
5344
f78ef2531f44 6937142: G1: improvements to debugging output (S-M)
tonyp
parents: 4023
diff changeset
   117
                                 " of live obj "PTR_FORMAT" in region "
f78ef2531f44 6937142: G1: improvements to debugging output (S-M)
tonyp
parents: 4023
diff changeset
   118
                                 "["PTR_FORMAT", "PTR_FORMAT")",
f78ef2531f44 6937142: G1: improvements to debugging output (S-M)
tonyp
parents: 4023
diff changeset
   119
                                 p, (void*) _containing_obj,
f78ef2531f44 6937142: G1: improvements to debugging output (S-M)
tonyp
parents: 4023
diff changeset
   120
                                 from->bottom(), from->end());
f78ef2531f44 6937142: G1: improvements to debugging output (S-M)
tonyp
parents: 4023
diff changeset
   121
          print_object(gclog_or_tty, _containing_obj);
f78ef2531f44 6937142: G1: improvements to debugging output (S-M)
tonyp
parents: 4023
diff changeset
   122
          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
   123
                                 (void*) obj);
f78ef2531f44 6937142: G1: improvements to debugging output (S-M)
tonyp
parents: 4023
diff changeset
   124
        } else {
f78ef2531f44 6937142: G1: improvements to debugging output (S-M)
tonyp
parents: 4023
diff changeset
   125
          HeapRegion* from = _g1h->heap_region_containing((HeapWord*)p);
f78ef2531f44 6937142: G1: improvements to debugging output (S-M)
tonyp
parents: 4023
diff changeset
   126
          HeapRegion* to   = _g1h->heap_region_containing((HeapWord*)obj);
f78ef2531f44 6937142: G1: improvements to debugging output (S-M)
tonyp
parents: 4023
diff changeset
   127
          gclog_or_tty->print_cr("Field "PTR_FORMAT
f78ef2531f44 6937142: G1: improvements to debugging output (S-M)
tonyp
parents: 4023
diff changeset
   128
                                 " of live obj "PTR_FORMAT" in region "
f78ef2531f44 6937142: G1: improvements to debugging output (S-M)
tonyp
parents: 4023
diff changeset
   129
                                 "["PTR_FORMAT", "PTR_FORMAT")",
f78ef2531f44 6937142: G1: improvements to debugging output (S-M)
tonyp
parents: 4023
diff changeset
   130
                                 p, (void*) _containing_obj,
f78ef2531f44 6937142: G1: improvements to debugging output (S-M)
tonyp
parents: 4023
diff changeset
   131
                                 from->bottom(), from->end());
f78ef2531f44 6937142: G1: improvements to debugging output (S-M)
tonyp
parents: 4023
diff changeset
   132
          print_object(gclog_or_tty, _containing_obj);
f78ef2531f44 6937142: G1: improvements to debugging output (S-M)
tonyp
parents: 4023
diff changeset
   133
          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
   134
                                 "["PTR_FORMAT", "PTR_FORMAT")",
f78ef2531f44 6937142: G1: improvements to debugging output (S-M)
tonyp
parents: 4023
diff changeset
   135
                                 (void*) obj, to->bottom(), to->end());
f78ef2531f44 6937142: G1: improvements to debugging output (S-M)
tonyp
parents: 4023
diff changeset
   136
          print_object(gclog_or_tty, obj);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   137
        }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   138
        gclog_or_tty->print_cr("----------");
11393
68bcbca24f4e 7123165: G1: output during parallel verification can get messed up
tonyp
parents: 10997
diff changeset
   139
        gclog_or_tty->flush();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   140
        _failures = true;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   141
        failed = true;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   142
        _n_failures++;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   143
      }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   144
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   145
      if (!_g1h->full_collection()) {
3262
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
   146
        HeapRegion* from = _g1h->heap_region_containing((HeapWord*)p);
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
   147
        HeapRegion* to   = _g1h->heap_region_containing(obj);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   148
        if (from != NULL && to != NULL &&
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   149
            from != to &&
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   150
            !to->isHumongous()) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   151
          jbyte cv_obj = *_bs->byte_for_const(_containing_obj);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   152
          jbyte cv_field = *_bs->byte_for_const(p);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   153
          const jbyte dirty = CardTableModRefBS::dirty_card_val();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   154
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   155
          bool is_bad = !(from->is_young()
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   156
                          || to->rem_set()->contains_reference(p)
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   157
                          || !G1HRRSFlushLogBuffersOnVerify && // buffers were not flushed
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   158
                              (_containing_obj->is_objArray() ?
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   159
                                  cv_field == dirty
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   160
                               : cv_obj == dirty || cv_field == dirty));
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   161
          if (is_bad) {
11393
68bcbca24f4e 7123165: G1: output during parallel verification can get messed up
tonyp
parents: 10997
diff changeset
   162
            MutexLockerEx x(ParGCRareEvent_lock,
68bcbca24f4e 7123165: G1: output during parallel verification can get messed up
tonyp
parents: 10997
diff changeset
   163
                            Mutex::_no_safepoint_check_flag);
68bcbca24f4e 7123165: G1: output during parallel verification can get messed up
tonyp
parents: 10997
diff changeset
   164
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   165
            if (!_failures) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   166
              gclog_or_tty->print_cr("");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   167
              gclog_or_tty->print_cr("----------");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   168
            }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   169
            gclog_or_tty->print_cr("Missing rem set entry:");
9989
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9418
diff changeset
   170
            gclog_or_tty->print_cr("Field "PTR_FORMAT" "
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9418
diff changeset
   171
                                   "of obj "PTR_FORMAT", "
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9418
diff changeset
   172
                                   "in region "HR_FORMAT,
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9418
diff changeset
   173
                                   p, (void*) _containing_obj,
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9418
diff changeset
   174
                                   HR_FORMAT_PARAMS(from));
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   175
            _containing_obj->print_on(gclog_or_tty);
9989
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9418
diff changeset
   176
            gclog_or_tty->print_cr("points to obj "PTR_FORMAT" "
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9418
diff changeset
   177
                                   "in region "HR_FORMAT,
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9418
diff changeset
   178
                                   (void*) obj,
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9418
diff changeset
   179
                                   HR_FORMAT_PARAMS(to));
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   180
            obj->print_on(gclog_or_tty);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   181
            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
   182
                          cv_obj, cv_field);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   183
            gclog_or_tty->print_cr("----------");
11393
68bcbca24f4e 7123165: G1: output during parallel verification can get messed up
tonyp
parents: 10997
diff changeset
   184
            gclog_or_tty->flush();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   185
            _failures = true;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   186
            if (!failed) _n_failures++;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   187
          }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   188
        }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   189
      }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   190
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   191
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   192
};
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   193
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   194
template<class ClosureType>
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   195
HeapWord* walk_mem_region_loop(ClosureType* cl, G1CollectedHeap* g1h,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   196
                               HeapRegion* hr,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   197
                               HeapWord* cur, HeapWord* top) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   198
  oop cur_oop = oop(cur);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   199
  int oop_size = cur_oop->size();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   200
  HeapWord* next_obj = cur + oop_size;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   201
  while (next_obj < top) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   202
    // Keep filtering the remembered set.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   203
    if (!g1h->is_obj_dead(cur_oop, hr)) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   204
      // Bottom lies entirely below top, so we can call the
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   205
      // non-memRegion version of oop_iterate below.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   206
      cur_oop->oop_iterate(cl);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   207
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   208
    cur = next_obj;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   209
    cur_oop = oop(cur);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   210
    oop_size = cur_oop->size();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   211
    next_obj = cur + oop_size;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   212
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   213
  return cur;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   214
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   215
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   216
void HeapRegionDCTOC::walk_mem_region_with_cl(MemRegion mr,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   217
                                              HeapWord* bottom,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   218
                                              HeapWord* top,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   219
                                              OopClosure* cl) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   220
  G1CollectedHeap* g1h = _g1;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   221
  int oop_size;
10674
09e6f8d20337 7097053: G1: assert(da ? referent->is_oop() : referent->is_oop_or_null()) failed: referenceProcessor.cpp:1054
johnc
parents: 10670
diff changeset
   222
  OopClosure* cl2 = NULL;
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10669
diff changeset
   223
10674
09e6f8d20337 7097053: G1: assert(da ? referent->is_oop() : referent->is_oop_or_null()) failed: referenceProcessor.cpp:1054
johnc
parents: 10670
diff changeset
   224
  FilterIntoCSClosure intoCSFilt(this, g1h, cl);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   225
  FilterOutOfRegionClosure outOfRegionFilt(_hr, cl);
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10669
diff changeset
   226
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   227
  switch (_fk) {
10674
09e6f8d20337 7097053: G1: assert(da ? referent->is_oop() : referent->is_oop_or_null()) failed: referenceProcessor.cpp:1054
johnc
parents: 10670
diff changeset
   228
  case NoFilterKind:          cl2 = cl; break;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   229
  case IntoCSFilterKind:      cl2 = &intoCSFilt; break;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   230
  case OutOfRegionFilterKind: cl2 = &outOfRegionFilt; break;
10674
09e6f8d20337 7097053: G1: assert(da ? referent->is_oop() : referent->is_oop_or_null()) failed: referenceProcessor.cpp:1054
johnc
parents: 10670
diff changeset
   231
  default:                    ShouldNotReachHere();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   232
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   233
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   234
  // 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
   235
  // 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
   236
  // 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
   237
  // we can safely ignore the object.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   238
  if (!g1h->is_obj_dead(oop(bottom), _hr)) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   239
    oop_size = oop(bottom)->oop_iterate(cl2, mr);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   240
  } else {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   241
    oop_size = oop(bottom)->size();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   242
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   243
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   244
  bottom += oop_size;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   245
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   246
  if (bottom < top) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   247
    // We replicate the loop below for several kinds of possible filters.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   248
    switch (_fk) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   249
    case NoFilterKind:
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   250
      bottom = walk_mem_region_loop(cl, g1h, _hr, bottom, top);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   251
      break;
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10669
diff changeset
   252
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   253
    case IntoCSFilterKind: {
10674
09e6f8d20337 7097053: G1: assert(da ? referent->is_oop() : referent->is_oop_or_null()) failed: referenceProcessor.cpp:1054
johnc
parents: 10670
diff changeset
   254
      FilterIntoCSClosure filt(this, g1h, cl);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   255
      bottom = walk_mem_region_loop(&filt, g1h, _hr, bottom, top);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   256
      break;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   257
    }
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10669
diff changeset
   258
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   259
    case OutOfRegionFilterKind: {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   260
      FilterOutOfRegionClosure filt(_hr, cl);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   261
      bottom = walk_mem_region_loop(&filt, g1h, _hr, bottom, top);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   262
      break;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   263
    }
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10669
diff changeset
   264
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   265
    default:
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   266
      ShouldNotReachHere();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   267
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   268
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   269
    // Last object. Need to do dead-obj filtering here too.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   270
    if (!g1h->is_obj_dead(oop(bottom), _hr)) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   271
      oop(bottom)->oop_iterate(cl2, mr);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   272
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   273
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   274
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   275
3697
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3283
diff changeset
   276
// 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
   277
// 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
   278
// heaps a bit more efficiently.
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3283
diff changeset
   279
#define MIN_REGION_SIZE  (      1024 * 1024 )
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3283
diff changeset
   280
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3283
diff changeset
   281
// 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
   282
// 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
   283
// 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
   284
// 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
   285
// marking.
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3283
diff changeset
   286
#define MAX_REGION_SIZE  ( 32 * 1024 * 1024 )
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
// 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
   289
// 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
   290
#define TARGET_REGION_NUMBER          2048
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3283
diff changeset
   291
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3283
diff changeset
   292
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
   293
  // region_size in bytes
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3283
diff changeset
   294
  uintx region_size = G1HeapRegionSize;
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3283
diff changeset
   295
  if (FLAG_IS_DEFAULT(G1HeapRegionSize)) {
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3283
diff changeset
   296
    // 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
   297
    // 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
   298
    // 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
   299
    // 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
   300
    // 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
   301
    // size manually for some -Xms / -Xmx combos.
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3283
diff changeset
   302
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3283
diff changeset
   303
    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
   304
                       (uintx) MIN_REGION_SIZE);
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3283
diff changeset
   305
  }
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3283
diff changeset
   306
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3283
diff changeset
   307
  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
   308
  // 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
   309
  // 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
   310
  // <= what we've calculated so far.
5377
bcf55c5acf4e 6931180: Migration to recent versions of MS Platform SDK
prr
parents: 5350
diff changeset
   311
  region_size = ((uintx)1 << region_size_log);
3697
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3283
diff changeset
   312
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3283
diff changeset
   313
  // 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
   314
  if (region_size < MIN_REGION_SIZE) {
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3283
diff changeset
   315
    region_size = MIN_REGION_SIZE;
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3283
diff changeset
   316
  } else if (region_size > MAX_REGION_SIZE) {
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3283
diff changeset
   317
    region_size = MAX_REGION_SIZE;
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3283
diff changeset
   318
  }
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3283
diff changeset
   319
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3283
diff changeset
   320
  // And recalculate the log.
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3283
diff changeset
   321
  region_size_log = log2_long((jlong) region_size);
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3283
diff changeset
   322
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3283
diff changeset
   323
  // Now, set up the globals.
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3283
diff changeset
   324
  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
   325
  LogOfHRGrainBytes = region_size_log;
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3283
diff changeset
   326
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3283
diff changeset
   327
  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
   328
  LogOfHRGrainWords = LogOfHRGrainBytes - LogHeapWordSize;
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3283
diff changeset
   329
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3283
diff changeset
   330
  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
   331
  // 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
   332
  // MIN_REGION_SIZE and MAX_REGION_SIZE.
10677
370a8da2d63f 7095194: G1: HeapRegion::GrainBytes, GrainWords, and CardsPerRegion should be size_t
johnc
parents: 10674
diff changeset
   333
  GrainBytes = (size_t)region_size;
3697
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3283
diff changeset
   334
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3283
diff changeset
   335
  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
   336
  GrainWords = GrainBytes >> LogHeapWordSize;
10677
370a8da2d63f 7095194: G1: HeapRegion::GrainBytes, GrainWords, and CardsPerRegion should be size_t
johnc
parents: 10674
diff changeset
   337
  guarantee((size_t)(1 << LogOfHRGrainWords) == GrainWords, "sanity");
3697
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3283
diff changeset
   338
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3283
diff changeset
   339
  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
   340
  CardsPerRegion = GrainBytes >> CardTableModRefBS::card_shift;
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3283
diff changeset
   341
}
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3283
diff changeset
   342
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   343
void HeapRegion::reset_after_compaction() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   344
  G1OffsetTableContigSpace::reset_after_compaction();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   345
  // After a compaction the mark bitmap is invalid, so we must
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   346
  // treat all objects as being inside the unmarked area.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   347
  zero_marked_bytes();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   348
  init_top_at_mark_start();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   349
}
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
void HeapRegion::hr_clear(bool par, bool clear_space) {
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7904
diff changeset
   352
  assert(_humongous_type == NotHumongous,
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7904
diff changeset
   353
         "we should have already filtered out humongous regions");
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7904
diff changeset
   354
  assert(_humongous_start_region == NULL,
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7904
diff changeset
   355
         "we should have already filtered out humongous regions");
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7904
diff changeset
   356
  assert(_end == _orig_end,
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7904
diff changeset
   357
         "we should have already filtered out humongous regions");
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7904
diff changeset
   358
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   359
  _in_collection_set = false;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   360
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   361
  set_young_index_in_cset(-1);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   362
  uninstall_surv_rate_group();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   363
  set_young_type(NotYoung);
8928
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 7923
diff changeset
   364
  reset_pre_dummy_top();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   365
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   366
  if (!par) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   367
    // If this is parallel, this will be done later.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   368
    HeapRegionRemSet* hrrs = rem_set();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   369
    if (hrrs != NULL) hrrs->clear();
1387
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1385
diff changeset
   370
    _claimed = InitialClaimValue;
1374
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
  zero_marked_bytes();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   373
  set_sort_index(-1);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   375
  _offsets.resize(HeapRegion::GrainWords);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   376
  init_top_at_mark_start();
1388
tonyp
parents: 1387
diff changeset
   377
  if (clear_space) clear(SpaceDecorator::Mangle);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   378
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   379
9418
32a87dd6b746 7035144: G1: nightly failure: Non-dirty cards in region that should be dirty (failures still exist...)
tonyp
parents: 8928
diff changeset
   380
void HeapRegion::par_clear() {
32a87dd6b746 7035144: G1: nightly failure: Non-dirty cards in region that should be dirty (failures still exist...)
tonyp
parents: 8928
diff changeset
   381
  assert(used() == 0, "the region should have been already cleared");
10677
370a8da2d63f 7095194: G1: HeapRegion::GrainBytes, GrainWords, and CardsPerRegion should be size_t
johnc
parents: 10674
diff changeset
   382
  assert(capacity() == HeapRegion::GrainBytes, "should be back to normal");
9418
32a87dd6b746 7035144: G1: nightly failure: Non-dirty cards in region that should be dirty (failures still exist...)
tonyp
parents: 8928
diff changeset
   383
  HeapRegionRemSet* hrrs = rem_set();
32a87dd6b746 7035144: G1: nightly failure: Non-dirty cards in region that should be dirty (failures still exist...)
tonyp
parents: 8928
diff changeset
   384
  hrrs->clear();
32a87dd6b746 7035144: G1: nightly failure: Non-dirty cards in region that should be dirty (failures still exist...)
tonyp
parents: 8928
diff changeset
   385
  CardTableModRefBS* ct_bs =
32a87dd6b746 7035144: G1: nightly failure: Non-dirty cards in region that should be dirty (failures still exist...)
tonyp
parents: 8928
diff changeset
   386
                   (CardTableModRefBS*)G1CollectedHeap::heap()->barrier_set();
32a87dd6b746 7035144: G1: nightly failure: Non-dirty cards in region that should be dirty (failures still exist...)
tonyp
parents: 8928
diff changeset
   387
  ct_bs->clear(MemRegion(bottom(), end()));
32a87dd6b746 7035144: G1: nightly failure: Non-dirty cards in region that should be dirty (failures still exist...)
tonyp
parents: 8928
diff changeset
   388
}
32a87dd6b746 7035144: G1: nightly failure: Non-dirty cards in region that should be dirty (failures still exist...)
tonyp
parents: 8928
diff changeset
   389
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   390
void HeapRegion::calc_gc_efficiency() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   391
  G1CollectedHeap* g1h = G1CollectedHeap::heap();
11756
28b6fe22e43d 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 11586
diff changeset
   392
  G1CollectorPolicy* g1p = g1h->g1_policy();
28b6fe22e43d 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 11586
diff changeset
   393
  _gc_efficiency = (double) reclaimable_bytes() /
28b6fe22e43d 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 11586
diff changeset
   394
                            g1p->predict_region_elapsed_time_ms(this, false);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   395
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   396
7904
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   397
void HeapRegion::set_startsHumongous(HeapWord* new_top, HeapWord* new_end) {
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7904
diff changeset
   398
  assert(!isHumongous(), "sanity / pre-condition");
6983
a8c50cedbce9 6991377: G1: race between concurrent refinement and humongous object allocation
tonyp
parents: 6260
diff changeset
   399
  assert(end() == _orig_end,
a8c50cedbce9 6991377: G1: race between concurrent refinement and humongous object allocation
tonyp
parents: 6260
diff changeset
   400
         "Should be normal before the humongous object allocation");
a8c50cedbce9 6991377: G1: race between concurrent refinement and humongous object allocation
tonyp
parents: 6260
diff changeset
   401
  assert(top() == bottom(), "should be empty");
7904
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   402
  assert(bottom() <= new_top && new_top <= new_end, "pre-condition");
6983
a8c50cedbce9 6991377: G1: race between concurrent refinement and humongous object allocation
tonyp
parents: 6260
diff changeset
   403
1387
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1385
diff changeset
   404
  _humongous_type = StartsHumongous;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   405
  _humongous_start_region = this;
6983
a8c50cedbce9 6991377: G1: race between concurrent refinement and humongous object allocation
tonyp
parents: 6260
diff changeset
   406
a8c50cedbce9 6991377: G1: race between concurrent refinement and humongous object allocation
tonyp
parents: 6260
diff changeset
   407
  set_end(new_end);
7904
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   408
  _offsets.set_for_starts_humongous(new_top);
6983
a8c50cedbce9 6991377: G1: race between concurrent refinement and humongous object allocation
tonyp
parents: 6260
diff changeset
   409
}
a8c50cedbce9 6991377: G1: race between concurrent refinement and humongous object allocation
tonyp
parents: 6260
diff changeset
   410
7904
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   411
void HeapRegion::set_continuesHumongous(HeapRegion* first_hr) {
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7904
diff changeset
   412
  assert(!isHumongous(), "sanity / pre-condition");
6983
a8c50cedbce9 6991377: G1: race between concurrent refinement and humongous object allocation
tonyp
parents: 6260
diff changeset
   413
  assert(end() == _orig_end,
a8c50cedbce9 6991377: G1: race between concurrent refinement and humongous object allocation
tonyp
parents: 6260
diff changeset
   414
         "Should be normal before the humongous object allocation");
a8c50cedbce9 6991377: G1: race between concurrent refinement and humongous object allocation
tonyp
parents: 6260
diff changeset
   415
  assert(top() == bottom(), "should be empty");
7904
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   416
  assert(first_hr->startsHumongous(), "pre-condition");
6983
a8c50cedbce9 6991377: G1: race between concurrent refinement and humongous object allocation
tonyp
parents: 6260
diff changeset
   417
a8c50cedbce9 6991377: G1: race between concurrent refinement and humongous object allocation
tonyp
parents: 6260
diff changeset
   418
  _humongous_type = ContinuesHumongous;
7904
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   419
  _humongous_start_region = first_hr;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   420
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   421
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7904
diff changeset
   422
void HeapRegion::set_notHumongous() {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7904
diff changeset
   423
  assert(isHumongous(), "pre-condition");
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7904
diff changeset
   424
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7904
diff changeset
   425
  if (startsHumongous()) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7904
diff changeset
   426
    assert(top() <= end(), "pre-condition");
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7904
diff changeset
   427
    set_end(_orig_end);
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7904
diff changeset
   428
    if (top() > end()) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7904
diff changeset
   429
      // at least one "continues humongous" region after it
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7904
diff changeset
   430
      set_top(end());
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7904
diff changeset
   431
    }
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7904
diff changeset
   432
  } else {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7904
diff changeset
   433
    // continues humongous
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7904
diff changeset
   434
    assert(end() == _orig_end, "sanity");
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7904
diff changeset
   435
  }
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7904
diff changeset
   436
10677
370a8da2d63f 7095194: G1: HeapRegion::GrainBytes, GrainWords, and CardsPerRegion should be size_t
johnc
parents: 10674
diff changeset
   437
  assert(capacity() == HeapRegion::GrainBytes, "pre-condition");
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7904
diff changeset
   438
  _humongous_type = NotHumongous;
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7904
diff changeset
   439
  _humongous_start_region = NULL;
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7904
diff changeset
   440
}
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7904
diff changeset
   441
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   442
bool HeapRegion::claimHeapRegion(jint claimValue) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   443
  jint current = _claimed;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   444
  if (current != claimValue) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   445
    jint res = Atomic::cmpxchg(claimValue, &_claimed, current);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   446
    if (res == current) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   447
      return true;
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
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   450
  return false;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   451
}
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
HeapWord* HeapRegion::next_block_start_careful(HeapWord* addr) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   454
  HeapWord* low = addr;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   455
  HeapWord* high = end();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   456
  while (low < high) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   457
    size_t diff = pointer_delta(high, low);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   458
    // 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
   459
  // "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
   460
    // would not converge on "high".  This is not symmetric, because
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   461
    // 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
   462
    // which we don't do for "low".
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   463
    HeapWord* middle = low + (diff+1)/2;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   464
    if (middle == high) return high;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   465
    HeapWord* mid_bs = block_start_careful(middle);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   466
    if (mid_bs < addr) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   467
      low = middle;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   468
    } else {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   469
      high = mid_bs;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   470
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   471
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   472
  assert(low == high && low >= addr, "Didn't work.");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   473
  return low;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   474
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   475
1388
tonyp
parents: 1387
diff changeset
   476
void HeapRegion::initialize(MemRegion mr, bool clear_space, bool mangle_space) {
tonyp
parents: 1387
diff changeset
   477
  G1OffsetTableContigSpace::initialize(mr, false, mangle_space);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   478
  hr_clear(false/*par*/, clear_space);
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
#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
   481
#pragma warning( disable:4355 ) // 'this' : used in base member initializer list
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   482
#endif // _MSC_VER
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   483
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   484
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   485
HeapRegion::
9989
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9418
diff changeset
   486
HeapRegion(size_t hrs_index, G1BlockOffsetSharedArray* sharedOffsetArray,
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9418
diff changeset
   487
           MemRegion mr, bool is_zeroed)
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   488
  : G1OffsetTableContigSpace(sharedOffsetArray, mr, is_zeroed),
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10669
diff changeset
   489
    _hrs_index(hrs_index),
1387
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1385
diff changeset
   490
    _humongous_type(NotHumongous), _humongous_start_region(NULL),
10243
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 9995
diff changeset
   491
    _in_collection_set(false),
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   492
    _next_in_special_set(NULL), _orig_end(NULL),
1387
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1385
diff changeset
   493
    _claimed(InitialClaimValue), _evacuation_failed(false),
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   494
    _prev_marked_bytes(0), _next_marked_bytes(0), _sort_index(-1),
10669
cfa6efbbc1b3 7092238: G1: Uninitialized field gc_efficiency in G1PrintRegionLivenessInfo output
tonyp
parents: 10243
diff changeset
   495
    _gc_efficiency(0.0),
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   496
    _young_type(NotYoung), _next_young_region(NULL),
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7904
diff changeset
   497
    _next_dirty_cards_region(NULL), _next(NULL), _pending_removal(false),
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7904
diff changeset
   498
#ifdef ASSERT
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7904
diff changeset
   499
    _containing_set(NULL),
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7904
diff changeset
   500
#endif // ASSERT
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7904
diff changeset
   501
     _young_index_in_cset(-1), _surv_rate_group(NULL), _age_index(-1),
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7904
diff changeset
   502
    _rem_set(NULL), _recorded_rs_length(0), _predicted_elapsed_time_ms(0),
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5344
diff changeset
   503
    _predicted_bytes_to_copy(0)
1374
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
  _orig_end = mr.end();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   506
  // 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
   507
  // region.
1388
tonyp
parents: 1387
diff changeset
   508
  this->initialize(mr, !is_zeroed, SpaceDecorator::Mangle);
tonyp
parents: 1387
diff changeset
   509
  set_top(bottom());
tonyp
parents: 1387
diff changeset
   510
  set_saved_mark();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   511
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   512
  _rem_set =  new HeapRegionRemSet(sharedOffsetArray, this);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   513
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   514
  assert(HeapRegionRemSet::num_par_rem_sets() > 0, "Invariant.");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   515
  // 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
   516
  // We haven't done any counting on a brand new region.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   517
  _top_at_conc_mark_count = bottom();
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
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   520
class NextCompactionHeapRegionClosure: public HeapRegionClosure {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   521
  const HeapRegion* _target;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   522
  bool _target_seen;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   523
  HeapRegion* _last;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   524
  CompactibleSpace* _res;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   525
public:
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   526
  NextCompactionHeapRegionClosure(const HeapRegion* target) :
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   527
    _target(target), _target_seen(false), _res(NULL) {}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   528
  bool doHeapRegion(HeapRegion* cur) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   529
    if (_target_seen) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   530
      if (!cur->isHumongous()) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   531
        _res = cur;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   532
        return true;
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
    } else if (cur == _target) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   535
      _target_seen = true;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   536
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   537
    return false;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   538
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   539
  CompactibleSpace* result() { return _res; }
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
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   542
CompactibleSpace* HeapRegion::next_compaction_space() const {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   543
  G1CollectedHeap* g1h = G1CollectedHeap::heap();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   544
  // cast away const-ness
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   545
  HeapRegion* r = (HeapRegion*) this;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   546
  NextCompactionHeapRegionClosure blk(r);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   547
  g1h->heap_region_iterate_from(r, &blk);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   548
  return blk.result();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   549
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   550
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   551
void HeapRegion::save_marks() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   552
  set_saved_mark();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   553
}
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::oops_in_mr_iterate(MemRegion mr, OopClosure* cl) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   556
  HeapWord* p = mr.start();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   557
  HeapWord* e = mr.end();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   558
  oop obj;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   559
  while (p < e) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   560
    obj = oop(p);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   561
    p += obj->oop_iterate(cl);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   562
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   563
  assert(p == e, "bad memregion: doesn't end on obj boundary");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   564
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   565
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   566
#define HeapRegion_OOP_SINCE_SAVE_MARKS_DEFN(OopClosureType, nv_suffix) \
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   567
void HeapRegion::oop_since_save_marks_iterate##nv_suffix(OopClosureType* cl) { \
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   568
  ContiguousSpace::oop_since_save_marks_iterate##nv_suffix(cl);              \
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   569
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   570
SPECIALIZED_SINCE_SAVE_MARKS_CLOSURES(HeapRegion_OOP_SINCE_SAVE_MARKS_DEFN)
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
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   573
void HeapRegion::oop_before_save_marks_iterate(OopClosure* cl) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   574
  oops_in_mr_iterate(MemRegion(bottom(), saved_mark_word()), cl);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   575
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   576
11455
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11393
diff changeset
   577
void HeapRegion::note_self_forwarding_removal_start(bool during_initial_mark,
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11393
diff changeset
   578
                                                    bool during_conc_mark) {
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11393
diff changeset
   579
  // We always recreate the prev marking info and we'll explicitly
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11393
diff changeset
   580
  // mark all objects we find to be self-forwarded on the prev
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11393
diff changeset
   581
  // bitmap. So all objects need to be below PTAMS.
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11393
diff changeset
   582
  _prev_top_at_mark_start = top();
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11393
diff changeset
   583
  _prev_marked_bytes = 0;
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11393
diff changeset
   584
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11393
diff changeset
   585
  if (during_initial_mark) {
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11393
diff changeset
   586
    // During initial-mark, we'll also explicitly mark all objects
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11393
diff changeset
   587
    // we find to be self-forwarded on the next bitmap. So all
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11393
diff changeset
   588
    // objects need to be below NTAMS.
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11393
diff changeset
   589
    _next_top_at_mark_start = top();
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11393
diff changeset
   590
    set_top_at_conc_mark_count(bottom());
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11393
diff changeset
   591
    _next_marked_bytes = 0;
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11393
diff changeset
   592
  } else if (during_conc_mark) {
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11393
diff changeset
   593
    // During concurrent mark, all objects in the CSet (including
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11393
diff changeset
   594
    // the ones we find to be self-forwarded) are implicitly live.
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11393
diff changeset
   595
    // So all objects need to be above NTAMS.
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11393
diff changeset
   596
    _next_top_at_mark_start = bottom();
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11393
diff changeset
   597
    set_top_at_conc_mark_count(bottom());
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11393
diff changeset
   598
    _next_marked_bytes = 0;
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11393
diff changeset
   599
  }
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11393
diff changeset
   600
}
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11393
diff changeset
   601
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11393
diff changeset
   602
void HeapRegion::note_self_forwarding_removal_end(bool during_initial_mark,
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11393
diff changeset
   603
                                                  bool during_conc_mark,
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11393
diff changeset
   604
                                                  size_t marked_bytes) {
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11393
diff changeset
   605
  assert(0 <= marked_bytes && marked_bytes <= used(),
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11393
diff changeset
   606
         err_msg("marked: "SIZE_FORMAT" used: "SIZE_FORMAT,
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11393
diff changeset
   607
                 marked_bytes, used()));
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11393
diff changeset
   608
  _prev_marked_bytes = marked_bytes;
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11393
diff changeset
   609
}
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11393
diff changeset
   610
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   611
HeapWord*
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   612
HeapRegion::object_iterate_mem_careful(MemRegion mr,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   613
                                                 ObjectClosure* cl) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   614
  G1CollectedHeap* g1h = G1CollectedHeap::heap();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   615
  // 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
   616
  // to update the BOT while we do this...
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   617
  HeapWord* cur = block_start(mr.start());
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   618
  mr = mr.intersection(used_region());
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   619
  if (mr.is_empty()) return NULL;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   620
  // Otherwise, find the obj that extends onto mr.start().
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(cur <= mr.start()
3262
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
   623
         && (oop(cur)->klass_or_null() == NULL ||
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   624
             cur + oop(cur)->size() > mr.start()),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   625
         "postcondition of block_start");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   626
  oop obj;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   627
  while (cur < mr.end()) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   628
    obj = oop(cur);
3262
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
   629
    if (obj->klass_or_null() == NULL) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   630
      // Ran into an unparseable point.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   631
      return cur;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   632
    } else if (!g1h->is_obj_dead(obj)) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   633
      cl->do_object(obj);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   634
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   635
    if (cl->abort()) return cur;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   636
    // The check above must occur before the operation below, since an
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   637
    // abort might invalidate the "size" operation.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   638
    cur += obj->size();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   639
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   640
  return NULL;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   641
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   642
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   643
HeapWord*
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   644
HeapRegion::
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   645
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
   646
                                 FilterOutOfRegionClosure* cl,
9418
32a87dd6b746 7035144: G1: nightly failure: Non-dirty cards in region that should be dirty (failures still exist...)
tonyp
parents: 8928
diff changeset
   647
                                 bool filter_young,
32a87dd6b746 7035144: G1: nightly failure: Non-dirty cards in region that should be dirty (failures still exist...)
tonyp
parents: 8928
diff changeset
   648
                                 jbyte* card_ptr) {
32a87dd6b746 7035144: G1: nightly failure: Non-dirty cards in region that should be dirty (failures still exist...)
tonyp
parents: 8928
diff changeset
   649
  // Currently, we should only have to clean the card if filter_young
32a87dd6b746 7035144: G1: nightly failure: Non-dirty cards in region that should be dirty (failures still exist...)
tonyp
parents: 8928
diff changeset
   650
  // is true and vice versa.
32a87dd6b746 7035144: G1: nightly failure: Non-dirty cards in region that should be dirty (failures still exist...)
tonyp
parents: 8928
diff changeset
   651
  if (filter_young) {
32a87dd6b746 7035144: G1: nightly failure: Non-dirty cards in region that should be dirty (failures still exist...)
tonyp
parents: 8928
diff changeset
   652
    assert(card_ptr != NULL, "pre-condition");
32a87dd6b746 7035144: G1: nightly failure: Non-dirty cards in region that should be dirty (failures still exist...)
tonyp
parents: 8928
diff changeset
   653
  } else {
32a87dd6b746 7035144: G1: nightly failure: Non-dirty cards in region that should be dirty (failures still exist...)
tonyp
parents: 8928
diff changeset
   654
    assert(card_ptr == NULL, "pre-condition");
32a87dd6b746 7035144: G1: nightly failure: Non-dirty cards in region that should be dirty (failures still exist...)
tonyp
parents: 8928
diff changeset
   655
  }
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   656
  G1CollectedHeap* g1h = G1CollectedHeap::heap();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   657
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   658
  // 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
   659
  // 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
   660
  // parseable.  Stop such at the "saved_mark" of the region.
11586
ccc217c177ee 7133038: G1: Some small profile based optimizations
johnc
parents: 11455
diff changeset
   661
  if (g1h->is_gc_active()) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   662
    mr = mr.intersection(used_region_at_save_marks());
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   663
  } else {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   664
    mr = mr.intersection(used_region());
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   665
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   666
  if (mr.is_empty()) return NULL;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   667
  // Otherwise, find the obj that extends onto mr.start().
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   668
6068
80ef41e75a2d 6956639: G1: assert(cached_ptr != card_ptr) failed: shouldn't be, concurrentG1Refine.cpp:307
johnc
parents: 5547
diff changeset
   669
  // 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
   670
  // 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
   671
  // 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
   672
  // 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
   673
  // 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
   674
  // 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
   675
  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
   676
    return NULL;
80ef41e75a2d 6956639: G1: assert(cached_ptr != card_ptr) failed: shouldn't be, concurrentG1Refine.cpp:307
johnc
parents: 5547
diff changeset
   677
  }
80ef41e75a2d 6956639: G1: assert(cached_ptr != card_ptr) failed: shouldn't be, concurrentG1Refine.cpp:307
johnc
parents: 5547
diff changeset
   678
6247
00e5cc407d03 6814437: G1: remove the _new_refs array
johnc
parents: 6068
diff changeset
   679
  assert(!is_young(), "check value of filter_young");
00e5cc407d03 6814437: G1: remove the _new_refs array
johnc
parents: 6068
diff changeset
   680
9418
32a87dd6b746 7035144: G1: nightly failure: Non-dirty cards in region that should be dirty (failures still exist...)
tonyp
parents: 8928
diff changeset
   681
  // We can only clean the card here, after we make the decision that
32a87dd6b746 7035144: G1: nightly failure: Non-dirty cards in region that should be dirty (failures still exist...)
tonyp
parents: 8928
diff changeset
   682
  // the card is not young. And we only clean the card if we have been
32a87dd6b746 7035144: G1: nightly failure: Non-dirty cards in region that should be dirty (failures still exist...)
tonyp
parents: 8928
diff changeset
   683
  // asked to (i.e., card_ptr != NULL).
32a87dd6b746 7035144: G1: nightly failure: Non-dirty cards in region that should be dirty (failures still exist...)
tonyp
parents: 8928
diff changeset
   684
  if (card_ptr != NULL) {
32a87dd6b746 7035144: G1: nightly failure: Non-dirty cards in region that should be dirty (failures still exist...)
tonyp
parents: 8928
diff changeset
   685
    *card_ptr = CardTableModRefBS::clean_card_val();
32a87dd6b746 7035144: G1: nightly failure: Non-dirty cards in region that should be dirty (failures still exist...)
tonyp
parents: 8928
diff changeset
   686
    // We must complete this write before we do any of the reads below.
32a87dd6b746 7035144: G1: nightly failure: Non-dirty cards in region that should be dirty (failures still exist...)
tonyp
parents: 8928
diff changeset
   687
    OrderAccess::storeload();
32a87dd6b746 7035144: G1: nightly failure: Non-dirty cards in region that should be dirty (failures still exist...)
tonyp
parents: 8928
diff changeset
   688
  }
32a87dd6b746 7035144: G1: nightly failure: Non-dirty cards in region that should be dirty (failures still exist...)
tonyp
parents: 8928
diff changeset
   689
11586
ccc217c177ee 7133038: G1: Some small profile based optimizations
johnc
parents: 11455
diff changeset
   690
  // Cache the boundaries of the memory region in some const locals
ccc217c177ee 7133038: G1: Some small profile based optimizations
johnc
parents: 11455
diff changeset
   691
  HeapWord* const start = mr.start();
ccc217c177ee 7133038: G1: Some small profile based optimizations
johnc
parents: 11455
diff changeset
   692
  HeapWord* const end = mr.end();
ccc217c177ee 7133038: G1: Some small profile based optimizations
johnc
parents: 11455
diff changeset
   693
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   694
  // 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
   695
  // to update the BOT while we do this...
11586
ccc217c177ee 7133038: G1: Some small profile based optimizations
johnc
parents: 11455
diff changeset
   696
  HeapWord* cur = block_start(start);
ccc217c177ee 7133038: G1: Some small profile based optimizations
johnc
parents: 11455
diff changeset
   697
  assert(cur <= start, "Postcondition");
ccc217c177ee 7133038: G1: Some small profile based optimizations
johnc
parents: 11455
diff changeset
   698
ccc217c177ee 7133038: G1: Some small profile based optimizations
johnc
parents: 11455
diff changeset
   699
  oop obj;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   700
11586
ccc217c177ee 7133038: G1: Some small profile based optimizations
johnc
parents: 11455
diff changeset
   701
  HeapWord* next = cur;
ccc217c177ee 7133038: G1: Some small profile based optimizations
johnc
parents: 11455
diff changeset
   702
  while (next <= start) {
ccc217c177ee 7133038: G1: Some small profile based optimizations
johnc
parents: 11455
diff changeset
   703
    cur = next;
ccc217c177ee 7133038: G1: Some small profile based optimizations
johnc
parents: 11455
diff changeset
   704
    obj = oop(cur);
ccc217c177ee 7133038: G1: Some small profile based optimizations
johnc
parents: 11455
diff changeset
   705
    if (obj->klass_or_null() == NULL) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   706
      // Ran into an unparseable point.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   707
      return cur;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   708
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   709
    // Otherwise...
11586
ccc217c177ee 7133038: G1: Some small profile based optimizations
johnc
parents: 11455
diff changeset
   710
    next = (cur + obj->size());
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   711
  }
11586
ccc217c177ee 7133038: G1: Some small profile based optimizations
johnc
parents: 11455
diff changeset
   712
ccc217c177ee 7133038: G1: Some small profile based optimizations
johnc
parents: 11455
diff changeset
   713
  // If we finish the above loop...We have a parseable object that
ccc217c177ee 7133038: G1: Some small profile based optimizations
johnc
parents: 11455
diff changeset
   714
  // begins on or before the start of the memory region, and ends
ccc217c177ee 7133038: G1: Some small profile based optimizations
johnc
parents: 11455
diff changeset
   715
  // inside or spans the entire region.
ccc217c177ee 7133038: G1: Some small profile based optimizations
johnc
parents: 11455
diff changeset
   716
ccc217c177ee 7133038: G1: Some small profile based optimizations
johnc
parents: 11455
diff changeset
   717
  assert(obj == oop(cur), "sanity");
ccc217c177ee 7133038: G1: Some small profile based optimizations
johnc
parents: 11455
diff changeset
   718
  assert(cur <= start &&
ccc217c177ee 7133038: G1: Some small profile based optimizations
johnc
parents: 11455
diff changeset
   719
         obj->klass_or_null() != NULL &&
ccc217c177ee 7133038: G1: Some small profile based optimizations
johnc
parents: 11455
diff changeset
   720
         (cur + obj->size()) > start,
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   721
         "Loop postcondition");
11586
ccc217c177ee 7133038: G1: Some small profile based optimizations
johnc
parents: 11455
diff changeset
   722
1374
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
    obj->oop_iterate(cl, mr);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   725
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   726
11586
ccc217c177ee 7133038: G1: Some small profile based optimizations
johnc
parents: 11455
diff changeset
   727
  while (cur < end) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   728
    obj = oop(cur);
3262
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
   729
    if (obj->klass_or_null() == NULL) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   730
      // Ran into an unparseable point.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   731
      return cur;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   732
    };
11586
ccc217c177ee 7133038: G1: Some small profile based optimizations
johnc
parents: 11455
diff changeset
   733
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   734
    // Otherwise:
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   735
    next = (cur + obj->size());
11586
ccc217c177ee 7133038: G1: Some small profile based optimizations
johnc
parents: 11455
diff changeset
   736
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   737
    if (!g1h->is_obj_dead(obj)) {
11586
ccc217c177ee 7133038: G1: Some small profile based optimizations
johnc
parents: 11455
diff changeset
   738
      if (next < end || !obj->is_objArray()) {
ccc217c177ee 7133038: G1: Some small profile based optimizations
johnc
parents: 11455
diff changeset
   739
        // This object either does not span the MemRegion
ccc217c177ee 7133038: G1: Some small profile based optimizations
johnc
parents: 11455
diff changeset
   740
        // boundary, or if it does it's not an array.
ccc217c177ee 7133038: G1: Some small profile based optimizations
johnc
parents: 11455
diff changeset
   741
        // Apply closure to whole object.
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   742
        obj->oop_iterate(cl);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   743
      } else {
11586
ccc217c177ee 7133038: G1: Some small profile based optimizations
johnc
parents: 11455
diff changeset
   744
        // This obj is an array that spans the boundary.
ccc217c177ee 7133038: G1: Some small profile based optimizations
johnc
parents: 11455
diff changeset
   745
        // Stop at the boundary.
ccc217c177ee 7133038: G1: Some small profile based optimizations
johnc
parents: 11455
diff changeset
   746
        obj->oop_iterate(cl, mr);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   747
      }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   748
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   749
    cur = next;
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
  return NULL;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   752
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   753
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   754
void HeapRegion::print() const { print_on(gclog_or_tty); }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   755
void HeapRegion::print_on(outputStream* st) const {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   756
  if (isHumongous()) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   757
    if (startsHumongous())
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   758
      st->print(" HS");
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(" HC");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   761
  } else {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   762
    st->print("   ");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   763
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   764
  if (in_collection_set())
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   765
    st->print(" CS");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   766
  else
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   767
    st->print("   ");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   768
  if (is_young())
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5344
diff changeset
   769
    st->print(is_survivor() ? " SU" : " Y ");
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   770
  else
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   771
    st->print("   ");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   772
  if (is_empty())
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   773
    st->print(" F");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   774
  else
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   775
    st->print("  ");
10997
0be4b3be7197 7099849: G1: include heap region information in hs_err files
tonyp
parents: 10770
diff changeset
   776
  st->print(" TS %5d", _gc_time_stamp);
5344
f78ef2531f44 6937142: G1: improvements to debugging output (S-M)
tonyp
parents: 4023
diff changeset
   777
  st->print(" PTAMS "PTR_FORMAT" NTAMS "PTR_FORMAT,
f78ef2531f44 6937142: G1: improvements to debugging output (S-M)
tonyp
parents: 4023
diff changeset
   778
            prev_top_at_mark_start(), next_top_at_mark_start());
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   779
  G1OffsetTableContigSpace::print_on(st);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   780
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   781
3000
bbce6052b595 6850846: G1: extend G1 marking verification
tonyp
parents: 2883
diff changeset
   782
void HeapRegion::verify(bool allow_dirty) const {
4023
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 3697
diff changeset
   783
  bool dummy = false;
9995
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
   784
  verify(allow_dirty, VerifyOption_G1UsePrevMarking, /* failures */ &dummy);
3000
bbce6052b595 6850846: G1: extend G1 marking verification
tonyp
parents: 2883
diff changeset
   785
}
bbce6052b595 6850846: G1: extend G1 marking verification
tonyp
parents: 2883
diff changeset
   786
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   787
// This really ought to be commoned up into OffsetTableContigSpace somehow.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   788
// 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
   789
4023
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 3697
diff changeset
   790
void HeapRegion::verify(bool allow_dirty,
9995
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
   791
                        VerifyOption vo,
4023
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 3697
diff changeset
   792
                        bool* failures) const {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   793
  G1CollectedHeap* g1 = G1CollectedHeap::heap();
4023
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 3697
diff changeset
   794
  *failures = false;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   795
  HeapWord* p = bottom();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   796
  HeapWord* prev_p = NULL;
9995
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
   797
  VerifyLiveClosure vl_cl(g1, vo);
6260
fba83fd3adc7 6974928: G1: sometimes humongous objects are allocated in young regions
tonyp
parents: 6247
diff changeset
   798
  bool is_humongous = isHumongous();
7904
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   799
  bool do_bot_verify = !is_young();
6260
fba83fd3adc7 6974928: G1: sometimes humongous objects are allocated in young regions
tonyp
parents: 6247
diff changeset
   800
  size_t object_num = 0;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   801
  while (p < top()) {
7904
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   802
    oop obj = oop(p);
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   803
    size_t obj_size = obj->size();
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   804
    object_num += 1;
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   805
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   806
    if (is_humongous != g1->isHumongous(obj_size)) {
6260
fba83fd3adc7 6974928: G1: sometimes humongous objects are allocated in young regions
tonyp
parents: 6247
diff changeset
   807
      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
   808
                             SIZE_FORMAT" words) in a %shumongous region",
7904
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   809
                             p, g1->isHumongous(obj_size) ? "" : "non-",
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   810
                             obj_size, is_humongous ? "" : "non-");
6260
fba83fd3adc7 6974928: G1: sometimes humongous objects are allocated in young regions
tonyp
parents: 6247
diff changeset
   811
       *failures = true;
7904
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   812
       return;
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   813
    }
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   814
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   815
    // If it returns false, verify_for_object() will output the
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   816
    // appropriate messasge.
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   817
    if (do_bot_verify && !_offsets.verify_for_object(p, obj_size)) {
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   818
      *failures = true;
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   819
      return;
6260
fba83fd3adc7 6974928: G1: sometimes humongous objects are allocated in young regions
tonyp
parents: 6247
diff changeset
   820
    }
7904
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   821
9995
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
   822
    if (!g1->is_obj_dead_cond(obj, this, vo)) {
7904
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   823
      if (obj->is_oop()) {
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   824
        klassOop klass = obj->klass();
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   825
        if (!klass->is_perm()) {
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   826
          gclog_or_tty->print_cr("klass "PTR_FORMAT" of object "PTR_FORMAT" "
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   827
                                 "not in perm", klass, obj);
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   828
          *failures = true;
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   829
          return;
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   830
        } else if (!klass->is_klass()) {
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   831
          gclog_or_tty->print_cr("klass "PTR_FORMAT" of object "PTR_FORMAT" "
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   832
                                 "not a klass", klass, obj);
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   833
          *failures = true;
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   834
          return;
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   835
        } else {
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   836
          vl_cl.set_containing_obj(obj);
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   837
          obj->oop_iterate(&vl_cl);
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   838
          if (vl_cl.failures()) {
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   839
            *failures = true;
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   840
          }
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   841
          if (G1MaxVerifyFailures >= 0 &&
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   842
              vl_cl.n_failures() >= G1MaxVerifyFailures) {
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   843
            return;
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   844
          }
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   845
        }
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   846
      } else {
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   847
        gclog_or_tty->print_cr(PTR_FORMAT" no an oop", obj);
4023
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 3697
diff changeset
   848
        *failures = true;
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 3697
diff changeset
   849
        return;
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 3697
diff changeset
   850
      }
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   851
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   852
    prev_p = p;
7904
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   853
    p += obj_size;
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   854
  }
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   855
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   856
  if (p != top()) {
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   857
    gclog_or_tty->print_cr("end of last object "PTR_FORMAT" "
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   858
                           "does not match top "PTR_FORMAT, p, top());
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   859
    *failures = true;
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   860
    return;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   861
  }
7904
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   862
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   863
  HeapWord* the_end = end();
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   864
  assert(p == top(), "it should still hold");
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   865
  // Do some extra BOT consistency checking for addresses in the
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   866
  // range [top, end). BOT look-ups in this range should yield
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   867
  // top. No point in doing that if top == end (there's nothing there).
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   868
  if (p < the_end) {
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   869
    // Look up top
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   870
    HeapWord* addr_1 = p;
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   871
    HeapWord* b_start_1 = _offsets.block_start_const(addr_1);
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   872
    if (b_start_1 != p) {
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   873
      gclog_or_tty->print_cr("BOT look up for top: "PTR_FORMAT" "
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   874
                             " yielded "PTR_FORMAT", expecting "PTR_FORMAT,
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   875
                             addr_1, b_start_1, p);
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   876
      *failures = true;
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   877
      return;
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   878
    }
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   879
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   880
    // Look up top + 1
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   881
    HeapWord* addr_2 = p + 1;
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   882
    if (addr_2 < the_end) {
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   883
      HeapWord* b_start_2 = _offsets.block_start_const(addr_2);
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   884
      if (b_start_2 != p) {
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   885
        gclog_or_tty->print_cr("BOT look up for top + 1: "PTR_FORMAT" "
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   886
                               " yielded "PTR_FORMAT", expecting "PTR_FORMAT,
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   887
                               addr_2, b_start_2, p);
4023
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 3697
diff changeset
   888
        *failures = true;
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 3697
diff changeset
   889
        return;
7904
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   890
      }
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   891
    }
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   892
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   893
    // Look up an address between top and end
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   894
    size_t diff = pointer_delta(the_end, p) / 2;
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   895
    HeapWord* addr_3 = p + diff;
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   896
    if (addr_3 < the_end) {
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   897
      HeapWord* b_start_3 = _offsets.block_start_const(addr_3);
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   898
      if (b_start_3 != p) {
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   899
        gclog_or_tty->print_cr("BOT look up for top + diff: "PTR_FORMAT" "
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   900
                               " yielded "PTR_FORMAT", expecting "PTR_FORMAT,
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   901
                               addr_3, b_start_3, p);
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   902
        *failures = true;
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   903
        return;
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   904
      }
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   905
    }
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   906
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   907
    // Loook up end - 1
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   908
    HeapWord* addr_4 = the_end - 1;
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   909
    HeapWord* b_start_4 = _offsets.block_start_const(addr_4);
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   910
    if (b_start_4 != p) {
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   911
      gclog_or_tty->print_cr("BOT look up for end - 1: "PTR_FORMAT" "
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   912
                             " yielded "PTR_FORMAT", expecting "PTR_FORMAT,
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   913
                             addr_4, b_start_4, p);
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   914
      *failures = true;
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   915
      return;
4023
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 3697
diff changeset
   916
    }
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   917
  }
4023
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 3697
diff changeset
   918
6260
fba83fd3adc7 6974928: G1: sometimes humongous objects are allocated in young regions
tonyp
parents: 6247
diff changeset
   919
  if (is_humongous && object_num > 1) {
fba83fd3adc7 6974928: G1: sometimes humongous objects are allocated in young regions
tonyp
parents: 6247
diff changeset
   920
    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
   921
                           "but has "SIZE_FORMAT", objects",
fba83fd3adc7 6974928: G1: sometimes humongous objects are allocated in young regions
tonyp
parents: 6247
diff changeset
   922
                           bottom(), end(), object_num);
fba83fd3adc7 6974928: G1: sometimes humongous objects are allocated in young regions
tonyp
parents: 6247
diff changeset
   923
    *failures = true;
4023
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 3697
diff changeset
   924
    return;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   925
  }
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
// G1OffsetTableContigSpace code; copied from space.cpp.  Hope this can go
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   929
// away eventually.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   930
1388
tonyp
parents: 1387
diff changeset
   931
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
   932
  // false ==> we'll do the clearing if there's clearing to be done.
1388
tonyp
parents: 1387
diff changeset
   933
  ContiguousSpace::initialize(mr, false, mangle_space);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   934
  _offsets.zero_bottom_entry();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   935
  _offsets.initialize_threshold();
1388
tonyp
parents: 1387
diff changeset
   936
  if (clear_space) clear(mangle_space);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   937
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   938
1388
tonyp
parents: 1387
diff changeset
   939
void G1OffsetTableContigSpace::clear(bool mangle_space) {
tonyp
parents: 1387
diff changeset
   940
  ContiguousSpace::clear(mangle_space);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   941
  _offsets.zero_bottom_entry();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   942
  _offsets.initialize_threshold();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   943
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   944
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   945
void G1OffsetTableContigSpace::set_bottom(HeapWord* new_bottom) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   946
  Space::set_bottom(new_bottom);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   947
  _offsets.set_bottom(new_bottom);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   948
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   949
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   950
void G1OffsetTableContigSpace::set_end(HeapWord* new_end) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   951
  Space::set_end(new_end);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   952
  _offsets.resize(new_end - bottom());
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   953
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   954
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   955
void G1OffsetTableContigSpace::print() const {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   956
  print_short();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   957
  gclog_or_tty->print_cr(" [" INTPTR_FORMAT ", " INTPTR_FORMAT ", "
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   958
                INTPTR_FORMAT ", " INTPTR_FORMAT ")",
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   959
                bottom(), top(), _offsets.threshold(), end());
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   960
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   961
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   962
HeapWord* G1OffsetTableContigSpace::initialize_threshold() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   963
  return _offsets.initialize_threshold();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   964
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   965
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   966
HeapWord* G1OffsetTableContigSpace::cross_threshold(HeapWord* start,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   967
                                                    HeapWord* end) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   968
  _offsets.alloc_block(start, end);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   969
  return _offsets.threshold();
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
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   972
HeapWord* G1OffsetTableContigSpace::saved_mark_word() const {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   973
  G1CollectedHeap* g1h = G1CollectedHeap::heap();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   974
  assert( _gc_time_stamp <= g1h->get_gc_time_stamp(), "invariant" );
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   975
  if (_gc_time_stamp < g1h->get_gc_time_stamp())
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   976
    return top();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   977
  else
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   978
    return ContiguousSpace::saved_mark_word();
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
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   981
void G1OffsetTableContigSpace::set_saved_mark() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   982
  G1CollectedHeap* g1h = G1CollectedHeap::heap();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   983
  unsigned curr_gc_time_stamp = g1h->get_gc_time_stamp();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   984
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   985
  if (_gc_time_stamp < curr_gc_time_stamp) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   986
    // The order of these is important, as another thread might be
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   987
    // about to start scanning this region. If it does so after
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   988
    // set_saved_mark and before _gc_time_stamp = ..., then the latter
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   989
    // 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
   990
    // 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
   991
    // 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
   992
    // of the region. Either way, the behaviour will be correct.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   993
    ContiguousSpace::set_saved_mark();
3262
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
   994
    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
   995
    _gc_time_stamp = curr_gc_time_stamp;
8928
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 7923
diff changeset
   996
    // No need to do another barrier to flush the writes above. If
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 7923
diff changeset
   997
    // this is called in parallel with other threads trying to
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 7923
diff changeset
   998
    // allocate into the region, the caller should call this while
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 7923
diff changeset
   999
    // holding a lock and when the lock is released the writes will be
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 7923
diff changeset
  1000
    // flushed.
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1001
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1002
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1003
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1004
G1OffsetTableContigSpace::
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1005
G1OffsetTableContigSpace(G1BlockOffsetSharedArray* sharedOffsetArray,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1006
                         MemRegion mr, bool is_zeroed) :
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1007
  _offsets(sharedOffsetArray, mr),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1008
  _par_alloc_lock(Mutex::leaf, "OffsetTableContigSpace par alloc lock", true),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1009
  _gc_time_stamp(0)
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1010
{
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1011
  _offsets.set_space(this);
1388
tonyp
parents: 1387
diff changeset
  1012
  initialize(mr, !is_zeroed, SpaceDecorator::Mangle);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1013
}