hotspot/src/share/vm/gc_implementation/g1/heapRegion.hpp
author johnc
Tue, 14 Jun 2011 11:01:10 -0700
changeset 9995 290620c08233
parent 9989 305a76435cf1
child 10243 d00a21009f1f
permissions -rw-r--r--
7004681: G1: Extend marking verification to Full GCs Summary: Perform a heap verification after the first phase of G1's full GC using objects' mark words to determine liveness. The third parameter of the heap verification routines, which was used in G1 to determine which marking bitmap to use in liveness calculations, has been changed from a boolean to an enum with values defined for using the mark word, and the 'prev' and 'next' bitmaps. Reviewed-by: tonyp, ysr
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
     1
/*
7904
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
     2
 * Copyright (c) 2001, 2011, 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: 5350
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 5350
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: 5350
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
#ifndef SHARE_VM_GC_IMPLEMENTATION_G1_HEAPREGION_HPP
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6983
diff changeset
    26
#define SHARE_VM_GC_IMPLEMENTATION_G1_HEAPREGION_HPP
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6983
diff changeset
    27
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6983
diff changeset
    28
#include "gc_implementation/g1/g1BlockOffsetTable.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6983
diff changeset
    29
#include "gc_implementation/g1/g1_specialized_oop_closures.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6983
diff changeset
    30
#include "gc_implementation/g1/survRateGroup.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6983
diff changeset
    31
#include "gc_implementation/shared/ageTable.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6983
diff changeset
    32
#include "gc_implementation/shared/spaceDecorator.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6983
diff changeset
    33
#include "memory/space.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6983
diff changeset
    34
#include "memory/watermark.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6983
diff changeset
    35
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    36
#ifndef SERIALGC
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    37
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    38
// A HeapRegion is the smallest piece of a G1CollectedHeap that
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    39
// can be collected independently.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    40
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    41
// NOTE: Although a HeapRegion is a Space, its
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    42
// Space::initDirtyCardClosure method must not be called.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    43
// The problem is that the existence of this method breaks
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    44
// the independence of barrier sets from remembered sets.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    45
// The solution is to remove this method from the definition
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    46
// of a Space.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    47
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    48
class CompactibleSpace;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    49
class ContiguousSpace;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    50
class HeapRegionRemSet;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    51
class HeapRegionRemSetIterator;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    52
class HeapRegion;
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7905
diff changeset
    53
class HeapRegionSetBase;
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7905
diff changeset
    54
9989
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9418
diff changeset
    55
#define HR_FORMAT SIZE_FORMAT":(%s)["PTR_FORMAT","PTR_FORMAT","PTR_FORMAT"]"
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9418
diff changeset
    56
#define HR_FORMAT_PARAMS(_hr_) \
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9418
diff changeset
    57
                (_hr_)->hrs_index(), \
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9418
diff changeset
    58
                (_hr_)->is_survivor() ? "S" : (_hr_)->is_young() ? "E" : "-", \
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9418
diff changeset
    59
                (_hr_)->bottom(), (_hr_)->top(), (_hr_)->end()
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    60
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    61
// A dirty card to oop closure for heap regions. It
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    62
// knows how to get the G1 heap and how to use the bitmap
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    63
// in the concurrent marker used by G1 to filter remembered
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    64
// sets.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    65
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    66
class HeapRegionDCTOC : public ContiguousSpaceDCTOC {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    67
public:
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    68
  // Specification of possible DirtyCardToOopClosure filtering.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    69
  enum FilterKind {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    70
    NoFilterKind,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    71
    IntoCSFilterKind,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    72
    OutOfRegionFilterKind
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    73
  };
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    74
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    75
protected:
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    76
  HeapRegion* _hr;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    77
  FilterKind _fk;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    78
  G1CollectedHeap* _g1;
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
  void walk_mem_region_with_cl(MemRegion mr,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    81
                               HeapWord* bottom, HeapWord* top,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    82
                               OopClosure* cl);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    83
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    84
  // We don't specialize this for FilteringClosure; filtering is handled by
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    85
  // the "FilterKind" mechanism.  But we provide this to avoid a compiler
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    86
  // warning.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    87
  void walk_mem_region_with_cl(MemRegion mr,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    88
                               HeapWord* bottom, HeapWord* top,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    89
                               FilteringClosure* cl) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    90
    HeapRegionDCTOC::walk_mem_region_with_cl(mr, bottom, top,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    91
                                                       (OopClosure*)cl);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    92
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    93
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    94
  // Get the actual top of the area on which the closure will
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    95
  // operate, given where the top is assumed to be (the end of the
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    96
  // memory region passed to do_MemRegion) and where the object
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    97
  // at the top is assumed to start. For example, an object may
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    98
  // start at the top but actually extend past the assumed top,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    99
  // in which case the top becomes the end of the object.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   100
  HeapWord* get_actual_top(HeapWord* top, HeapWord* top_obj) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   101
    return ContiguousSpaceDCTOC::get_actual_top(top, top_obj);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   102
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   103
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   104
  // Walk the given memory region from bottom to (actual) top
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   105
  // looking for objects and applying the oop closure (_cl) to
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   106
  // them. The base implementation of this treats the area as
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   107
  // blocks, where a block may or may not be an object. Sub-
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   108
  // classes should override this to provide more accurate
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   109
  // or possibly more efficient walking.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   110
  void walk_mem_region(MemRegion mr, HeapWord* bottom, HeapWord* top) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   111
    Filtering_DCTOC::walk_mem_region(mr, bottom, top);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   112
  }
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
public:
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   115
  HeapRegionDCTOC(G1CollectedHeap* g1,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   116
                  HeapRegion* hr, OopClosure* cl,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   117
                  CardTableModRefBS::PrecisionStyle precision,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   118
                  FilterKind fk);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   119
};
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   120
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   121
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   122
// The complicating factor is that BlockOffsetTable diverged
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   123
// significantly, and we need functionality that is only in the G1 version.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   124
// So I copied that code, which led to an alternate G1 version of
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   125
// OffsetTableContigSpace.  If the two versions of BlockOffsetTable could
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   126
// be reconciled, then G1OffsetTableContigSpace could go away.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   127
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   128
// The idea behind time stamps is the following. Doing a save_marks on
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   129
// all regions at every GC pause is time consuming (if I remember
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   130
// well, 10ms or so). So, we would like to do that only for regions
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   131
// that are GC alloc regions. To achieve this, we use time
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   132
// stamps. For every evacuation pause, G1CollectedHeap generates a
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   133
// unique time stamp (essentially a counter that gets
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   134
// incremented). Every time we want to call save_marks on a region,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   135
// we set the saved_mark_word to top and also copy the current GC
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   136
// time stamp to the time stamp field of the space. Reading the
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   137
// saved_mark_word involves checking the time stamp of the
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   138
// region. If it is the same as the current GC time stamp, then we
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   139
// can safely read the saved_mark_word field, as it is valid. If the
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   140
// time stamp of the region is not the same as the current GC time
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   141
// stamp, then we instead read top, as the saved_mark_word field is
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   142
// invalid. Time stamps (on the regions and also on the
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   143
// G1CollectedHeap) are reset at every cleanup (we iterate over
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   144
// the regions anyway) and at the end of a Full GC. The current scheme
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   145
// that uses sequential unsigned ints will fail only if we have 4b
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   146
// evacuation pauses between two cleanups, which is _highly_ unlikely.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   147
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   148
class G1OffsetTableContigSpace: public ContiguousSpace {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   149
  friend class VMStructs;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   150
 protected:
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   151
  G1BlockOffsetArrayContigSpace _offsets;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   152
  Mutex _par_alloc_lock;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   153
  volatile unsigned _gc_time_stamp;
8928
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8680
diff changeset
   154
  // When we need to retire an allocation region, while other threads
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8680
diff changeset
   155
  // are also concurrently trying to allocate into it, we typically
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8680
diff changeset
   156
  // allocate a dummy object at the end of the region to ensure that
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8680
diff changeset
   157
  // no more allocations can take place in it. However, sometimes we
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8680
diff changeset
   158
  // want to know where the end of the last "real" object we allocated
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8680
diff changeset
   159
  // into the region was and this is what this keeps track.
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8680
diff changeset
   160
  HeapWord* _pre_dummy_top;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   161
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   162
 public:
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   163
  // Constructor.  If "is_zeroed" is true, the MemRegion "mr" may be
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   164
  // assumed to contain zeros.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   165
  G1OffsetTableContigSpace(G1BlockOffsetSharedArray* sharedOffsetArray,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   166
                           MemRegion mr, bool is_zeroed = false);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   167
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   168
  void set_bottom(HeapWord* value);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   169
  void set_end(HeapWord* value);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   170
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   171
  virtual HeapWord* saved_mark_word() const;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   172
  virtual void set_saved_mark();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   173
  void reset_gc_time_stamp() { _gc_time_stamp = 0; }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   174
8928
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8680
diff changeset
   175
  // See the comment above in the declaration of _pre_dummy_top for an
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8680
diff changeset
   176
  // explanation of what it is.
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8680
diff changeset
   177
  void set_pre_dummy_top(HeapWord* pre_dummy_top) {
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8680
diff changeset
   178
    assert(is_in(pre_dummy_top) && pre_dummy_top <= top(), "pre-condition");
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8680
diff changeset
   179
    _pre_dummy_top = pre_dummy_top;
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8680
diff changeset
   180
  }
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8680
diff changeset
   181
  HeapWord* pre_dummy_top() {
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8680
diff changeset
   182
    return (_pre_dummy_top == NULL) ? top() : _pre_dummy_top;
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8680
diff changeset
   183
  }
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8680
diff changeset
   184
  void reset_pre_dummy_top() { _pre_dummy_top = NULL; }
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8680
diff changeset
   185
1388
tonyp
parents: 1387
diff changeset
   186
  virtual void initialize(MemRegion mr, bool clear_space, bool mangle_space);
tonyp
parents: 1387
diff changeset
   187
  virtual void clear(bool mangle_space);
1374
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
  HeapWord* block_start(const void* p);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   190
  HeapWord* block_start_const(const void* p) const;
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
  // Add offset table update.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   193
  virtual HeapWord* allocate(size_t word_size);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   194
  HeapWord* par_allocate(size_t word_size);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   195
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   196
  // MarkSweep support phase3
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   197
  virtual HeapWord* initialize_threshold();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   198
  virtual HeapWord* cross_threshold(HeapWord* start, HeapWord* end);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   199
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   200
  virtual void print() const;
7904
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   201
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   202
  void reset_bot() {
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   203
    _offsets.zero_bottom_entry();
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   204
    _offsets.initialize_threshold();
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   205
  }
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   206
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   207
  void update_bot_for_object(HeapWord* start, size_t word_size) {
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   208
    _offsets.alloc_block(start, word_size);
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   209
  }
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   210
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   211
  void print_bot_on(outputStream* out) {
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   212
    _offsets.print_on(out);
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   213
  }
1374
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
class HeapRegion: public G1OffsetTableContigSpace {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   217
  friend class VMStructs;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   218
 private:
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   219
1387
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1374
diff changeset
   220
  enum HumongousType {
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1374
diff changeset
   221
    NotHumongous = 0,
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1374
diff changeset
   222
    StartsHumongous,
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1374
diff changeset
   223
    ContinuesHumongous
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1374
diff changeset
   224
  };
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1374
diff changeset
   225
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   226
  // The next filter kind that should be used for a "new_dcto_cl" call with
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   227
  // the "traditional" signature.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   228
  HeapRegionDCTOC::FilterKind _next_fk;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   229
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   230
  // Requires that the region "mr" be dense with objects, and begin and end
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   231
  // with an object.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   232
  void oops_in_mr_iterate(MemRegion mr, OopClosure* cl);
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
  // The remembered set for this region.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   235
  // (Might want to make this "inline" later, to avoid some alloc failure
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   236
  // issues.)
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   237
  HeapRegionRemSet* _rem_set;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   238
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   239
  G1BlockOffsetArrayContigSpace* offsets() { return &_offsets; }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   240
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   241
 protected:
9989
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9418
diff changeset
   242
  // The index of this region in the heap region sequence.
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9418
diff changeset
   243
  size_t  _hrs_index;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   244
1387
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1374
diff changeset
   245
  HumongousType _humongous_type;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   246
  // For a humongous region, region in which it starts.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   247
  HeapRegion* _humongous_start_region;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   248
  // For the start region of a humongous sequence, it's original end().
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   249
  HeapWord* _orig_end;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   250
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   251
  // True iff the region is in current collection_set.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   252
  bool _in_collection_set;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   253
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   254
  // Is this or has it been an allocation region in the current collection
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   255
  // pause.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   256
  bool _is_gc_alloc_region;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   257
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   258
  // True iff an attempt to evacuate an object in the region failed.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   259
  bool _evacuation_failed;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   260
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   261
  // A heap region may be a member one of a number of special subsets, each
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   262
  // represented as linked lists through the field below.  Currently, these
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   263
  // sets include:
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   264
  //   The collection set.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   265
  //   The set of allocation regions used in a collection pause.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   266
  //   Spaces that may contain gray objects.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   267
  HeapRegion* _next_in_special_set;
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
  // next region in the young "generation" region set
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   270
  HeapRegion* _next_young_region;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   271
2883
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2344
diff changeset
   272
  // Next region whose cards need cleaning
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2344
diff changeset
   273
  HeapRegion* _next_dirty_cards_region;
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2344
diff changeset
   274
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7905
diff changeset
   275
  // Fields used by the HeapRegionSetBase class and subclasses.
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7905
diff changeset
   276
  HeapRegion* _next;
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7905
diff changeset
   277
#ifdef ASSERT
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7905
diff changeset
   278
  HeapRegionSetBase* _containing_set;
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7905
diff changeset
   279
#endif // ASSERT
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7905
diff changeset
   280
  bool _pending_removal;
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7905
diff changeset
   281
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   282
  // For parallel heapRegion traversal.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   283
  jint _claimed;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   284
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   285
  // We use concurrent marking to determine the amount of live data
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   286
  // in each heap region.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   287
  size_t _prev_marked_bytes;    // Bytes known to be live via last completed marking.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   288
  size_t _next_marked_bytes;    // Bytes known to be live via in-progress marking.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   289
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   290
  // See "sort_index" method.  -1 means is not in the array.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   291
  int _sort_index;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   292
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   293
  // <PREDICTION>
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   294
  double _gc_efficiency;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   295
  // </PREDICTION>
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   296
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   297
  enum YoungType {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   298
    NotYoung,                   // a region is not young
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   299
    Young,                      // a region is young
9989
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9418
diff changeset
   300
    Survivor                    // a region is young and it contains survivors
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   301
  };
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   302
6068
80ef41e75a2d 6956639: G1: assert(cached_ptr != card_ptr) failed: shouldn't be, concurrentG1Refine.cpp:307
johnc
parents: 5547
diff changeset
   303
  volatile YoungType _young_type;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   304
  int  _young_index_in_cset;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   305
  SurvRateGroup* _surv_rate_group;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   306
  int  _age_index;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   307
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   308
  // The start of the unmarked area. The unmarked area extends from this
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   309
  // word until the top and/or end of the region, and is the part
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   310
  // of the region for which no marking was done, i.e. objects may
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   311
  // have been allocated in this part since the last mark phase.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   312
  // "prev" is the top at the start of the last completed marking.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   313
  // "next" is the top at the start of the in-progress marking (if any.)
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   314
  HeapWord* _prev_top_at_mark_start;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   315
  HeapWord* _next_top_at_mark_start;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   316
  // If a collection pause is in progress, this is the top at the start
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   317
  // of that pause.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   318
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   319
  // We've counted the marked bytes of objects below here.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   320
  HeapWord* _top_at_conc_mark_count;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   321
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   322
  void init_top_at_mark_start() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   323
    assert(_prev_marked_bytes == 0 &&
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   324
           _next_marked_bytes == 0,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   325
           "Must be called after zero_marked_bytes.");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   326
    HeapWord* bot = bottom();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   327
    _prev_top_at_mark_start = bot;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   328
    _next_top_at_mark_start = bot;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   329
    _top_at_conc_mark_count = bot;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   330
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   331
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   332
  void set_young_type(YoungType new_type) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   333
    //assert(_young_type != new_type, "setting the same type" );
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   334
    // TODO: add more assertions here
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   335
    _young_type = new_type;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   336
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   337
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 4024
diff changeset
   338
  // Cached attributes used in the collection set policy information
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 4024
diff changeset
   339
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 4024
diff changeset
   340
  // The RSet length that was added to the total value
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 4024
diff changeset
   341
  // for the collection set.
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 4024
diff changeset
   342
  size_t _recorded_rs_length;
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 4024
diff changeset
   343
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 4024
diff changeset
   344
  // The predicted elapsed time that was added to total value
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 4024
diff changeset
   345
  // for the collection set.
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 4024
diff changeset
   346
  double _predicted_elapsed_time_ms;
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 4024
diff changeset
   347
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 4024
diff changeset
   348
  // The predicted number of bytes to copy that was added to
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 4024
diff changeset
   349
  // the total value for the collection set.
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 4024
diff changeset
   350
  size_t _predicted_bytes_to_copy;
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 4024
diff changeset
   351
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   352
 public:
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   353
  // If "is_zeroed" is "true", the region "mr" can be assumed to contain zeros.
9989
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9418
diff changeset
   354
  HeapRegion(size_t hrs_index,
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9418
diff changeset
   355
             G1BlockOffsetSharedArray* sharedOffsetArray,
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   356
             MemRegion mr, bool is_zeroed);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   357
3697
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3000
diff changeset
   358
  static int LogOfHRGrainBytes;
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3000
diff changeset
   359
  static int LogOfHRGrainWords;
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3000
diff changeset
   360
  // The normal type of these should be size_t. However, they used to
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3000
diff changeset
   361
  // be members of an enum before and they are assumed by the
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3000
diff changeset
   362
  // compilers to be ints. To avoid going and fixing all their uses,
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3000
diff changeset
   363
  // I'm declaring them as ints. I'm not anticipating heap region
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3000
diff changeset
   364
  // sizes to reach anywhere near 2g, so using an int here is safe.
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3000
diff changeset
   365
  static int GrainBytes;
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3000
diff changeset
   366
  static int GrainWords;
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3000
diff changeset
   367
  static int CardsPerRegion;
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3000
diff changeset
   368
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3000
diff changeset
   369
  // It sets up the heap region size (GrainBytes / GrainWords), as
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3000
diff changeset
   370
  // well as other related fields that are based on the heap region
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3000
diff changeset
   371
  // size (LogOfHRGrainBytes / LogOfHRGrainWords /
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3000
diff changeset
   372
  // CardsPerRegion). All those fields are considered constant
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3000
diff changeset
   373
  // throughout the JVM's execution, therefore they should only be set
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3000
diff changeset
   374
  // up once during initialization time.
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3000
diff changeset
   375
  static void setup_heap_region_size(uintx min_heap_size);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   376
1387
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1374
diff changeset
   377
  enum ClaimValues {
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1374
diff changeset
   378
    InitialClaimValue     = 0,
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1374
diff changeset
   379
    FinalCountClaimValue  = 1,
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1374
diff changeset
   380
    NoteEndClaimValue     = 2,
1422
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1388
diff changeset
   381
    ScrubRemSetClaimValue = 3,
2152
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2013
diff changeset
   382
    ParVerifyClaimValue   = 4,
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2013
diff changeset
   383
    RebuildRSClaimValue   = 5
1387
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1374
diff changeset
   384
  };
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1374
diff changeset
   385
7905
cc7740616b03 6994297: G1: do first-level slow-path allocations with a CAS
tonyp
parents: 7904
diff changeset
   386
  inline HeapWord* par_allocate_no_bot_updates(size_t word_size) {
cc7740616b03 6994297: G1: do first-level slow-path allocations with a CAS
tonyp
parents: 7904
diff changeset
   387
    assert(is_young(), "we can only skip BOT updates on young regions");
cc7740616b03 6994297: G1: do first-level slow-path allocations with a CAS
tonyp
parents: 7904
diff changeset
   388
    return ContiguousSpace::par_allocate(word_size);
cc7740616b03 6994297: G1: do first-level slow-path allocations with a CAS
tonyp
parents: 7904
diff changeset
   389
  }
cc7740616b03 6994297: G1: do first-level slow-path allocations with a CAS
tonyp
parents: 7904
diff changeset
   390
  inline HeapWord* allocate_no_bot_updates(size_t word_size) {
cc7740616b03 6994297: G1: do first-level slow-path allocations with a CAS
tonyp
parents: 7904
diff changeset
   391
    assert(is_young(), "we can only skip BOT updates on young regions");
cc7740616b03 6994297: G1: do first-level slow-path allocations with a CAS
tonyp
parents: 7904
diff changeset
   392
    return ContiguousSpace::allocate(word_size);
cc7740616b03 6994297: G1: do first-level slow-path allocations with a CAS
tonyp
parents: 7904
diff changeset
   393
  }
cc7740616b03 6994297: G1: do first-level slow-path allocations with a CAS
tonyp
parents: 7904
diff changeset
   394
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   395
  // If this region is a member of a HeapRegionSeq, the index in that
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   396
  // sequence, otherwise -1.
9989
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9418
diff changeset
   397
  size_t hrs_index() const { return _hrs_index; }
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   398
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   399
  // The number of bytes marked live in the region in the last marking phase.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   400
  size_t marked_bytes()    { return _prev_marked_bytes; }
8930
52368505ee8e 7027766: G1: introduce flag to dump the liveness information per region at the end of marking
tonyp
parents: 8928
diff changeset
   401
  size_t live_bytes() {
52368505ee8e 7027766: G1: introduce flag to dump the liveness information per region at the end of marking
tonyp
parents: 8928
diff changeset
   402
    return (top() - prev_top_at_mark_start()) * HeapWordSize + marked_bytes();
52368505ee8e 7027766: G1: introduce flag to dump the liveness information per region at the end of marking
tonyp
parents: 8928
diff changeset
   403
  }
52368505ee8e 7027766: G1: introduce flag to dump the liveness information per region at the end of marking
tonyp
parents: 8928
diff changeset
   404
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   405
  // The number of bytes counted in the next marking.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   406
  size_t next_marked_bytes() { return _next_marked_bytes; }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   407
  // The number of bytes live wrt the next marking.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   408
  size_t next_live_bytes() {
8930
52368505ee8e 7027766: G1: introduce flag to dump the liveness information per region at the end of marking
tonyp
parents: 8928
diff changeset
   409
    return
52368505ee8e 7027766: G1: introduce flag to dump the liveness information per region at the end of marking
tonyp
parents: 8928
diff changeset
   410
      (top() - next_top_at_mark_start()) * HeapWordSize + next_marked_bytes();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   411
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   412
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   413
  // A lower bound on the amount of garbage bytes in the region.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   414
  size_t garbage_bytes() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   415
    size_t used_at_mark_start_bytes =
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   416
      (prev_top_at_mark_start() - bottom()) * HeapWordSize;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   417
    assert(used_at_mark_start_bytes >= marked_bytes(),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   418
           "Can't mark more than we have.");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   419
    return used_at_mark_start_bytes - marked_bytes();
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
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   422
  // An upper bound on the number of live bytes in the region.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   423
  size_t max_live_bytes() { return used() - garbage_bytes(); }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   424
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   425
  void add_to_marked_bytes(size_t incr_bytes) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   426
    _next_marked_bytes = _next_marked_bytes + incr_bytes;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   427
    guarantee( _next_marked_bytes <= used(), "invariant" );
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   428
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   429
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   430
  void zero_marked_bytes()      {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   431
    _prev_marked_bytes = _next_marked_bytes = 0;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   432
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   433
1387
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1374
diff changeset
   434
  bool isHumongous() const { return _humongous_type != NotHumongous; }
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1374
diff changeset
   435
  bool startsHumongous() const { return _humongous_type == StartsHumongous; }
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1374
diff changeset
   436
  bool continuesHumongous() const { return _humongous_type == ContinuesHumongous; }
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   437
  // For a humongous region, region in which it starts.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   438
  HeapRegion* humongous_start_region() const {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   439
    return _humongous_start_region;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   440
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   441
7904
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   442
  // Makes the current region be a "starts humongous" region, i.e.,
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   443
  // the first region in a series of one or more contiguous regions
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   444
  // that will contain a single "humongous" object. The two parameters
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   445
  // are as follows:
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   446
  //
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   447
  // new_top : The new value of the top field of this region which
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   448
  // points to the end of the humongous object that's being
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   449
  // allocated. If there is more than one region in the series, top
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   450
  // will lie beyond this region's original end field and on the last
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   451
  // region in the series.
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   452
  //
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   453
  // new_end : The new value of the end field of this region which
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   454
  // points to the end of the last region in the series. If there is
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   455
  // one region in the series (namely: this one) end will be the same
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   456
  // as the original end of this region.
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   457
  //
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   458
  // Updating top and end as described above makes this region look as
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   459
  // if it spans the entire space taken up by all the regions in the
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   460
  // series and an single allocation moved its top to new_top. This
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   461
  // ensures that the space (capacity / allocated) taken up by all
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   462
  // humongous regions can be calculated by just looking at the
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   463
  // "starts humongous" regions and by ignoring the "continues
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   464
  // humongous" regions.
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   465
  void set_startsHumongous(HeapWord* new_top, HeapWord* new_end);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   466
7904
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   467
  // Makes the current region be a "continues humongous'
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   468
  // region. first_hr is the "start humongous" region of the series
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   469
  // which this region will be part of.
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   470
  void set_continuesHumongous(HeapRegion* first_hr);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   471
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7905
diff changeset
   472
  // Unsets the humongous-related fields on the region.
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7905
diff changeset
   473
  void set_notHumongous();
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7905
diff changeset
   474
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   475
  // If the region has a remembered set, return a pointer to it.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   476
  HeapRegionRemSet* rem_set() const {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   477
    return _rem_set;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   478
  }
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
  // True iff the region is in current collection_set.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   481
  bool in_collection_set() const {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   482
    return _in_collection_set;
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
  void set_in_collection_set(bool b) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   485
    _in_collection_set = b;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   486
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   487
  HeapRegion* next_in_collection_set() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   488
    assert(in_collection_set(), "should only invoke on member of CS.");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   489
    assert(_next_in_special_set == NULL ||
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   490
           _next_in_special_set->in_collection_set(),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   491
           "Malformed CS.");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   492
    return _next_in_special_set;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   493
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   494
  void set_next_in_collection_set(HeapRegion* r) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   495
    assert(in_collection_set(), "should only invoke on member of CS.");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   496
    assert(r == NULL || r->in_collection_set(), "Malformed CS.");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   497
    _next_in_special_set = r;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   498
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   499
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   500
  // True iff it is or has been an allocation region in the current
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   501
  // collection pause.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   502
  bool is_gc_alloc_region() const {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   503
    return _is_gc_alloc_region;
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
  void set_is_gc_alloc_region(bool b) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   506
    _is_gc_alloc_region = b;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   507
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   508
  HeapRegion* next_gc_alloc_region() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   509
    assert(is_gc_alloc_region(), "should only invoke on member of CS.");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   510
    assert(_next_in_special_set == NULL ||
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   511
           _next_in_special_set->is_gc_alloc_region(),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   512
           "Malformed CS.");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   513
    return _next_in_special_set;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   514
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   515
  void set_next_gc_alloc_region(HeapRegion* r) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   516
    assert(is_gc_alloc_region(), "should only invoke on member of CS.");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   517
    assert(r == NULL || r->is_gc_alloc_region(), "Malformed CS.");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   518
    _next_in_special_set = r;
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
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7905
diff changeset
   521
  // Methods used by the HeapRegionSetBase class and subclasses.
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   522
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7905
diff changeset
   523
  // Getter and setter for the next field used to link regions into
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7905
diff changeset
   524
  // linked lists.
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7905
diff changeset
   525
  HeapRegion* next()              { return _next; }
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7905
diff changeset
   526
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7905
diff changeset
   527
  void set_next(HeapRegion* next) { _next = next; }
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   528
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7905
diff changeset
   529
  // Every region added to a set is tagged with a reference to that
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7905
diff changeset
   530
  // set. This is used for doing consistency checking to make sure that
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7905
diff changeset
   531
  // the contents of a set are as they should be and it's only
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7905
diff changeset
   532
  // available in non-product builds.
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7905
diff changeset
   533
#ifdef ASSERT
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7905
diff changeset
   534
  void set_containing_set(HeapRegionSetBase* containing_set) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7905
diff changeset
   535
    assert((containing_set == NULL && _containing_set != NULL) ||
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7905
diff changeset
   536
           (containing_set != NULL && _containing_set == NULL),
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7905
diff changeset
   537
           err_msg("containing_set: "PTR_FORMAT" "
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7905
diff changeset
   538
                   "_containing_set: "PTR_FORMAT,
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7905
diff changeset
   539
                   containing_set, _containing_set));
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7905
diff changeset
   540
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7905
diff changeset
   541
    _containing_set = containing_set;
8680
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 7923
diff changeset
   542
  }
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   543
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7905
diff changeset
   544
  HeapRegionSetBase* containing_set() { return _containing_set; }
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7905
diff changeset
   545
#else // ASSERT
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7905
diff changeset
   546
  void set_containing_set(HeapRegionSetBase* containing_set) { }
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   547
8680
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 7923
diff changeset
   548
  // containing_set() is only used in asserts so there's no reason
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7905
diff changeset
   549
  // to provide a dummy version of it.
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7905
diff changeset
   550
#endif // ASSERT
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   551
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7905
diff changeset
   552
  // If we want to remove regions from a list in bulk we can simply tag
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7905
diff changeset
   553
  // them with the pending_removal tag and call the
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7905
diff changeset
   554
  // remove_all_pending() method on the list.
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   555
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7905
diff changeset
   556
  bool pending_removal() { return _pending_removal; }
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7905
diff changeset
   557
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7905
diff changeset
   558
  void set_pending_removal(bool pending_removal) {
8680
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 7923
diff changeset
   559
    if (pending_removal) {
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 7923
diff changeset
   560
      assert(!_pending_removal && containing_set() != NULL,
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 7923
diff changeset
   561
             "can only set pending removal to true if it's false and "
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 7923
diff changeset
   562
             "the region belongs to a region set");
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 7923
diff changeset
   563
    } else {
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 7923
diff changeset
   564
      assert( _pending_removal && containing_set() == NULL,
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 7923
diff changeset
   565
              "can only set pending removal to false if it's true and "
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 7923
diff changeset
   566
              "the region does not belong to a region set");
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 7923
diff changeset
   567
    }
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7905
diff changeset
   568
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7905
diff changeset
   569
    _pending_removal = pending_removal;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   570
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   571
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   572
  HeapRegion* get_next_young_region() { return _next_young_region; }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   573
  void set_next_young_region(HeapRegion* hr) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   574
    _next_young_region = hr;
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
2883
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2344
diff changeset
   577
  HeapRegion* get_next_dirty_cards_region() const { return _next_dirty_cards_region; }
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2344
diff changeset
   578
  HeapRegion** next_dirty_cards_region_addr() { return &_next_dirty_cards_region; }
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2344
diff changeset
   579
  void set_next_dirty_cards_region(HeapRegion* hr) { _next_dirty_cards_region = hr; }
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2344
diff changeset
   580
  bool is_on_dirty_cards_region_list() const { return get_next_dirty_cards_region() != NULL; }
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2344
diff changeset
   581
9989
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9418
diff changeset
   582
  HeapWord* orig_end() { return _orig_end; }
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9418
diff changeset
   583
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   584
  // Allows logical separation between objects allocated before and after.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   585
  void save_marks();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   586
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   587
  // Reset HR stuff to default values.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   588
  void hr_clear(bool par, bool clear_space);
9418
32a87dd6b746 7035144: G1: nightly failure: Non-dirty cards in region that should be dirty (failures still exist...)
tonyp
parents: 8930
diff changeset
   589
  void par_clear();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   590
1388
tonyp
parents: 1387
diff changeset
   591
  void initialize(MemRegion mr, bool clear_space, bool mangle_space);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   592
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   593
  // Get the start of the unmarked area in this region.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   594
  HeapWord* prev_top_at_mark_start() const { return _prev_top_at_mark_start; }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   595
  HeapWord* next_top_at_mark_start() const { return _next_top_at_mark_start; }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   596
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   597
  // Apply "cl->do_oop" to (the addresses of) all reference fields in objects
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   598
  // allocated in the current region before the last call to "save_mark".
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   599
  void oop_before_save_marks_iterate(OopClosure* cl);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   600
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   601
  // This call determines the "filter kind" argument that will be used for
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   602
  // the next call to "new_dcto_cl" on this region with the "traditional"
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   603
  // signature (i.e., the call below.)  The default, in the absence of a
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   604
  // preceding call to this method, is "NoFilterKind", and a call to this
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   605
  // method is necessary for each such call, or else it reverts to the
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   606
  // default.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   607
  // (This is really ugly, but all other methods I could think of changed a
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   608
  // lot of main-line code for G1.)
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   609
  void set_next_filter_kind(HeapRegionDCTOC::FilterKind nfk) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   610
    _next_fk = nfk;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   611
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   612
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   613
  DirtyCardToOopClosure*
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   614
  new_dcto_closure(OopClosure* cl,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   615
                   CardTableModRefBS::PrecisionStyle precision,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   616
                   HeapRegionDCTOC::FilterKind fk);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   617
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   618
#if WHASSUP
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   619
  DirtyCardToOopClosure*
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   620
  new_dcto_closure(OopClosure* cl,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   621
                   CardTableModRefBS::PrecisionStyle precision,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   622
                   HeapWord* boundary) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   623
    assert(boundary == NULL, "This arg doesn't make sense here.");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   624
    DirtyCardToOopClosure* res = new_dcto_closure(cl, precision, _next_fk);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   625
    _next_fk = HeapRegionDCTOC::NoFilterKind;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   626
    return res;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   627
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   628
#endif
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   629
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   630
  //
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   631
  // Note the start or end of marking. This tells the heap region
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   632
  // that the collector is about to start or has finished (concurrently)
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   633
  // marking the heap.
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
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   636
  // Note the start of a marking phase. Record the
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   637
  // start of the unmarked area of the region here.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   638
  void note_start_of_marking(bool during_initial_mark) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   639
    init_top_at_conc_mark_count();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   640
    _next_marked_bytes = 0;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   641
    if (during_initial_mark && is_young() && !is_survivor())
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   642
      _next_top_at_mark_start = bottom();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   643
    else
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   644
      _next_top_at_mark_start = top();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   645
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   646
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   647
  // Note the end of a marking phase. Install the start of
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   648
  // the unmarked area that was captured at start of marking.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   649
  void note_end_of_marking() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   650
    _prev_top_at_mark_start = _next_top_at_mark_start;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   651
    _prev_marked_bytes = _next_marked_bytes;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   652
    _next_marked_bytes = 0;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   653
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   654
    guarantee(_prev_marked_bytes <=
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   655
              (size_t) (prev_top_at_mark_start() - bottom()) * HeapWordSize,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   656
              "invariant");
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
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   659
  // After an evacuation, we need to update _next_top_at_mark_start
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   660
  // to be the current top.  Note this is only valid if we have only
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   661
  // ever evacuated into this region.  If we evacuate, allocate, and
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   662
  // then evacuate we are in deep doodoo.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   663
  void note_end_of_copying() {
4024
b90cfcea7031 6847956: G1: crash in oopDesc*G1ParCopyHelper::copy_to_survivor_space(oopDesc*)
tonyp
parents: 4023
diff changeset
   664
    assert(top() >= _next_top_at_mark_start, "Increase only");
b90cfcea7031 6847956: G1: crash in oopDesc*G1ParCopyHelper::copy_to_survivor_space(oopDesc*)
tonyp
parents: 4023
diff changeset
   665
    _next_top_at_mark_start = top();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   666
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   667
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   668
  // Returns "false" iff no object in the region was allocated when the
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   669
  // last mark phase ended.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   670
  bool is_marked() { return _prev_top_at_mark_start != bottom(); }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   671
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   672
  // If "is_marked()" is true, then this is the index of the region in
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   673
  // an array constructed at the end of marking of the regions in a
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   674
  // "desirability" order.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   675
  int sort_index() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   676
    return _sort_index;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   677
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   678
  void set_sort_index(int i) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   679
    _sort_index = i;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   680
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   681
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   682
  void init_top_at_conc_mark_count() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   683
    _top_at_conc_mark_count = bottom();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   684
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   685
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   686
  void set_top_at_conc_mark_count(HeapWord *cur) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   687
    assert(bottom() <= cur && cur <= end(), "Sanity.");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   688
    _top_at_conc_mark_count = cur;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   689
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   690
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   691
  HeapWord* top_at_conc_mark_count() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   692
    return _top_at_conc_mark_count;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   693
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   694
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   695
  void reset_during_compaction() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   696
    guarantee( isHumongous() && startsHumongous(),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   697
               "should only be called for humongous regions");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   698
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   699
    zero_marked_bytes();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   700
    init_top_at_mark_start();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   701
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   702
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   703
  // <PREDICTION>
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   704
  void calc_gc_efficiency(void);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   705
  double gc_efficiency() { return _gc_efficiency;}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   706
  // </PREDICTION>
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   707
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   708
  bool is_young() const     { return _young_type != NotYoung; }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   709
  bool is_survivor() const  { return _young_type == Survivor; }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   710
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   711
  int  young_index_in_cset() const { return _young_index_in_cset; }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   712
  void set_young_index_in_cset(int index) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   713
    assert( (index == -1) || is_young(), "pre-condition" );
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   714
    _young_index_in_cset = index;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   715
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   716
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   717
  int age_in_surv_rate_group() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   718
    assert( _surv_rate_group != NULL, "pre-condition" );
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   719
    assert( _age_index > -1, "pre-condition" );
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   720
    return _surv_rate_group->age_in_group(_age_index);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   721
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   722
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   723
  void record_surv_words_in_group(size_t words_survived) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   724
    assert( _surv_rate_group != NULL, "pre-condition" );
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   725
    assert( _age_index > -1, "pre-condition" );
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   726
    int age_in_group = age_in_surv_rate_group();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   727
    _surv_rate_group->record_surviving_words(age_in_group, words_survived);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   728
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   729
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   730
  int age_in_surv_rate_group_cond() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   731
    if (_surv_rate_group != NULL)
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   732
      return age_in_surv_rate_group();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   733
    else
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   734
      return -1;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   735
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   736
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   737
  SurvRateGroup* surv_rate_group() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   738
    return _surv_rate_group;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   739
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   740
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   741
  void install_surv_rate_group(SurvRateGroup* surv_rate_group) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   742
    assert( surv_rate_group != NULL, "pre-condition" );
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   743
    assert( _surv_rate_group == NULL, "pre-condition" );
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   744
    assert( is_young(), "pre-condition" );
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   745
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   746
    _surv_rate_group = surv_rate_group;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   747
    _age_index = surv_rate_group->next_age_index();
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
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   750
  void uninstall_surv_rate_group() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   751
    if (_surv_rate_group != NULL) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   752
      assert( _age_index > -1, "pre-condition" );
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   753
      assert( is_young(), "pre-condition" );
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   754
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   755
      _surv_rate_group = NULL;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   756
      _age_index = -1;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   757
    } else {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   758
      assert( _age_index == -1, "pre-condition" );
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   759
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   760
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   761
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   762
  void set_young() { set_young_type(Young); }
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
  void set_survivor() { set_young_type(Survivor); }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   765
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   766
  void set_not_young() { set_young_type(NotYoung); }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   767
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   768
  // Determine if an object has been allocated since the last
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   769
  // mark performed by the collector. This returns true iff the object
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   770
  // is within the unmarked area of the region.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   771
  bool obj_allocated_since_prev_marking(oop obj) const {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   772
    return (HeapWord *) obj >= prev_top_at_mark_start();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   773
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   774
  bool obj_allocated_since_next_marking(oop obj) const {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   775
    return (HeapWord *) obj >= next_top_at_mark_start();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   776
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   777
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   778
  // For parallel heapRegion traversal.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   779
  bool claimHeapRegion(int claimValue);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   780
  jint claim_value() { return _claimed; }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   781
  // Use this carefully: only when you're sure no one is claiming...
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   782
  void set_claim_value(int claimValue) { _claimed = claimValue; }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   783
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   784
  // Returns the "evacuation_failed" property of the region.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   785
  bool evacuation_failed() { return _evacuation_failed; }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   786
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   787
  // Sets the "evacuation_failed" property of the region.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   788
  void set_evacuation_failed(bool b) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   789
    _evacuation_failed = b;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   790
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   791
    if (b) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   792
      init_top_at_conc_mark_count();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   793
      _next_marked_bytes = 0;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   794
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   795
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   796
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   797
  // Requires that "mr" be entirely within the region.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   798
  // Apply "cl->do_object" to all objects that intersect with "mr".
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   799
  // If the iteration encounters an unparseable portion of the region,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   800
  // or if "cl->abort()" is true after a closure application,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   801
  // terminate the iteration and return the address of the start of the
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   802
  // subregion that isn't done.  (The two can be distinguished by querying
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   803
  // "cl->abort()".)  Return of "NULL" indicates that the iteration
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   804
  // completed.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   805
  HeapWord*
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   806
  object_iterate_mem_careful(MemRegion mr, ObjectClosure* cl);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   807
9418
32a87dd6b746 7035144: G1: nightly failure: Non-dirty cards in region that should be dirty (failures still exist...)
tonyp
parents: 8930
diff changeset
   808
  // filter_young: if true and the region is a young region then we
32a87dd6b746 7035144: G1: nightly failure: Non-dirty cards in region that should be dirty (failures still exist...)
tonyp
parents: 8930
diff changeset
   809
  // skip the iteration.
32a87dd6b746 7035144: G1: nightly failure: Non-dirty cards in region that should be dirty (failures still exist...)
tonyp
parents: 8930
diff changeset
   810
  // card_ptr: if not NULL, and we decide that the card is not young
32a87dd6b746 7035144: G1: nightly failure: Non-dirty cards in region that should be dirty (failures still exist...)
tonyp
parents: 8930
diff changeset
   811
  // and we iterate over it, we'll clean the card before we start the
32a87dd6b746 7035144: G1: nightly failure: Non-dirty cards in region that should be dirty (failures still exist...)
tonyp
parents: 8930
diff changeset
   812
  // iteration.
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   813
  HeapWord*
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   814
  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
   815
                                   FilterOutOfRegionClosure* cl,
9418
32a87dd6b746 7035144: G1: nightly failure: Non-dirty cards in region that should be dirty (failures still exist...)
tonyp
parents: 8930
diff changeset
   816
                                   bool filter_young,
32a87dd6b746 7035144: G1: nightly failure: Non-dirty cards in region that should be dirty (failures still exist...)
tonyp
parents: 8930
diff changeset
   817
                                   jbyte* card_ptr);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   818
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   819
  // A version of block start that is guaranteed to find *some* block
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   820
  // boundary at or before "p", but does not object iteration, and may
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   821
  // therefore be used safely when the heap is unparseable.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   822
  HeapWord* block_start_careful(const void* p) const {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   823
    return _offsets.block_start_careful(p);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   824
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   825
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   826
  // Requires that "addr" is within the region.  Returns the start of the
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   827
  // first ("careful") block that starts at or after "addr", or else the
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   828
  // "end" of the region if there is no such block.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   829
  HeapWord* next_block_start_careful(HeapWord* addr);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   830
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 4024
diff changeset
   831
  size_t recorded_rs_length() const        { return _recorded_rs_length; }
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 4024
diff changeset
   832
  double predicted_elapsed_time_ms() const { return _predicted_elapsed_time_ms; }
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 4024
diff changeset
   833
  size_t predicted_bytes_to_copy() const   { return _predicted_bytes_to_copy; }
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 4024
diff changeset
   834
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 4024
diff changeset
   835
  void set_recorded_rs_length(size_t rs_length) {
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 4024
diff changeset
   836
    _recorded_rs_length = rs_length;
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 4024
diff changeset
   837
  }
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 4024
diff changeset
   838
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 4024
diff changeset
   839
  void set_predicted_elapsed_time_ms(double ms) {
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 4024
diff changeset
   840
    _predicted_elapsed_time_ms = ms;
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 4024
diff changeset
   841
  }
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 4024
diff changeset
   842
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 4024
diff changeset
   843
  void set_predicted_bytes_to_copy(size_t bytes) {
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 4024
diff changeset
   844
    _predicted_bytes_to_copy = bytes;
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 4024
diff changeset
   845
  }
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 4024
diff changeset
   846
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   847
#define HeapRegion_OOP_SINCE_SAVE_MARKS_DECL(OopClosureType, nv_suffix)  \
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   848
  virtual void oop_since_save_marks_iterate##nv_suffix(OopClosureType* cl);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   849
  SPECIALIZED_SINCE_SAVE_MARKS_CLOSURES(HeapRegion_OOP_SINCE_SAVE_MARKS_DECL)
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   850
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   851
  CompactibleSpace* next_compaction_space() const;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   852
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   853
  virtual void reset_after_compaction();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   854
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   855
  void print() const;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   856
  void print_on(outputStream* st) const;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   857
9995
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
   858
  // vo == UsePrevMarking  -> use "prev" marking information,
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
   859
  // vo == UseNextMarking -> use "next" marking information
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
   860
  // vo == UseMarkWord    -> use the mark word in the object header
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
   861
  //
3000
bbce6052b595 6850846: G1: extend G1 marking verification
tonyp
parents: 2883
diff changeset
   862
  // NOTE: Only the "prev" marking information is guaranteed to be
bbce6052b595 6850846: G1: extend G1 marking verification
tonyp
parents: 2883
diff changeset
   863
  // consistent most of the time, so most calls to this should use
9995
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
   864
  // vo == UsePrevMarking.
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
   865
  // Currently, there is only one case where this is called with
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
   866
  // vo == UseNextMarking, which is to verify the "next" marking
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
   867
  // information at the end of remark.
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
   868
  // Currently there is only one place where this is called with
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
   869
  // vo == UseMarkWord, which is to verify the marking during a
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
   870
  // full GC.
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
   871
  void verify(bool allow_dirty, VerifyOption vo, bool *failures) const;
3000
bbce6052b595 6850846: G1: extend G1 marking verification
tonyp
parents: 2883
diff changeset
   872
bbce6052b595 6850846: G1: extend G1 marking verification
tonyp
parents: 2883
diff changeset
   873
  // Override; it uses the "prev" marking information
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   874
  virtual void verify(bool allow_dirty) const;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   875
};
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   876
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   877
// HeapRegionClosure is used for iterating over regions.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   878
// Terminates the iteration when the "doHeapRegion" method returns "true".
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   879
class HeapRegionClosure : public StackObj {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   880
  friend class HeapRegionSeq;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   881
  friend class G1CollectedHeap;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   882
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   883
  bool _complete;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   884
  void incomplete() { _complete = false; }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   885
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   886
 public:
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   887
  HeapRegionClosure(): _complete(true) {}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   888
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   889
  // Typically called on each region until it returns true.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   890
  virtual bool doHeapRegion(HeapRegion* r) = 0;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   891
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   892
  // True after iteration if the closure was applied to all heap regions
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   893
  // and returned "false" in all cases.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   894
  bool complete() { return _complete; }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   895
};
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   896
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   897
#endif // SERIALGC
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6983
diff changeset
   898
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6983
diff changeset
   899
#endif // SHARE_VM_GC_IMPLEMENTATION_G1_HEAPREGION_HPP