hotspot/src/share/vm/gc_implementation/g1/concurrentMark.hpp
author johnc
Thu, 22 Sep 2011 10:57:37 -0700
changeset 10670 4ea0e7d2ffbc
parent 10280 3463715b5ef7
child 11174 fccee5238e70
permissions -rw-r--r--
6484982: G1: process references during evacuation pauses Summary: G1 now uses two reference processors - one is used by concurrent marking and the other is used by STW GCs (both full and incremental evacuation pauses). In an evacuation pause, the reference processor is embedded into the closures used to scan objects. Doing so causes causes reference objects to be 'discovered' by the reference processor. At the end of the evacuation pause, these discovered reference objects are processed - preserving (and copying) referent objects (and their reachable graphs) as appropriate. Reviewed-by: ysr, jwilhelm, brutisso, stefank, tonyp
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
/*
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7657
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: 6761
diff changeset
    25
#ifndef SHARE_VM_GC_IMPLEMENTATION_G1_CONCURRENTMARK_HPP
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6761
diff changeset
    26
#define SHARE_VM_GC_IMPLEMENTATION_G1_CONCURRENTMARK_HPP
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6761
diff changeset
    27
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7657
diff changeset
    28
#include "gc_implementation/g1/heapRegionSets.hpp"
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6761
diff changeset
    29
#include "utilities/taskqueue.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6761
diff changeset
    30
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    31
class G1CollectedHeap;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    32
class CMTask;
5076
8b74a4b60b31 4396719: Mark Sweep stack overflow on deeply nested Object arrays
jcoomes
parents: 4099
diff changeset
    33
typedef GenericTaskQueue<oop>            CMTaskQueue;
8b74a4b60b31 4396719: Mark Sweep stack overflow on deeply nested Object arrays
jcoomes
parents: 4099
diff changeset
    34
typedef GenericTaskQueueSet<CMTaskQueue> CMTaskQueueSet;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    35
7657
a80e571c3d96 7006113: G1: Initialize ReferenceProcessor::_is_alive_non_header field
johnc
parents: 7397
diff changeset
    36
// Closure used by CM during concurrent reference discovery
a80e571c3d96 7006113: G1: Initialize ReferenceProcessor::_is_alive_non_header field
johnc
parents: 7397
diff changeset
    37
// and reference processing (during remarking) to determine
a80e571c3d96 7006113: G1: Initialize ReferenceProcessor::_is_alive_non_header field
johnc
parents: 7397
diff changeset
    38
// if a particular object is alive. It is primarily used
a80e571c3d96 7006113: G1: Initialize ReferenceProcessor::_is_alive_non_header field
johnc
parents: 7397
diff changeset
    39
// to determine if referents of discovered reference objects
a80e571c3d96 7006113: G1: Initialize ReferenceProcessor::_is_alive_non_header field
johnc
parents: 7397
diff changeset
    40
// are alive. An instance is also embedded into the
a80e571c3d96 7006113: G1: Initialize ReferenceProcessor::_is_alive_non_header field
johnc
parents: 7397
diff changeset
    41
// reference processor as the _is_alive_non_header field
a80e571c3d96 7006113: G1: Initialize ReferenceProcessor::_is_alive_non_header field
johnc
parents: 7397
diff changeset
    42
class G1CMIsAliveClosure: public BoolObjectClosure {
a80e571c3d96 7006113: G1: Initialize ReferenceProcessor::_is_alive_non_header field
johnc
parents: 7397
diff changeset
    43
  G1CollectedHeap* _g1;
a80e571c3d96 7006113: G1: Initialize ReferenceProcessor::_is_alive_non_header field
johnc
parents: 7397
diff changeset
    44
 public:
a80e571c3d96 7006113: G1: Initialize ReferenceProcessor::_is_alive_non_header field
johnc
parents: 7397
diff changeset
    45
  G1CMIsAliveClosure(G1CollectedHeap* g1) :
a80e571c3d96 7006113: G1: Initialize ReferenceProcessor::_is_alive_non_header field
johnc
parents: 7397
diff changeset
    46
    _g1(g1)
a80e571c3d96 7006113: G1: Initialize ReferenceProcessor::_is_alive_non_header field
johnc
parents: 7397
diff changeset
    47
  {}
a80e571c3d96 7006113: G1: Initialize ReferenceProcessor::_is_alive_non_header field
johnc
parents: 7397
diff changeset
    48
a80e571c3d96 7006113: G1: Initialize ReferenceProcessor::_is_alive_non_header field
johnc
parents: 7397
diff changeset
    49
  void do_object(oop obj) {
a80e571c3d96 7006113: G1: Initialize ReferenceProcessor::_is_alive_non_header field
johnc
parents: 7397
diff changeset
    50
    ShouldNotCallThis();
a80e571c3d96 7006113: G1: Initialize ReferenceProcessor::_is_alive_non_header field
johnc
parents: 7397
diff changeset
    51
  }
a80e571c3d96 7006113: G1: Initialize ReferenceProcessor::_is_alive_non_header field
johnc
parents: 7397
diff changeset
    52
  bool do_object_b(oop obj);
a80e571c3d96 7006113: G1: Initialize ReferenceProcessor::_is_alive_non_header field
johnc
parents: 7397
diff changeset
    53
};
a80e571c3d96 7006113: G1: Initialize ReferenceProcessor::_is_alive_non_header field
johnc
parents: 7397
diff changeset
    54
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    55
// A generic CM bit map.  This is essentially a wrapper around the BitMap
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    56
// class, with one bit per (1<<_shifter) HeapWords.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    57
2013
49e915da0905 6700941: G1: allocation spec missing for some G1 classes
apetrusenko
parents: 1374
diff changeset
    58
class CMBitMapRO VALUE_OBJ_CLASS_SPEC {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    59
 protected:
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    60
  HeapWord* _bmStartWord;      // base address of range covered by map
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    61
  size_t    _bmWordSize;       // map size (in #HeapWords covered)
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    62
  const int _shifter;          // map to char or bit
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    63
  VirtualSpace _virtual_space; // underlying the bit map
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    64
  BitMap    _bm;               // the bit map itself
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
 public:
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    67
  // constructor
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    68
  CMBitMapRO(ReservedSpace rs, int shifter);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    69
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    70
  enum { do_yield = true };
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    71
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    72
  // inquiries
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    73
  HeapWord* startWord()   const { return _bmStartWord; }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    74
  size_t    sizeInWords() const { return _bmWordSize;  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    75
  // the following is one past the last word in space
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    76
  HeapWord* endWord()     const { return _bmStartWord + _bmWordSize; }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    77
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    78
  // read marks
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
  bool isMarked(HeapWord* addr) const {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    81
    assert(_bmStartWord <= addr && addr < (_bmStartWord + _bmWordSize),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    82
           "outside underlying space?");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    83
    return _bm.at(heapWordToOffset(addr));
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    84
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    85
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    86
  // iteration
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    87
  bool iterate(BitMapClosure* cl) { return _bm.iterate(cl); }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    88
  bool iterate(BitMapClosure* cl, MemRegion mr);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    89
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    90
  // Return the address corresponding to the next marked bit at or after
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    91
  // "addr", and before "limit", if "limit" is non-NULL.  If there is no
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    92
  // such bit, returns "limit" if that is non-NULL, or else "endWord()".
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    93
  HeapWord* getNextMarkedWordAddress(HeapWord* addr,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    94
                                     HeapWord* limit = NULL) const;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    95
  // Return the address corresponding to the next unmarked bit at or after
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    96
  // "addr", and before "limit", if "limit" is non-NULL.  If there is no
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    97
  // such bit, returns "limit" if that is non-NULL, or else "endWord()".
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    98
  HeapWord* getNextUnmarkedWordAddress(HeapWord* addr,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    99
                                       HeapWord* limit = NULL) const;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   100
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   101
  // conversion utilities
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   102
  // XXX Fix these so that offsets are size_t's...
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   103
  HeapWord* offsetToHeapWord(size_t offset) const {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   104
    return _bmStartWord + (offset << _shifter);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   105
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   106
  size_t heapWordToOffset(HeapWord* addr) const {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   107
    return pointer_delta(addr, _bmStartWord) >> _shifter;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   108
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   109
  int heapWordDiffToOffsetDiff(size_t diff) const;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   110
  HeapWord* nextWord(HeapWord* addr) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   111
    return offsetToHeapWord(heapWordToOffset(addr) + 1);
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
  void mostly_disjoint_range_union(BitMap*   from_bitmap,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   115
                                   size_t    from_start_index,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   116
                                   HeapWord* to_start_word,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   117
                                   size_t    word_num);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   118
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   119
  // debugging
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   120
  NOT_PRODUCT(bool covers(ReservedSpace rs) const;)
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
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   123
class CMBitMap : public CMBitMapRO {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   124
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   125
 public:
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   126
  // constructor
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   127
  CMBitMap(ReservedSpace rs, int shifter) :
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   128
    CMBitMapRO(rs, shifter) {}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   129
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   130
  // write marks
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   131
  void mark(HeapWord* addr) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   132
    assert(_bmStartWord <= addr && addr < (_bmStartWord + _bmWordSize),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   133
           "outside underlying space?");
9994
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents: 9936
diff changeset
   134
    _bm.set_bit(heapWordToOffset(addr));
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   135
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   136
  void clear(HeapWord* addr) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   137
    assert(_bmStartWord <= addr && addr < (_bmStartWord + _bmWordSize),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   138
           "outside underlying space?");
9994
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents: 9936
diff changeset
   139
    _bm.clear_bit(heapWordToOffset(addr));
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   140
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   141
  bool parMark(HeapWord* addr) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   142
    assert(_bmStartWord <= addr && addr < (_bmStartWord + _bmWordSize),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   143
           "outside underlying space?");
9994
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents: 9936
diff changeset
   144
    return _bm.par_set_bit(heapWordToOffset(addr));
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   145
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   146
  bool parClear(HeapWord* addr) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   147
    assert(_bmStartWord <= addr && addr < (_bmStartWord + _bmWordSize),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   148
           "outside underlying space?");
9994
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents: 9936
diff changeset
   149
    return _bm.par_clear_bit(heapWordToOffset(addr));
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   150
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   151
  void markRange(MemRegion mr);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   152
  void clearAll();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   153
  void clearRange(MemRegion mr);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   154
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   155
  // Starting at the bit corresponding to "addr" (inclusive), find the next
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   156
  // "1" bit, if any.  This bit starts some run of consecutive "1"'s; find
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   157
  // the end of this run (stopping at "end_addr").  Return the MemRegion
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   158
  // covering from the start of the region corresponding to the first bit
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   159
  // of the run to the end of the region corresponding to the last bit of
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   160
  // the run.  If there is no "1" bit at or after "addr", return an empty
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   161
  // MemRegion.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   162
  MemRegion getAndClearMarkedRegion(HeapWord* addr, HeapWord* end_addr);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   163
};
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   164
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   165
// Represents a marking stack used by the CM collector.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   166
// Ideally this should be GrowableArray<> just like MSC's marking stack(s).
2013
49e915da0905 6700941: G1: allocation spec missing for some G1 classes
apetrusenko
parents: 1374
diff changeset
   167
class CMMarkStack VALUE_OBJ_CLASS_SPEC {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   168
  ConcurrentMark* _cm;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   169
  oop*   _base;      // bottom of stack
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   170
  jint   _index;     // one more than last occupied index
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   171
  jint   _capacity;  // max #elements
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   172
  jint   _oops_do_bound;  // Number of elements to include in next iteration.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   173
  NOT_PRODUCT(jint _max_depth;)  // max depth plumbed during run
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   174
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   175
  bool   _overflow;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   176
  DEBUG_ONLY(bool _drain_in_progress;)
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   177
  DEBUG_ONLY(bool _drain_in_progress_yields;)
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   178
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   179
 public:
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   180
  CMMarkStack(ConcurrentMark* cm);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   181
  ~CMMarkStack();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   182
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   183
  void allocate(size_t size);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   184
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   185
  oop pop() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   186
    if (!isEmpty()) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   187
      return _base[--_index] ;
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
    return NULL;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   190
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   191
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   192
  // If overflow happens, don't do the push, and record the overflow.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   193
  // *Requires* that "ptr" is already marked.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   194
  void push(oop ptr) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   195
    if (isFull()) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   196
      // Record overflow.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   197
      _overflow = true;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   198
      return;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   199
    } else {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   200
      _base[_index++] = ptr;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   201
      NOT_PRODUCT(_max_depth = MAX2(_max_depth, _index));
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   202
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   203
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   204
  // Non-block impl.  Note: concurrency is allowed only with other
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   205
  // "par_push" operations, not with "pop" or "drain".  We would need
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   206
  // parallel versions of them if such concurrency was desired.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   207
  void par_push(oop ptr);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   208
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   209
  // Pushes the first "n" elements of "ptr_arr" on the stack.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   210
  // Non-block impl.  Note: concurrency is allowed only with other
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   211
  // "par_adjoin_arr" or "push" operations, not with "pop" or "drain".
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   212
  void par_adjoin_arr(oop* ptr_arr, int n);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   213
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   214
  // Pushes the first "n" elements of "ptr_arr" on the stack.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   215
  // Locking impl: concurrency is allowed only with
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   216
  // "par_push_arr" and/or "par_pop_arr" operations, which use the same
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   217
  // locking strategy.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   218
  void par_push_arr(oop* ptr_arr, int n);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   219
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   220
  // If returns false, the array was empty.  Otherwise, removes up to "max"
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   221
  // elements from the stack, and transfers them to "ptr_arr" in an
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   222
  // unspecified order.  The actual number transferred is given in "n" ("n
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   223
  // == 0" is deliberately redundant with the return value.)  Locking impl:
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   224
  // concurrency is allowed only with "par_push_arr" and/or "par_pop_arr"
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   225
  // operations, which use the same locking strategy.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   226
  bool par_pop_arr(oop* ptr_arr, int max, int* n);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   227
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   228
  // Drain the mark stack, applying the given closure to all fields of
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   229
  // objects on the stack.  (That is, continue until the stack is empty,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   230
  // even if closure applications add entries to the stack.)  The "bm"
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   231
  // argument, if non-null, may be used to verify that only marked objects
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   232
  // are on the mark stack.  If "yield_after" is "true", then the
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   233
  // concurrent marker performing the drain offers to yield after
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   234
  // processing each object.  If a yield occurs, stops the drain operation
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   235
  // and returns false.  Otherwise, returns true.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   236
  template<class OopClosureClass>
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   237
  bool drain(OopClosureClass* cl, CMBitMap* bm, bool yield_after = false);
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
  bool isEmpty()    { return _index == 0; }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   240
  bool isFull()     { return _index == _capacity; }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   241
  int maxElems()    { return _capacity; }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   242
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   243
  bool overflow() { return _overflow; }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   244
  void clear_overflow() { _overflow = false; }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   245
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   246
  int  size() { return _index; }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   247
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   248
  void setEmpty()   { _index = 0; clear_overflow(); }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   249
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   250
  // Record the current size; a subsequent "oops_do" will iterate only over
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   251
  // indices valid at the time of this call.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   252
  void set_oops_do_bound(jint bound = -1) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   253
    if (bound == -1) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   254
      _oops_do_bound = _index;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   255
    } else {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   256
      _oops_do_bound = bound;
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
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   259
  jint oops_do_bound() { return _oops_do_bound; }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   260
  // iterate over the oops in the mark stack, up to the bound recorded via
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   261
  // the call above.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   262
  void oops_do(OopClosure* f);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   263
};
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   264
2013
49e915da0905 6700941: G1: allocation spec missing for some G1 classes
apetrusenko
parents: 1374
diff changeset
   265
class CMRegionStack VALUE_OBJ_CLASS_SPEC {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   266
  MemRegion* _base;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   267
  jint _capacity;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   268
  jint _index;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   269
  jint _oops_do_bound;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   270
  bool _overflow;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   271
public:
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   272
  CMRegionStack();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   273
  ~CMRegionStack();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   274
  void allocate(size_t size);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   275
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   276
  // This is lock-free; assumes that it will only be called in parallel
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   277
  // with other "push" operations (no pops).
6761
f9191297ce83 6941395: G1: Use only lock-free versions of region stack push() and pop()
johnc
parents: 5547
diff changeset
   278
  void push_lock_free(MemRegion mr);
5242
85cf92183e39 6940310: G1: MT-unsafe calls to CM::region_stack_push() / CM::region_stack_pop()
tonyp
parents: 5076
diff changeset
   279
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   280
  // Lock-free; assumes that it will only be called in parallel
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   281
  // with other "pop" operations (no pushes).
6761
f9191297ce83 6941395: G1: Use only lock-free versions of region stack push() and pop()
johnc
parents: 5547
diff changeset
   282
  MemRegion pop_lock_free();
f9191297ce83 6941395: G1: Use only lock-free versions of region stack push() and pop()
johnc
parents: 5547
diff changeset
   283
f9191297ce83 6941395: G1: Use only lock-free versions of region stack push() and pop()
johnc
parents: 5547
diff changeset
   284
#if 0
f9191297ce83 6941395: G1: Use only lock-free versions of region stack push() and pop()
johnc
parents: 5547
diff changeset
   285
  // The routines that manipulate the region stack with a lock are
f9191297ce83 6941395: G1: Use only lock-free versions of region stack push() and pop()
johnc
parents: 5547
diff changeset
   286
  // not currently used. They should be retained, however, as a
f9191297ce83 6941395: G1: Use only lock-free versions of region stack push() and pop()
johnc
parents: 5547
diff changeset
   287
  // diagnostic aid.
5242
85cf92183e39 6940310: G1: MT-unsafe calls to CM::region_stack_push() / CM::region_stack_pop()
tonyp
parents: 5076
diff changeset
   288
85cf92183e39 6940310: G1: MT-unsafe calls to CM::region_stack_push() / CM::region_stack_pop()
tonyp
parents: 5076
diff changeset
   289
  // These two are the implementations that use a lock. They can be
85cf92183e39 6940310: G1: MT-unsafe calls to CM::region_stack_push() / CM::region_stack_pop()
tonyp
parents: 5076
diff changeset
   290
  // called concurrently with each other but they should not be called
85cf92183e39 6940310: G1: MT-unsafe calls to CM::region_stack_push() / CM::region_stack_pop()
tonyp
parents: 5076
diff changeset
   291
  // concurrently with the lock-free versions (push() / pop()).
85cf92183e39 6940310: G1: MT-unsafe calls to CM::region_stack_push() / CM::region_stack_pop()
tonyp
parents: 5076
diff changeset
   292
  void push_with_lock(MemRegion mr);
85cf92183e39 6940310: G1: MT-unsafe calls to CM::region_stack_push() / CM::region_stack_pop()
tonyp
parents: 5076
diff changeset
   293
  MemRegion pop_with_lock();
6761
f9191297ce83 6941395: G1: Use only lock-free versions of region stack push() and pop()
johnc
parents: 5547
diff changeset
   294
#endif
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   295
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   296
  bool isEmpty()    { return _index == 0; }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   297
  bool isFull()     { return _index == _capacity; }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   298
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   299
  bool overflow() { return _overflow; }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   300
  void clear_overflow() { _overflow = false; }
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
  int  size() { return _index; }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   303
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   304
  // It iterates over the entries in the region stack and it
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   305
  // invalidates (i.e. assigns MemRegion()) the ones that point to
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   306
  // regions in the collection set.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   307
  bool invalidate_entries_into_cset();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   308
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   309
  // This gives an upper bound up to which the iteration in
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   310
  // invalidate_entries_into_cset() will reach. This prevents
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   311
  // newly-added entries to be unnecessarily scanned.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   312
  void set_oops_do_bound() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   313
    _oops_do_bound = _index;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   314
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   315
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   316
  void setEmpty()   { _index = 0; clear_overflow(); }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   317
};
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   318
9417
6719a2e727c0 7034139: G1: assert(Thread::current()->is_ConcurrentGC_thread()) failed: only a conc GC thread can call this.
tonyp
parents: 8930
diff changeset
   319
class ForceOverflowSettings VALUE_OBJ_CLASS_SPEC {
6719a2e727c0 7034139: G1: assert(Thread::current()->is_ConcurrentGC_thread()) failed: only a conc GC thread can call this.
tonyp
parents: 8930
diff changeset
   320
private:
6719a2e727c0 7034139: G1: assert(Thread::current()->is_ConcurrentGC_thread()) failed: only a conc GC thread can call this.
tonyp
parents: 8930
diff changeset
   321
#ifndef PRODUCT
6719a2e727c0 7034139: G1: assert(Thread::current()->is_ConcurrentGC_thread()) failed: only a conc GC thread can call this.
tonyp
parents: 8930
diff changeset
   322
  uintx _num_remaining;
6719a2e727c0 7034139: G1: assert(Thread::current()->is_ConcurrentGC_thread()) failed: only a conc GC thread can call this.
tonyp
parents: 8930
diff changeset
   323
  bool _force;
6719a2e727c0 7034139: G1: assert(Thread::current()->is_ConcurrentGC_thread()) failed: only a conc GC thread can call this.
tonyp
parents: 8930
diff changeset
   324
#endif // !defined(PRODUCT)
6719a2e727c0 7034139: G1: assert(Thread::current()->is_ConcurrentGC_thread()) failed: only a conc GC thread can call this.
tonyp
parents: 8930
diff changeset
   325
6719a2e727c0 7034139: G1: assert(Thread::current()->is_ConcurrentGC_thread()) failed: only a conc GC thread can call this.
tonyp
parents: 8930
diff changeset
   326
public:
6719a2e727c0 7034139: G1: assert(Thread::current()->is_ConcurrentGC_thread()) failed: only a conc GC thread can call this.
tonyp
parents: 8930
diff changeset
   327
  void init() PRODUCT_RETURN;
6719a2e727c0 7034139: G1: assert(Thread::current()->is_ConcurrentGC_thread()) failed: only a conc GC thread can call this.
tonyp
parents: 8930
diff changeset
   328
  void update() PRODUCT_RETURN;
6719a2e727c0 7034139: G1: assert(Thread::current()->is_ConcurrentGC_thread()) failed: only a conc GC thread can call this.
tonyp
parents: 8930
diff changeset
   329
  bool should_force() PRODUCT_RETURN_( return false; );
6719a2e727c0 7034139: G1: assert(Thread::current()->is_ConcurrentGC_thread()) failed: only a conc GC thread can call this.
tonyp
parents: 8930
diff changeset
   330
};
6719a2e727c0 7034139: G1: assert(Thread::current()->is_ConcurrentGC_thread()) failed: only a conc GC thread can call this.
tonyp
parents: 8930
diff changeset
   331
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   332
// this will enable a variety of different statistics per GC task
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   333
#define _MARKING_STATS_       0
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   334
// this will enable the higher verbose levels
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   335
#define _MARKING_VERBOSE_     0
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
#if _MARKING_STATS_
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   338
#define statsOnly(statement)  \
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   339
do {                          \
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   340
  statement ;                 \
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   341
} while (0)
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   342
#else // _MARKING_STATS_
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   343
#define statsOnly(statement)  \
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   344
do {                          \
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   345
} while (0)
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   346
#endif // _MARKING_STATS_
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   347
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   348
typedef enum {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   349
  no_verbose  = 0,   // verbose turned off
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   350
  stats_verbose,     // only prints stats at the end of marking
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   351
  low_verbose,       // low verbose, mostly per region and per major event
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   352
  medium_verbose,    // a bit more detailed than low
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   353
  high_verbose       // per object verbose
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   354
} CMVerboseLevel;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   355
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   356
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   357
class ConcurrentMarkThread;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   358
2013
49e915da0905 6700941: G1: allocation spec missing for some G1 classes
apetrusenko
parents: 1374
diff changeset
   359
class ConcurrentMark: public CHeapObj {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   360
  friend class ConcurrentMarkThread;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   361
  friend class CMTask;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   362
  friend class CMBitMapClosure;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   363
  friend class CSMarkOopClosure;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   364
  friend class CMGlobalObjectClosure;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   365
  friend class CMRemarkTask;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   366
  friend class CMConcurrentMarkingTask;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   367
  friend class G1ParNoteEndTask;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   368
  friend class CalcLiveObjectsClosure;
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10280
diff changeset
   369
  friend class G1CMRefProcTaskProxy;
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10280
diff changeset
   370
  friend class G1CMRefProcTaskExecutor;
8073
a14dc27842dc 6608385: G1: need to support parallel reference processing
johnc
parents: 7923
diff changeset
   371
  friend class G1CMParKeepAliveAndDrainClosure;
a14dc27842dc 6608385: G1: need to support parallel reference processing
johnc
parents: 7923
diff changeset
   372
  friend class G1CMParDrainMarkingStackClosure;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   373
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   374
protected:
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   375
  ConcurrentMarkThread* _cmThread;   // the thread doing the work
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   376
  G1CollectedHeap*      _g1h;        // the heap.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   377
  size_t                _parallel_marking_threads; // the number of marking
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   378
                                                   // threads we'll use
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   379
  double                _sleep_factor; // how much we have to sleep, with
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   380
                                       // respect to the work we just did, to
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   381
                                       // meet the marking overhead goal
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   382
  double                _marking_task_overhead; // marking target overhead for
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   383
                                                // a single task
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   384
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   385
  // same as the two above, but for the cleanup task
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   386
  double                _cleanup_sleep_factor;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   387
  double                _cleanup_task_overhead;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   388
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7657
diff changeset
   389
  FreeRegionList        _cleanup_list;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   390
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   391
  // CMS marking support structures
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   392
  CMBitMap                _markBitMap1;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   393
  CMBitMap                _markBitMap2;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   394
  CMBitMapRO*             _prevMarkBitMap; // completed mark bitmap
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   395
  CMBitMap*               _nextMarkBitMap; // under-construction mark bitmap
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   396
  bool                    _at_least_one_mark_complete;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   397
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   398
  BitMap                  _region_bm;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   399
  BitMap                  _card_bm;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   400
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   401
  // Heap bounds
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   402
  HeapWord*               _heap_start;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   403
  HeapWord*               _heap_end;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   404
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   405
  // For gray objects
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   406
  CMMarkStack             _markStack; // Grey objects behind global finger.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   407
  CMRegionStack           _regionStack; // Grey regions behind global finger.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   408
  HeapWord* volatile      _finger;  // the global finger, region aligned,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   409
                                    // always points to the end of the
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   410
                                    // last claimed region
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
  // marking tasks
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   413
  size_t                  _max_task_num; // maximum task number
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   414
  size_t                  _active_tasks; // task num currently active
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   415
  CMTask**                _tasks;        // task queue array (max_task_num len)
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   416
  CMTaskQueueSet*         _task_queues;  // task queue set
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   417
  ParallelTaskTerminator  _terminator;   // for termination
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   418
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   419
  // Two sync barriers that are used to synchronise tasks when an
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   420
  // overflow occurs. The algorithm is the following. All tasks enter
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   421
  // the first one to ensure that they have all stopped manipulating
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   422
  // the global data structures. After they exit it, they re-initialise
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   423
  // their data structures and task 0 re-initialises the global data
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   424
  // structures. Then, they enter the second sync barrier. This
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   425
  // ensure, that no task starts doing work before all data
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   426
  // structures (local and global) have been re-initialised. When they
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   427
  // exit it, they are free to start working again.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   428
  WorkGangBarrierSync     _first_overflow_barrier_sync;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   429
  WorkGangBarrierSync     _second_overflow_barrier_sync;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   430
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   431
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   432
  // this is set by any task, when an overflow on the global data
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   433
  // structures is detected.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   434
  volatile bool           _has_overflown;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   435
  // true: marking is concurrent, false: we're in remark
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   436
  volatile bool           _concurrent;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   437
  // set at the end of a Full GC so that marking aborts
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   438
  volatile bool           _has_aborted;
6761
f9191297ce83 6941395: G1: Use only lock-free versions of region stack push() and pop()
johnc
parents: 5547
diff changeset
   439
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   440
  // used when remark aborts due to an overflow to indicate that
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   441
  // another concurrent marking phase should start
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   442
  volatile bool           _restart_for_overflow;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   443
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   444
  // This is true from the very start of concurrent marking until the
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   445
  // point when all the tasks complete their work. It is really used
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   446
  // to determine the points between the end of concurrent marking and
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   447
  // time of remark.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   448
  volatile bool           _concurrent_marking_in_progress;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   449
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   450
  // verbose level
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   451
  CMVerboseLevel          _verbose_level;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   452
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   453
  // These two fields are used to implement the optimisation that
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   454
  // avoids pushing objects on the global/region stack if there are
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   455
  // no collection set regions above the lowest finger.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   456
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   457
  // This is the lowest finger (among the global and local fingers),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   458
  // which is calculated before a new collection set is chosen.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   459
  HeapWord* _min_finger;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   460
  // If this flag is true, objects/regions that are marked below the
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   461
  // finger should be pushed on the stack(s). If this is flag is
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   462
  // false, it is safe not to push them on the stack(s).
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   463
  bool      _should_gray_objects;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   464
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   465
  // All of these times are in ms.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   466
  NumberSeq _init_times;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   467
  NumberSeq _remark_times;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   468
  NumberSeq   _remark_mark_times;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   469
  NumberSeq   _remark_weak_ref_times;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   470
  NumberSeq _cleanup_times;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   471
  double    _total_counting_time;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   472
  double    _total_rs_scrub_time;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   473
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   474
  double*   _accum_task_vtime;   // accumulated task vtime
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   475
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   476
  WorkGang* _parallel_workers;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   477
9417
6719a2e727c0 7034139: G1: assert(Thread::current()->is_ConcurrentGC_thread()) failed: only a conc GC thread can call this.
tonyp
parents: 8930
diff changeset
   478
  ForceOverflowSettings _force_overflow_conc;
6719a2e727c0 7034139: G1: assert(Thread::current()->is_ConcurrentGC_thread()) failed: only a conc GC thread can call this.
tonyp
parents: 8930
diff changeset
   479
  ForceOverflowSettings _force_overflow_stw;
6719a2e727c0 7034139: G1: assert(Thread::current()->is_ConcurrentGC_thread()) failed: only a conc GC thread can call this.
tonyp
parents: 8930
diff changeset
   480
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   481
  void weakRefsWork(bool clear_all_soft_refs);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   482
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   483
  void swapMarkBitMaps();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   484
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   485
  // It resets the global marking data structures, as well as the
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   486
  // task local ones; should be called during initial mark.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   487
  void reset();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   488
  // It resets all the marking data structures.
9417
6719a2e727c0 7034139: G1: assert(Thread::current()->is_ConcurrentGC_thread()) failed: only a conc GC thread can call this.
tonyp
parents: 8930
diff changeset
   489
  void clear_marking_state(bool clear_overflow = true);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   490
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   491
  // It should be called to indicate which phase we're in (concurrent
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   492
  // mark or remark) and how many threads are currently active.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   493
  void set_phase(size_t active_tasks, bool concurrent);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   494
  // We do this after we're done with marking so that the marking data
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   495
  // structures are initialised to a sensible and predictable state.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   496
  void set_non_marking_state();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   497
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   498
  // prints all gathered CM-related statistics
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   499
  void print_stats();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   500
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7657
diff changeset
   501
  bool cleanup_list_is_empty() {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7657
diff changeset
   502
    return _cleanup_list.is_empty();
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7657
diff changeset
   503
  }
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7657
diff changeset
   504
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   505
  // accessor methods
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   506
  size_t parallel_marking_threads() { return _parallel_marking_threads; }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   507
  double sleep_factor()             { return _sleep_factor; }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   508
  double marking_task_overhead()    { return _marking_task_overhead;}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   509
  double cleanup_sleep_factor()     { return _cleanup_sleep_factor; }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   510
  double cleanup_task_overhead()    { return _cleanup_task_overhead;}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   511
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   512
  HeapWord*               finger()        { return _finger;   }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   513
  bool                    concurrent()    { return _concurrent; }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   514
  size_t                  active_tasks()  { return _active_tasks; }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   515
  ParallelTaskTerminator* terminator()    { return &_terminator; }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   516
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   517
  // It claims the next available region to be scanned by a marking
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   518
  // task. It might return NULL if the next region is empty or we have
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   519
  // run out of regions. In the latter case, out_of_regions()
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   520
  // determines whether we've really run out of regions or the task
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   521
  // should call claim_region() again.  This might seem a bit
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   522
  // awkward. Originally, the code was written so that claim_region()
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   523
  // either successfully returned with a non-empty region or there
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   524
  // were no more regions to be claimed. The problem with this was
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   525
  // that, in certain circumstances, it iterated over large chunks of
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   526
  // the heap finding only empty regions and, while it was working, it
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   527
  // was preventing the calling task to call its regular clock
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   528
  // method. So, this way, each task will spend very little time in
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   529
  // claim_region() and is allowed to call the regular clock method
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   530
  // frequently.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   531
  HeapRegion* claim_region(int task);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   532
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   533
  // It determines whether we've run out of regions to scan.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   534
  bool        out_of_regions() { return _finger == _heap_end; }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   535
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   536
  // Returns the task with the given id
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   537
  CMTask* task(int id) {
4026
10386ea70fe5 6888619: G1: too many guarantees in concurrent marking
tonyp
parents: 4022
diff changeset
   538
    assert(0 <= id && id < (int) _active_tasks,
10386ea70fe5 6888619: G1: too many guarantees in concurrent marking
tonyp
parents: 4022
diff changeset
   539
           "task id not within active bounds");
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   540
    return _tasks[id];
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   541
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   542
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   543
  // Returns the task queue with the given id
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   544
  CMTaskQueue* task_queue(int id) {
4026
10386ea70fe5 6888619: G1: too many guarantees in concurrent marking
tonyp
parents: 4022
diff changeset
   545
    assert(0 <= id && id < (int) _active_tasks,
10386ea70fe5 6888619: G1: too many guarantees in concurrent marking
tonyp
parents: 4022
diff changeset
   546
           "task queue id not within active bounds");
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   547
    return (CMTaskQueue*) _task_queues->queue(id);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   548
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   549
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   550
  // Returns the task queue set
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   551
  CMTaskQueueSet* task_queues()  { return _task_queues; }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   552
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   553
  // Access / manipulation of the overflow flag which is set to
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   554
  // indicate that the global stack or region stack has overflown
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   555
  bool has_overflown()           { return _has_overflown; }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   556
  void set_has_overflown()       { _has_overflown = true; }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   557
  void clear_has_overflown()     { _has_overflown = false; }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   558
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   559
  bool has_aborted()             { return _has_aborted; }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   560
  bool restart_for_overflow()    { return _restart_for_overflow; }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   561
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   562
  // Methods to enter the two overflow sync barriers
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   563
  void enter_first_sync_barrier(int task_num);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   564
  void enter_second_sync_barrier(int task_num);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   565
9417
6719a2e727c0 7034139: G1: assert(Thread::current()->is_ConcurrentGC_thread()) failed: only a conc GC thread can call this.
tonyp
parents: 8930
diff changeset
   566
  ForceOverflowSettings* force_overflow_conc() {
6719a2e727c0 7034139: G1: assert(Thread::current()->is_ConcurrentGC_thread()) failed: only a conc GC thread can call this.
tonyp
parents: 8930
diff changeset
   567
    return &_force_overflow_conc;
6719a2e727c0 7034139: G1: assert(Thread::current()->is_ConcurrentGC_thread()) failed: only a conc GC thread can call this.
tonyp
parents: 8930
diff changeset
   568
  }
6719a2e727c0 7034139: G1: assert(Thread::current()->is_ConcurrentGC_thread()) failed: only a conc GC thread can call this.
tonyp
parents: 8930
diff changeset
   569
6719a2e727c0 7034139: G1: assert(Thread::current()->is_ConcurrentGC_thread()) failed: only a conc GC thread can call this.
tonyp
parents: 8930
diff changeset
   570
  ForceOverflowSettings* force_overflow_stw() {
6719a2e727c0 7034139: G1: assert(Thread::current()->is_ConcurrentGC_thread()) failed: only a conc GC thread can call this.
tonyp
parents: 8930
diff changeset
   571
    return &_force_overflow_stw;
6719a2e727c0 7034139: G1: assert(Thread::current()->is_ConcurrentGC_thread()) failed: only a conc GC thread can call this.
tonyp
parents: 8930
diff changeset
   572
  }
6719a2e727c0 7034139: G1: assert(Thread::current()->is_ConcurrentGC_thread()) failed: only a conc GC thread can call this.
tonyp
parents: 8930
diff changeset
   573
6719a2e727c0 7034139: G1: assert(Thread::current()->is_ConcurrentGC_thread()) failed: only a conc GC thread can call this.
tonyp
parents: 8930
diff changeset
   574
  ForceOverflowSettings* force_overflow() {
6719a2e727c0 7034139: G1: assert(Thread::current()->is_ConcurrentGC_thread()) failed: only a conc GC thread can call this.
tonyp
parents: 8930
diff changeset
   575
    if (concurrent()) {
6719a2e727c0 7034139: G1: assert(Thread::current()->is_ConcurrentGC_thread()) failed: only a conc GC thread can call this.
tonyp
parents: 8930
diff changeset
   576
      return force_overflow_conc();
6719a2e727c0 7034139: G1: assert(Thread::current()->is_ConcurrentGC_thread()) failed: only a conc GC thread can call this.
tonyp
parents: 8930
diff changeset
   577
    } else {
6719a2e727c0 7034139: G1: assert(Thread::current()->is_ConcurrentGC_thread()) failed: only a conc GC thread can call this.
tonyp
parents: 8930
diff changeset
   578
      return force_overflow_stw();
6719a2e727c0 7034139: G1: assert(Thread::current()->is_ConcurrentGC_thread()) failed: only a conc GC thread can call this.
tonyp
parents: 8930
diff changeset
   579
    }
6719a2e727c0 7034139: G1: assert(Thread::current()->is_ConcurrentGC_thread()) failed: only a conc GC thread can call this.
tonyp
parents: 8930
diff changeset
   580
  }
6719a2e727c0 7034139: G1: assert(Thread::current()->is_ConcurrentGC_thread()) failed: only a conc GC thread can call this.
tonyp
parents: 8930
diff changeset
   581
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   582
public:
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   583
  // Manipulation of the global mark stack.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   584
  // Notice that the first mark_stack_push is CAS-based, whereas the
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   585
  // two below are Mutex-based. This is OK since the first one is only
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   586
  // called during evacuation pauses and doesn't compete with the
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   587
  // other two (which are called by the marking tasks during
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   588
  // concurrent marking or remark).
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   589
  bool mark_stack_push(oop p) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   590
    _markStack.par_push(p);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   591
    if (_markStack.overflow()) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   592
      set_has_overflown();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   593
      return false;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   594
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   595
    return true;
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
  bool mark_stack_push(oop* arr, int n) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   598
    _markStack.par_push_arr(arr, n);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   599
    if (_markStack.overflow()) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   600
      set_has_overflown();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   601
      return false;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   602
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   603
    return true;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   604
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   605
  void mark_stack_pop(oop* arr, int max, int* n) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   606
    _markStack.par_pop_arr(arr, max, n);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   607
  }
9999
5f0b78217054 7055073: G1: code cleanup in the concurrentMark.* files
tonyp
parents: 9995
diff changeset
   608
  size_t mark_stack_size()                { return _markStack.size(); }
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   609
  size_t partial_mark_stack_size_target() { return _markStack.maxElems()/3; }
9999
5f0b78217054 7055073: G1: code cleanup in the concurrentMark.* files
tonyp
parents: 9995
diff changeset
   610
  bool mark_stack_overflow()              { return _markStack.overflow(); }
5f0b78217054 7055073: G1: code cleanup in the concurrentMark.* files
tonyp
parents: 9995
diff changeset
   611
  bool mark_stack_empty()                 { return _markStack.isEmpty(); }
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   612
6761
f9191297ce83 6941395: G1: Use only lock-free versions of region stack push() and pop()
johnc
parents: 5547
diff changeset
   613
  // (Lock-free) Manipulation of the region stack
f9191297ce83 6941395: G1: Use only lock-free versions of region stack push() and pop()
johnc
parents: 5547
diff changeset
   614
  bool region_stack_push_lock_free(MemRegion mr) {
5242
85cf92183e39 6940310: G1: MT-unsafe calls to CM::region_stack_push() / CM::region_stack_pop()
tonyp
parents: 5076
diff changeset
   615
    // Currently we only call the lock-free version during evacuation
85cf92183e39 6940310: G1: MT-unsafe calls to CM::region_stack_push() / CM::region_stack_pop()
tonyp
parents: 5076
diff changeset
   616
    // pauses.
85cf92183e39 6940310: G1: MT-unsafe calls to CM::region_stack_push() / CM::region_stack_pop()
tonyp
parents: 5076
diff changeset
   617
    assert(SafepointSynchronize::is_at_safepoint(), "world should be stopped");
85cf92183e39 6940310: G1: MT-unsafe calls to CM::region_stack_push() / CM::region_stack_pop()
tonyp
parents: 5076
diff changeset
   618
6761
f9191297ce83 6941395: G1: Use only lock-free versions of region stack push() and pop()
johnc
parents: 5547
diff changeset
   619
    _regionStack.push_lock_free(mr);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   620
    if (_regionStack.overflow()) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   621
      set_has_overflown();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   622
      return false;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   623
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   624
    return true;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   625
  }
6761
f9191297ce83 6941395: G1: Use only lock-free versions of region stack push() and pop()
johnc
parents: 5547
diff changeset
   626
f9191297ce83 6941395: G1: Use only lock-free versions of region stack push() and pop()
johnc
parents: 5547
diff changeset
   627
  // Lock-free version of region-stack pop. Should only be
f9191297ce83 6941395: G1: Use only lock-free versions of region stack push() and pop()
johnc
parents: 5547
diff changeset
   628
  // called in tandem with other lock-free pops.
f9191297ce83 6941395: G1: Use only lock-free versions of region stack push() and pop()
johnc
parents: 5547
diff changeset
   629
  MemRegion region_stack_pop_lock_free() {
f9191297ce83 6941395: G1: Use only lock-free versions of region stack push() and pop()
johnc
parents: 5547
diff changeset
   630
    return _regionStack.pop_lock_free();
f9191297ce83 6941395: G1: Use only lock-free versions of region stack push() and pop()
johnc
parents: 5547
diff changeset
   631
  }
f9191297ce83 6941395: G1: Use only lock-free versions of region stack push() and pop()
johnc
parents: 5547
diff changeset
   632
5242
85cf92183e39 6940310: G1: MT-unsafe calls to CM::region_stack_push() / CM::region_stack_pop()
tonyp
parents: 5076
diff changeset
   633
#if 0
6761
f9191297ce83 6941395: G1: Use only lock-free versions of region stack push() and pop()
johnc
parents: 5547
diff changeset
   634
  // The routines that manipulate the region stack with a lock are
f9191297ce83 6941395: G1: Use only lock-free versions of region stack push() and pop()
johnc
parents: 5547
diff changeset
   635
  // not currently used. They should be retained, however, as a
f9191297ce83 6941395: G1: Use only lock-free versions of region stack push() and pop()
johnc
parents: 5547
diff changeset
   636
  // diagnostic aid.
5242
85cf92183e39 6940310: G1: MT-unsafe calls to CM::region_stack_push() / CM::region_stack_pop()
tonyp
parents: 5076
diff changeset
   637
85cf92183e39 6940310: G1: MT-unsafe calls to CM::region_stack_push() / CM::region_stack_pop()
tonyp
parents: 5076
diff changeset
   638
  bool region_stack_push_with_lock(MemRegion mr) {
85cf92183e39 6940310: G1: MT-unsafe calls to CM::region_stack_push() / CM::region_stack_pop()
tonyp
parents: 5076
diff changeset
   639
    // Currently we only call the lock-based version during either
85cf92183e39 6940310: G1: MT-unsafe calls to CM::region_stack_push() / CM::region_stack_pop()
tonyp
parents: 5076
diff changeset
   640
    // concurrent marking or remark.
85cf92183e39 6940310: G1: MT-unsafe calls to CM::region_stack_push() / CM::region_stack_pop()
tonyp
parents: 5076
diff changeset
   641
    assert(!SafepointSynchronize::is_at_safepoint() || !concurrent(),
85cf92183e39 6940310: G1: MT-unsafe calls to CM::region_stack_push() / CM::region_stack_pop()
tonyp
parents: 5076
diff changeset
   642
           "if we are at a safepoint it should be the remark safepoint");
85cf92183e39 6940310: G1: MT-unsafe calls to CM::region_stack_push() / CM::region_stack_pop()
tonyp
parents: 5076
diff changeset
   643
85cf92183e39 6940310: G1: MT-unsafe calls to CM::region_stack_push() / CM::region_stack_pop()
tonyp
parents: 5076
diff changeset
   644
    _regionStack.push_with_lock(mr);
85cf92183e39 6940310: G1: MT-unsafe calls to CM::region_stack_push() / CM::region_stack_pop()
tonyp
parents: 5076
diff changeset
   645
    if (_regionStack.overflow()) {
85cf92183e39 6940310: G1: MT-unsafe calls to CM::region_stack_push() / CM::region_stack_pop()
tonyp
parents: 5076
diff changeset
   646
      set_has_overflown();
85cf92183e39 6940310: G1: MT-unsafe calls to CM::region_stack_push() / CM::region_stack_pop()
tonyp
parents: 5076
diff changeset
   647
      return false;
85cf92183e39 6940310: G1: MT-unsafe calls to CM::region_stack_push() / CM::region_stack_pop()
tonyp
parents: 5076
diff changeset
   648
    }
85cf92183e39 6940310: G1: MT-unsafe calls to CM::region_stack_push() / CM::region_stack_pop()
tonyp
parents: 5076
diff changeset
   649
    return true;
85cf92183e39 6940310: G1: MT-unsafe calls to CM::region_stack_push() / CM::region_stack_pop()
tonyp
parents: 5076
diff changeset
   650
  }
6761
f9191297ce83 6941395: G1: Use only lock-free versions of region stack push() and pop()
johnc
parents: 5547
diff changeset
   651
5242
85cf92183e39 6940310: G1: MT-unsafe calls to CM::region_stack_push() / CM::region_stack_pop()
tonyp
parents: 5076
diff changeset
   652
  MemRegion region_stack_pop_with_lock() {
85cf92183e39 6940310: G1: MT-unsafe calls to CM::region_stack_push() / CM::region_stack_pop()
tonyp
parents: 5076
diff changeset
   653
    // Currently we only call the lock-based version during either
85cf92183e39 6940310: G1: MT-unsafe calls to CM::region_stack_push() / CM::region_stack_pop()
tonyp
parents: 5076
diff changeset
   654
    // concurrent marking or remark.
85cf92183e39 6940310: G1: MT-unsafe calls to CM::region_stack_push() / CM::region_stack_pop()
tonyp
parents: 5076
diff changeset
   655
    assert(!SafepointSynchronize::is_at_safepoint() || !concurrent(),
85cf92183e39 6940310: G1: MT-unsafe calls to CM::region_stack_push() / CM::region_stack_pop()
tonyp
parents: 5076
diff changeset
   656
           "if we are at a safepoint it should be the remark safepoint");
85cf92183e39 6940310: G1: MT-unsafe calls to CM::region_stack_push() / CM::region_stack_pop()
tonyp
parents: 5076
diff changeset
   657
85cf92183e39 6940310: G1: MT-unsafe calls to CM::region_stack_push() / CM::region_stack_pop()
tonyp
parents: 5076
diff changeset
   658
    return _regionStack.pop_with_lock();
85cf92183e39 6940310: G1: MT-unsafe calls to CM::region_stack_push() / CM::region_stack_pop()
tonyp
parents: 5076
diff changeset
   659
  }
6761
f9191297ce83 6941395: G1: Use only lock-free versions of region stack push() and pop()
johnc
parents: 5547
diff changeset
   660
#endif
5242
85cf92183e39 6940310: G1: MT-unsafe calls to CM::region_stack_push() / CM::region_stack_pop()
tonyp
parents: 5076
diff changeset
   661
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   662
  int region_stack_size()               { return _regionStack.size(); }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   663
  bool region_stack_overflow()          { return _regionStack.overflow(); }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   664
  bool region_stack_empty()             { return _regionStack.isEmpty(); }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   665
6761
f9191297ce83 6941395: G1: Use only lock-free versions of region stack push() and pop()
johnc
parents: 5547
diff changeset
   666
  // Iterate over any regions that were aborted while draining the
f9191297ce83 6941395: G1: Use only lock-free versions of region stack push() and pop()
johnc
parents: 5547
diff changeset
   667
  // region stack (any such regions are saved in the corresponding
f9191297ce83 6941395: G1: Use only lock-free versions of region stack push() and pop()
johnc
parents: 5547
diff changeset
   668
  // CMTask) and invalidate (i.e. assign to the empty MemRegion())
f9191297ce83 6941395: G1: Use only lock-free versions of region stack push() and pop()
johnc
parents: 5547
diff changeset
   669
  // any regions that point into the collection set.
f9191297ce83 6941395: G1: Use only lock-free versions of region stack push() and pop()
johnc
parents: 5547
diff changeset
   670
  bool invalidate_aborted_regions_in_cset();
f9191297ce83 6941395: G1: Use only lock-free versions of region stack push() and pop()
johnc
parents: 5547
diff changeset
   671
f9191297ce83 6941395: G1: Use only lock-free versions of region stack push() and pop()
johnc
parents: 5547
diff changeset
   672
  // Returns true if there are any aborted memory regions.
f9191297ce83 6941395: G1: Use only lock-free versions of region stack push() and pop()
johnc
parents: 5547
diff changeset
   673
  bool has_aborted_regions();
f9191297ce83 6941395: G1: Use only lock-free versions of region stack push() and pop()
johnc
parents: 5547
diff changeset
   674
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   675
  bool concurrent_marking_in_progress() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   676
    return _concurrent_marking_in_progress;
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_concurrent_marking_in_progress() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   679
    _concurrent_marking_in_progress = true;
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
  void clear_concurrent_marking_in_progress() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   682
    _concurrent_marking_in_progress = false;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   683
  }
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
  void update_accum_task_vtime(int i, double vtime) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   686
    _accum_task_vtime[i] += vtime;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   687
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   688
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   689
  double all_task_accum_vtime() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   690
    double ret = 0.0;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   691
    for (int i = 0; i < (int)_max_task_num; ++i)
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   692
      ret += _accum_task_vtime[i];
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   693
    return ret;
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
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   696
  // Attempts to steal an object from the task queues of other tasks
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   697
  bool try_stealing(int task_num, int* hash_seed, oop& obj) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   698
    return _task_queues->steal(task_num, hash_seed, obj);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   699
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   700
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   701
  // It grays an object by first marking it. Then, if it's behind the
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   702
  // global finger, it also pushes it on the global stack.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   703
  void deal_with_reference(oop obj);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   704
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   705
  ConcurrentMark(ReservedSpace rs, int max_regions);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   706
  ~ConcurrentMark();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   707
  ConcurrentMarkThread* cmThread() { return _cmThread; }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   708
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   709
  CMBitMapRO* prevMarkBitMap() const { return _prevMarkBitMap; }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   710
  CMBitMap*   nextMarkBitMap() const { return _nextMarkBitMap; }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   711
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   712
  // The following three are interaction between CM and
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   713
  // G1CollectedHeap
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   714
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   715
  // This notifies CM that a root during initial-mark needs to be
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   716
  // grayed and it's MT-safe. Currently, we just mark it. But, in the
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   717
  // future, we can experiment with pushing it on the stack and we can
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   718
  // do this without changing G1CollectedHeap.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   719
  void grayRoot(oop p);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   720
  // It's used during evacuation pauses to gray a region, if
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   721
  // necessary, and it's MT-safe. It assumes that the caller has
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   722
  // marked any objects on that region. If _should_gray_objects is
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   723
  // true and we're still doing concurrent marking, the region is
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   724
  // pushed on the region stack, if it is located below the global
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   725
  // finger, otherwise we do nothing.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   726
  void grayRegionIfNecessary(MemRegion mr);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   727
  // It's used during evacuation pauses to mark and, if necessary,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   728
  // gray a single object and it's MT-safe. It assumes the caller did
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   729
  // not mark the object. If _should_gray_objects is true and we're
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   730
  // still doing concurrent marking, the objects is pushed on the
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   731
  // global stack, if it is located below the global finger, otherwise
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   732
  // we do nothing.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   733
  void markAndGrayObjectIfNecessary(oop p);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   734
5344
f78ef2531f44 6937142: G1: improvements to debugging output (S-M)
tonyp
parents: 5242
diff changeset
   735
  // It iterates over the heap and for each object it comes across it
f78ef2531f44 6937142: G1: improvements to debugging output (S-M)
tonyp
parents: 5242
diff changeset
   736
  // will dump the contents of its reference fields, as well as
f78ef2531f44 6937142: G1: improvements to debugging output (S-M)
tonyp
parents: 5242
diff changeset
   737
  // liveness information for the object and its referents. The dump
f78ef2531f44 6937142: G1: improvements to debugging output (S-M)
tonyp
parents: 5242
diff changeset
   738
  // will be written to a file with the following name:
9995
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9994
diff changeset
   739
  // G1PrintReachableBaseFile + "." + str.
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9994
diff changeset
   740
  // vo decides whether the prev (vo == UsePrevMarking), the next
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9994
diff changeset
   741
  // (vo == UseNextMarking) marking information, or the mark word
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9994
diff changeset
   742
  // (vo == UseMarkWord) will be used to determine the liveness of
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9994
diff changeset
   743
  // each object / referent.
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9994
diff changeset
   744
  // If all is true, all objects in the heap will be dumped, otherwise
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9994
diff changeset
   745
  // only the live ones. In the dump the following symbols / breviations
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9994
diff changeset
   746
  // are used:
5344
f78ef2531f44 6937142: G1: improvements to debugging output (S-M)
tonyp
parents: 5242
diff changeset
   747
  //   M : an explicitly live object (its bitmap bit is set)
f78ef2531f44 6937142: G1: improvements to debugging output (S-M)
tonyp
parents: 5242
diff changeset
   748
  //   > : an implicitly live object (over tams)
f78ef2531f44 6937142: G1: improvements to debugging output (S-M)
tonyp
parents: 5242
diff changeset
   749
  //   O : an object outside the G1 heap (typically: in the perm gen)
f78ef2531f44 6937142: G1: improvements to debugging output (S-M)
tonyp
parents: 5242
diff changeset
   750
  //   NOT : a reference field whose referent is not live
f78ef2531f44 6937142: G1: improvements to debugging output (S-M)
tonyp
parents: 5242
diff changeset
   751
  //   AND MARKED : indicates that an object is both explicitly and
f78ef2531f44 6937142: G1: improvements to debugging output (S-M)
tonyp
parents: 5242
diff changeset
   752
  //   implicitly live (it should be one or the other, not both)
f78ef2531f44 6937142: G1: improvements to debugging output (S-M)
tonyp
parents: 5242
diff changeset
   753
  void print_reachable(const char* str,
9995
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9994
diff changeset
   754
                       VerifyOption vo, bool all) PRODUCT_RETURN;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   755
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   756
  // Clear the next marking bitmap (will be called concurrently).
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   757
  void clearNextBitmap();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   758
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   759
  // These two do the work that needs to be done before and after the
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   760
  // initial root checkpoint. Since this checkpoint can be done at two
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   761
  // different points (i.e. an explicit pause or piggy-backed on a
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   762
  // young collection), then it's nice to be able to easily share the
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   763
  // pre/post code. It might be the case that we can put everything in
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   764
  // the post method. TP
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   765
  void checkpointRootsInitialPre();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   766
  void checkpointRootsInitialPost();
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
  // Do concurrent phase of marking, to a tentative transitive closure.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   769
  void markFromRoots();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   770
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   771
  // Process all unprocessed SATB buffers. It is called at the
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   772
  // beginning of an evacuation pause.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   773
  void drainAllSATBBuffers();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   774
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   775
  void checkpointRootsFinal(bool clear_all_soft_refs);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   776
  void checkpointRootsFinalWork();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   777
  void calcDesiredRegions();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   778
  void cleanup();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   779
  void completeCleanup();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   780
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   781
  // Mark in the previous bitmap.  NB: this is usually read-only, so use
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   782
  // this carefully!
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   783
  void markPrev(oop p);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   784
  void clear(oop p);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   785
  // Clears marks for all objects in the given range, for both prev and
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   786
  // next bitmaps.  NB: the previous bitmap is usually read-only, so use
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   787
  // this carefully!
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   788
  void clearRangeBothMaps(MemRegion mr);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   789
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   790
  // Record the current top of the mark and region stacks; a
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   791
  // subsequent oops_do() on the mark stack and
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   792
  // invalidate_entries_into_cset() on the region stack will iterate
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   793
  // only over indices valid at the time of this call.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   794
  void set_oops_do_bound() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   795
    _markStack.set_oops_do_bound();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   796
    _regionStack.set_oops_do_bound();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   797
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   798
  // Iterate over the oops in the mark stack and all local queues. It
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   799
  // also calls invalidate_entries_into_cset() on the region stack.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   800
  void oops_do(OopClosure* f);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   801
  // It is called at the end of an evacuation pause during marking so
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   802
  // that CM is notified of where the new end of the heap is. It
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   803
  // doesn't do anything if concurrent_marking_in_progress() is false,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   804
  // unless the force parameter is true.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   805
  void update_g1_committed(bool force = false);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   806
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   807
  void complete_marking_in_collection_set();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   808
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   809
  // It indicates that a new collection set is being chosen.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   810
  void newCSet();
9936
59dac2950cc7 7041440: G1: assert(obj->is_oop_or_null(true )) failed: Error #
johnc
parents: 9417
diff changeset
   811
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   812
  // It registers a collection set heap region with CM. This is used
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   813
  // to determine whether any heap regions are located above the finger.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   814
  void registerCSetRegion(HeapRegion* hr);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   815
9936
59dac2950cc7 7041440: G1: assert(obj->is_oop_or_null(true )) failed: Error #
johnc
parents: 9417
diff changeset
   816
  // Resets the region fields of any active CMTask whose region fields
59dac2950cc7 7041440: G1: assert(obj->is_oop_or_null(true )) failed: Error #
johnc
parents: 9417
diff changeset
   817
  // are in the collection set (i.e. the region currently claimed by
59dac2950cc7 7041440: G1: assert(obj->is_oop_or_null(true )) failed: Error #
johnc
parents: 9417
diff changeset
   818
  // the CMTask will be evacuated and may be used, subsequently, as
59dac2950cc7 7041440: G1: assert(obj->is_oop_or_null(true )) failed: Error #
johnc
parents: 9417
diff changeset
   819
  // an alloc region). When this happens the region fields in the CMTask
59dac2950cc7 7041440: G1: assert(obj->is_oop_or_null(true )) failed: Error #
johnc
parents: 9417
diff changeset
   820
  // are stale and, hence, should be cleared causing the worker thread
59dac2950cc7 7041440: G1: assert(obj->is_oop_or_null(true )) failed: Error #
johnc
parents: 9417
diff changeset
   821
  // to claim a new region.
59dac2950cc7 7041440: G1: assert(obj->is_oop_or_null(true )) failed: Error #
johnc
parents: 9417
diff changeset
   822
  void reset_active_task_region_fields_in_cset();
59dac2950cc7 7041440: G1: assert(obj->is_oop_or_null(true )) failed: Error #
johnc
parents: 9417
diff changeset
   823
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5344
diff changeset
   824
  // Registers the maximum region-end associated with a set of
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5344
diff changeset
   825
  // regions with CM. Again this is used to determine whether any
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5344
diff changeset
   826
  // heap regions are located above the finger.
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5344
diff changeset
   827
  void register_collection_set_finger(HeapWord* max_finger) {
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5344
diff changeset
   828
    // max_finger is the highest heap region end of the regions currently
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5344
diff changeset
   829
    // contained in the collection set. If this value is larger than
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5344
diff changeset
   830
    // _min_finger then we need to gray objects.
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5344
diff changeset
   831
    // This routine is like registerCSetRegion but for an entire
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5344
diff changeset
   832
    // collection of regions.
9999
5f0b78217054 7055073: G1: code cleanup in the concurrentMark.* files
tonyp
parents: 9995
diff changeset
   833
    if (max_finger > _min_finger) {
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5344
diff changeset
   834
      _should_gray_objects = true;
9999
5f0b78217054 7055073: G1: code cleanup in the concurrentMark.* files
tonyp
parents: 9995
diff changeset
   835
    }
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5344
diff changeset
   836
  }
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5344
diff changeset
   837
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   838
  // Returns "true" if at least one mark has been completed.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   839
  bool at_least_one_mark_complete() { return _at_least_one_mark_complete; }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   840
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   841
  bool isMarked(oop p) const {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   842
    assert(p != NULL && p->is_oop(), "expected an oop");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   843
    HeapWord* addr = (HeapWord*)p;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   844
    assert(addr >= _nextMarkBitMap->startWord() ||
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   845
           addr < _nextMarkBitMap->endWord(), "in a region");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   846
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   847
    return _nextMarkBitMap->isMarked(addr);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   848
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   849
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   850
  inline bool not_yet_marked(oop p) const;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   851
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   852
  // XXX Debug code
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   853
  bool containing_card_is_marked(void* p);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   854
  bool containing_cards_are_marked(void* start, void* last);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   855
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   856
  bool isPrevMarked(oop p) const {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   857
    assert(p != NULL && p->is_oop(), "expected an oop");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   858
    HeapWord* addr = (HeapWord*)p;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   859
    assert(addr >= _prevMarkBitMap->startWord() ||
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   860
           addr < _prevMarkBitMap->endWord(), "in a region");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   861
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   862
    return _prevMarkBitMap->isMarked(addr);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   863
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   864
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   865
  inline bool do_yield_check(int worker_i = 0);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   866
  inline bool should_yield();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   867
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   868
  // Called to abort the marking cycle after a Full GC takes palce.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   869
  void abort();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   870
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   871
  // This prints the global/local fingers. It is used for debugging.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   872
  NOT_PRODUCT(void print_finger();)
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   873
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   874
  void print_summary_info();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   875
4022
2ec87d5043f7 6885041: G1: inconsistent thread dump
tonyp
parents: 3691
diff changeset
   876
  void print_worker_threads_on(outputStream* st) const;
2ec87d5043f7 6885041: G1: inconsistent thread dump
tonyp
parents: 3691
diff changeset
   877
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   878
  // The following indicate whether a given verbose level has been
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   879
  // set. Notice that anything above stats is conditional to
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   880
  // _MARKING_VERBOSE_ having been set to 1
9999
5f0b78217054 7055073: G1: code cleanup in the concurrentMark.* files
tonyp
parents: 9995
diff changeset
   881
  bool verbose_stats() {
5f0b78217054 7055073: G1: code cleanup in the concurrentMark.* files
tonyp
parents: 9995
diff changeset
   882
    return _verbose_level >= stats_verbose;
5f0b78217054 7055073: G1: code cleanup in the concurrentMark.* files
tonyp
parents: 9995
diff changeset
   883
  }
5f0b78217054 7055073: G1: code cleanup in the concurrentMark.* files
tonyp
parents: 9995
diff changeset
   884
  bool verbose_low() {
5f0b78217054 7055073: G1: code cleanup in the concurrentMark.* files
tonyp
parents: 9995
diff changeset
   885
    return _MARKING_VERBOSE_ && _verbose_level >= low_verbose;
5f0b78217054 7055073: G1: code cleanup in the concurrentMark.* files
tonyp
parents: 9995
diff changeset
   886
  }
5f0b78217054 7055073: G1: code cleanup in the concurrentMark.* files
tonyp
parents: 9995
diff changeset
   887
  bool verbose_medium() {
5f0b78217054 7055073: G1: code cleanup in the concurrentMark.* files
tonyp
parents: 9995
diff changeset
   888
    return _MARKING_VERBOSE_ && _verbose_level >= medium_verbose;
5f0b78217054 7055073: G1: code cleanup in the concurrentMark.* files
tonyp
parents: 9995
diff changeset
   889
  }
5f0b78217054 7055073: G1: code cleanup in the concurrentMark.* files
tonyp
parents: 9995
diff changeset
   890
  bool verbose_high() {
5f0b78217054 7055073: G1: code cleanup in the concurrentMark.* files
tonyp
parents: 9995
diff changeset
   891
    return _MARKING_VERBOSE_ && _verbose_level >= high_verbose;
5f0b78217054 7055073: G1: code cleanup in the concurrentMark.* files
tonyp
parents: 9995
diff changeset
   892
  }
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   893
};
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   894
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   895
// A class representing a marking task.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   896
class CMTask : public TerminatorTerminator {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   897
private:
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   898
  enum PrivateConstants {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   899
    // the regular clock call is called once the scanned words reaches
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   900
    // this limit
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   901
    words_scanned_period          = 12*1024,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   902
    // the regular clock call is called once the number of visited
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   903
    // references reaches this limit
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   904
    refs_reached_period           = 384,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   905
    // initial value for the hash seed, used in the work stealing code
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   906
    init_hash_seed                = 17,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   907
    // how many entries will be transferred between global stack and
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   908
    // local queues
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   909
    global_stack_transfer_size    = 16
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   910
  };
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   911
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   912
  int                         _task_id;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   913
  G1CollectedHeap*            _g1h;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   914
  ConcurrentMark*             _cm;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   915
  CMBitMap*                   _nextMarkBitMap;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   916
  // the task queue of this task
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   917
  CMTaskQueue*                _task_queue;
3262
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 2105
diff changeset
   918
private:
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   919
  // the task queue set---needed for stealing
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   920
  CMTaskQueueSet*             _task_queues;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   921
  // indicates whether the task has been claimed---this is only  for
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   922
  // debugging purposes
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   923
  bool                        _claimed;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   924
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   925
  // number of calls to this task
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   926
  int                         _calls;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   927
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   928
  // when the virtual timer reaches this time, the marking step should
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   929
  // exit
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   930
  double                      _time_target_ms;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   931
  // the start time of the current marking step
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   932
  double                      _start_time_ms;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   933
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   934
  // the oop closure used for iterations over oops
9994
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents: 9936
diff changeset
   935
  G1CMOopClosure*             _cm_oop_closure;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   936
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   937
  // the region this task is scanning, NULL if we're not scanning any
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   938
  HeapRegion*                 _curr_region;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   939
  // the local finger of this task, NULL if we're not scanning a region
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   940
  HeapWord*                   _finger;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   941
  // limit of the region this task is scanning, NULL if we're not scanning one
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   942
  HeapWord*                   _region_limit;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   943
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   944
  // This is used only when we scan regions popped from the region
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   945
  // stack. It records what the last object on such a region we
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   946
  // scanned was. It is used to ensure that, if we abort region
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   947
  // iteration, we do not rescan the first part of the region. This
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   948
  // should be NULL when we're not scanning a region from the region
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   949
  // stack.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   950
  HeapWord*                   _region_finger;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   951
6761
f9191297ce83 6941395: G1: Use only lock-free versions of region stack push() and pop()
johnc
parents: 5547
diff changeset
   952
  // If we abort while scanning a region we record the remaining
f9191297ce83 6941395: G1: Use only lock-free versions of region stack push() and pop()
johnc
parents: 5547
diff changeset
   953
  // unscanned portion and check this field when marking restarts.
f9191297ce83 6941395: G1: Use only lock-free versions of region stack push() and pop()
johnc
parents: 5547
diff changeset
   954
  // This avoids having to push on the region stack while other
f9191297ce83 6941395: G1: Use only lock-free versions of region stack push() and pop()
johnc
parents: 5547
diff changeset
   955
  // marking threads may still be popping regions.
f9191297ce83 6941395: G1: Use only lock-free versions of region stack push() and pop()
johnc
parents: 5547
diff changeset
   956
  // If we were to push the unscanned portion directly to the
f9191297ce83 6941395: G1: Use only lock-free versions of region stack push() and pop()
johnc
parents: 5547
diff changeset
   957
  // region stack then we would need to using locking versions
f9191297ce83 6941395: G1: Use only lock-free versions of region stack push() and pop()
johnc
parents: 5547
diff changeset
   958
  // of the push and pop operations.
f9191297ce83 6941395: G1: Use only lock-free versions of region stack push() and pop()
johnc
parents: 5547
diff changeset
   959
  MemRegion                   _aborted_region;
f9191297ce83 6941395: G1: Use only lock-free versions of region stack push() and pop()
johnc
parents: 5547
diff changeset
   960
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   961
  // the number of words this task has scanned
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   962
  size_t                      _words_scanned;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   963
  // When _words_scanned reaches this limit, the regular clock is
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   964
  // called. Notice that this might be decreased under certain
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   965
  // circumstances (i.e. when we believe that we did an expensive
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   966
  // operation).
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   967
  size_t                      _words_scanned_limit;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   968
  // the initial value of _words_scanned_limit (i.e. what it was
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   969
  // before it was decreased).
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   970
  size_t                      _real_words_scanned_limit;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   971
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   972
  // the number of references this task has visited
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   973
  size_t                      _refs_reached;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   974
  // When _refs_reached reaches this limit, the regular clock is
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   975
  // called. Notice this this might be decreased under certain
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   976
  // circumstances (i.e. when we believe that we did an expensive
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   977
  // operation).
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   978
  size_t                      _refs_reached_limit;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   979
  // the initial value of _refs_reached_limit (i.e. what it was before
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   980
  // it was decreased).
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   981
  size_t                      _real_refs_reached_limit;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   982
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   983
  // used by the work stealing stuff
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   984
  int                         _hash_seed;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   985
  // if this is true, then the task has aborted for some reason
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   986
  bool                        _has_aborted;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   987
  // set when the task aborts because it has met its time quota
8073
a14dc27842dc 6608385: G1: need to support parallel reference processing
johnc
parents: 7923
diff changeset
   988
  bool                        _has_timed_out;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   989
  // true when we're draining SATB buffers; this avoids the task
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   990
  // aborting due to SATB buffers being available (as we're already
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   991
  // dealing with them)
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   992
  bool                        _draining_satb_buffers;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   993
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   994
  // number sequence of past step times
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   995
  NumberSeq                   _step_times_ms;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   996
  // elapsed time of this task
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   997
  double                      _elapsed_time_ms;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   998
  // termination time of this task
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   999
  double                      _termination_time_ms;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1000
  // when this task got into the termination protocol
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1001
  double                      _termination_start_time_ms;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1002
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1003
  // true when the task is during a concurrent phase, false when it is
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1004
  // in the remark phase (so, in the latter case, we do not have to
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1005
  // check all the things that we have to check during the concurrent
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1006
  // phase, i.e. SATB buffer availability...)
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1007
  bool                        _concurrent;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1008
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1009
  TruncatedSeq                _marking_step_diffs_ms;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1010
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1011
  // LOTS of statistics related with this task
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1012
#if _MARKING_STATS_
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1013
  NumberSeq                   _all_clock_intervals_ms;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1014
  double                      _interval_start_time_ms;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1015
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1016
  int                         _aborted;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1017
  int                         _aborted_overflow;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1018
  int                         _aborted_cm_aborted;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1019
  int                         _aborted_yield;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1020
  int                         _aborted_timed_out;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1021
  int                         _aborted_satb;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1022
  int                         _aborted_termination;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1023
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1024
  int                         _steal_attempts;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1025
  int                         _steals;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1026
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1027
  int                         _clock_due_to_marking;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1028
  int                         _clock_due_to_scanning;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1029
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1030
  int                         _local_pushes;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1031
  int                         _local_pops;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1032
  int                         _local_max_size;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1033
  int                         _objs_scanned;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1034
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1035
  int                         _global_pushes;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1036
  int                         _global_pops;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1037
  int                         _global_max_size;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1038
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1039
  int                         _global_transfers_to;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1040
  int                         _global_transfers_from;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1041
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1042
  int                         _region_stack_pops;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1043
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1044
  int                         _regions_claimed;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1045
  int                         _objs_found_on_bitmap;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1046
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1047
  int                         _satb_buffers_processed;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1048
#endif // _MARKING_STATS_
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1049
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1050
  // it updates the local fields after this task has claimed
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1051
  // a new region to scan
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1052
  void setup_for_region(HeapRegion* hr);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1053
  // it brings up-to-date the limit of the region
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1054
  void update_region_limit();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1055
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1056
  // called when either the words scanned or the refs visited limit
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1057
  // has been reached
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1058
  void reached_limit();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1059
  // recalculates the words scanned and refs visited limits
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1060
  void recalculate_limits();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1061
  // decreases the words scanned and refs visited limits when we reach
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1062
  // an expensive operation
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1063
  void decrease_limits();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1064
  // it checks whether the words scanned or refs visited reached their
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1065
  // respective limit and calls reached_limit() if they have
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1066
  void check_limits() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1067
    if (_words_scanned >= _words_scanned_limit ||
9999
5f0b78217054 7055073: G1: code cleanup in the concurrentMark.* files
tonyp
parents: 9995
diff changeset
  1068
        _refs_reached >= _refs_reached_limit) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1069
      reached_limit();
9999
5f0b78217054 7055073: G1: code cleanup in the concurrentMark.* files
tonyp
parents: 9995
diff changeset
  1070
    }
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1071
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1072
  // this is supposed to be called regularly during a marking step as
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1073
  // it checks a bunch of conditions that might cause the marking step
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1074
  // to abort
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1075
  void regular_clock_call();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1076
  bool concurrent() { return _concurrent; }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1077
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1078
public:
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1079
  // It resets the task; it should be called right at the beginning of
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1080
  // a marking phase.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1081
  void reset(CMBitMap* _nextMarkBitMap);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1082
  // it clears all the fields that correspond to a claimed region.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1083
  void clear_region_fields();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1084
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1085
  void set_concurrent(bool concurrent) { _concurrent = concurrent; }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1086
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1087
  // The main method of this class which performs a marking step
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1088
  // trying not to exceed the given duration. However, it might exit
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1089
  // prematurely, according to some conditions (i.e. SATB buffers are
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1090
  // available for processing).
8073
a14dc27842dc 6608385: G1: need to support parallel reference processing
johnc
parents: 7923
diff changeset
  1091
  void do_marking_step(double target_ms, bool do_stealing, bool do_termination);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1092
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1093
  // These two calls start and stop the timer
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1094
  void record_start_time() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1095
    _elapsed_time_ms = os::elapsedTime() * 1000.0;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1096
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1097
  void record_end_time() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1098
    _elapsed_time_ms = os::elapsedTime() * 1000.0 - _elapsed_time_ms;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1099
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1100
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1101
  // returns the task ID
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1102
  int task_id() { return _task_id; }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1103
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1104
  // From TerminatorTerminator. It determines whether this task should
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1105
  // exit the termination protocol after it's entered it.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1106
  virtual bool should_exit_termination();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1107
9936
59dac2950cc7 7041440: G1: assert(obj->is_oop_or_null(true )) failed: Error #
johnc
parents: 9417
diff changeset
  1108
  // Resets the local region fields after a task has finished scanning a
59dac2950cc7 7041440: G1: assert(obj->is_oop_or_null(true )) failed: Error #
johnc
parents: 9417
diff changeset
  1109
  // region; or when they have become stale as a result of the region
59dac2950cc7 7041440: G1: assert(obj->is_oop_or_null(true )) failed: Error #
johnc
parents: 9417
diff changeset
  1110
  // being evacuated.
59dac2950cc7 7041440: G1: assert(obj->is_oop_or_null(true )) failed: Error #
johnc
parents: 9417
diff changeset
  1111
  void giveup_current_region();
59dac2950cc7 7041440: G1: assert(obj->is_oop_or_null(true )) failed: Error #
johnc
parents: 9417
diff changeset
  1112
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1113
  HeapWord* finger()            { return _finger; }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1114
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1115
  bool has_aborted()            { return _has_aborted; }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1116
  void set_has_aborted()        { _has_aborted = true; }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1117
  void clear_has_aborted()      { _has_aborted = false; }
8073
a14dc27842dc 6608385: G1: need to support parallel reference processing
johnc
parents: 7923
diff changeset
  1118
  bool has_timed_out()          { return _has_timed_out; }
a14dc27842dc 6608385: G1: need to support parallel reference processing
johnc
parents: 7923
diff changeset
  1119
  bool claimed()                { return _claimed; }
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1120
6761
f9191297ce83 6941395: G1: Use only lock-free versions of region stack push() and pop()
johnc
parents: 5547
diff changeset
  1121
  // Support routines for the partially scanned region that may be
f9191297ce83 6941395: G1: Use only lock-free versions of region stack push() and pop()
johnc
parents: 5547
diff changeset
  1122
  // recorded as a result of aborting while draining the CMRegionStack
f9191297ce83 6941395: G1: Use only lock-free versions of region stack push() and pop()
johnc
parents: 5547
diff changeset
  1123
  MemRegion aborted_region()    { return _aborted_region; }
f9191297ce83 6941395: G1: Use only lock-free versions of region stack push() and pop()
johnc
parents: 5547
diff changeset
  1124
  void set_aborted_region(MemRegion mr)
f9191297ce83 6941395: G1: Use only lock-free versions of region stack push() and pop()
johnc
parents: 5547
diff changeset
  1125
                                { _aborted_region = mr; }
f9191297ce83 6941395: G1: Use only lock-free versions of region stack push() and pop()
johnc
parents: 5547
diff changeset
  1126
f9191297ce83 6941395: G1: Use only lock-free versions of region stack push() and pop()
johnc
parents: 5547
diff changeset
  1127
  // Clears any recorded partially scanned region
f9191297ce83 6941395: G1: Use only lock-free versions of region stack push() and pop()
johnc
parents: 5547
diff changeset
  1128
  void clear_aborted_region()   { set_aborted_region(MemRegion()); }
f9191297ce83 6941395: G1: Use only lock-free versions of region stack push() and pop()
johnc
parents: 5547
diff changeset
  1129
9994
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents: 9936
diff changeset
  1130
  void set_cm_oop_closure(G1CMOopClosure* cm_oop_closure);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1131
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1132
  // It grays the object by marking it and, if necessary, pushing it
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1133
  // on the local queue
9994
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents: 9936
diff changeset
  1134
  inline void deal_with_reference(oop obj);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1135
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1136
  // It scans an object and visits its children.
9994
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents: 9936
diff changeset
  1137
  void scan_object(oop obj);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1138
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1139
  // It pushes an object on the local queue.
9994
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents: 9936
diff changeset
  1140
  inline void push(oop obj);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1141
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1142
  // These two move entries to/from the global stack.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1143
  void move_entries_to_global_stack();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1144
  void get_entries_from_global_stack();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1145
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1146
  // It pops and scans objects from the local queue. If partially is
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1147
  // true, then it stops when the queue size is of a given limit. If
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1148
  // partially is false, then it stops when the queue is empty.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1149
  void drain_local_queue(bool partially);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1150
  // It moves entries from the global stack to the local queue and
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1151
  // drains the local queue. If partially is true, then it stops when
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1152
  // both the global stack and the local queue reach a given size. If
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1153
  // partially if false, it tries to empty them totally.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1154
  void drain_global_stack(bool partially);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1155
  // It keeps picking SATB buffers and processing them until no SATB
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1156
  // buffers are available.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1157
  void drain_satb_buffers();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1158
  // It keeps popping regions from the region stack and processing
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1159
  // them until the region stack is empty.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1160
  void drain_region_stack(BitMapClosure* closure);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1161
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1162
  // moves the local finger to a new location
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1163
  inline void move_finger_to(HeapWord* new_finger) {
4026
10386ea70fe5 6888619: G1: too many guarantees in concurrent marking
tonyp
parents: 4022
diff changeset
  1164
    assert(new_finger >= _finger && new_finger < _region_limit, "invariant");
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1165
    _finger = new_finger;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1166
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1167
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1168
  // moves the region finger to a new location
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1169
  inline void move_region_finger_to(HeapWord* new_finger) {
4026
10386ea70fe5 6888619: G1: too many guarantees in concurrent marking
tonyp
parents: 4022
diff changeset
  1170
    assert(new_finger < _cm->finger(), "invariant");
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1171
    _region_finger = new_finger;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1172
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1173
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1174
  CMTask(int task_num, ConcurrentMark *cm,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1175
         CMTaskQueue* task_queue, CMTaskQueueSet* task_queues);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1176
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1177
  // it prints statistics associated with this task
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1178
  void print_stats();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1179
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1180
#if _MARKING_STATS_
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1181
  void increase_objs_found_on_bitmap() { ++_objs_found_on_bitmap; }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1182
#endif // _MARKING_STATS_
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1183
};
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6761
diff changeset
  1184
8930
52368505ee8e 7027766: G1: introduce flag to dump the liveness information per region at the end of marking
tonyp
parents: 8073
diff changeset
  1185
// Class that's used to to print out per-region liveness
52368505ee8e 7027766: G1: introduce flag to dump the liveness information per region at the end of marking
tonyp
parents: 8073
diff changeset
  1186
// information. It's currently used at the end of marking and also
52368505ee8e 7027766: G1: introduce flag to dump the liveness information per region at the end of marking
tonyp
parents: 8073
diff changeset
  1187
// after we sort the old regions at the end of the cleanup operation.
52368505ee8e 7027766: G1: introduce flag to dump the liveness information per region at the end of marking
tonyp
parents: 8073
diff changeset
  1188
class G1PrintRegionLivenessInfoClosure: public HeapRegionClosure {
52368505ee8e 7027766: G1: introduce flag to dump the liveness information per region at the end of marking
tonyp
parents: 8073
diff changeset
  1189
private:
52368505ee8e 7027766: G1: introduce flag to dump the liveness information per region at the end of marking
tonyp
parents: 8073
diff changeset
  1190
  outputStream* _out;
52368505ee8e 7027766: G1: introduce flag to dump the liveness information per region at the end of marking
tonyp
parents: 8073
diff changeset
  1191
52368505ee8e 7027766: G1: introduce flag to dump the liveness information per region at the end of marking
tonyp
parents: 8073
diff changeset
  1192
  // Accumulators for these values.
52368505ee8e 7027766: G1: introduce flag to dump the liveness information per region at the end of marking
tonyp
parents: 8073
diff changeset
  1193
  size_t _total_used_bytes;
52368505ee8e 7027766: G1: introduce flag to dump the liveness information per region at the end of marking
tonyp
parents: 8073
diff changeset
  1194
  size_t _total_capacity_bytes;
52368505ee8e 7027766: G1: introduce flag to dump the liveness information per region at the end of marking
tonyp
parents: 8073
diff changeset
  1195
  size_t _total_prev_live_bytes;
52368505ee8e 7027766: G1: introduce flag to dump the liveness information per region at the end of marking
tonyp
parents: 8073
diff changeset
  1196
  size_t _total_next_live_bytes;
52368505ee8e 7027766: G1: introduce flag to dump the liveness information per region at the end of marking
tonyp
parents: 8073
diff changeset
  1197
52368505ee8e 7027766: G1: introduce flag to dump the liveness information per region at the end of marking
tonyp
parents: 8073
diff changeset
  1198
  // These are set up when we come across a "stars humongous" region
52368505ee8e 7027766: G1: introduce flag to dump the liveness information per region at the end of marking
tonyp
parents: 8073
diff changeset
  1199
  // (as this is where most of this information is stored, not in the
52368505ee8e 7027766: G1: introduce flag to dump the liveness information per region at the end of marking
tonyp
parents: 8073
diff changeset
  1200
  // subsequent "continues humongous" regions). After that, for every
52368505ee8e 7027766: G1: introduce flag to dump the liveness information per region at the end of marking
tonyp
parents: 8073
diff changeset
  1201
  // region in a given humongous region series we deduce the right
52368505ee8e 7027766: G1: introduce flag to dump the liveness information per region at the end of marking
tonyp
parents: 8073
diff changeset
  1202
  // values for it by simply subtracting the appropriate amount from
52368505ee8e 7027766: G1: introduce flag to dump the liveness information per region at the end of marking
tonyp
parents: 8073
diff changeset
  1203
  // these fields. All these values should reach 0 after we've visited
52368505ee8e 7027766: G1: introduce flag to dump the liveness information per region at the end of marking
tonyp
parents: 8073
diff changeset
  1204
  // the last region in the series.
52368505ee8e 7027766: G1: introduce flag to dump the liveness information per region at the end of marking
tonyp
parents: 8073
diff changeset
  1205
  size_t _hum_used_bytes;
52368505ee8e 7027766: G1: introduce flag to dump the liveness information per region at the end of marking
tonyp
parents: 8073
diff changeset
  1206
  size_t _hum_capacity_bytes;
52368505ee8e 7027766: G1: introduce flag to dump the liveness information per region at the end of marking
tonyp
parents: 8073
diff changeset
  1207
  size_t _hum_prev_live_bytes;
52368505ee8e 7027766: G1: introduce flag to dump the liveness information per region at the end of marking
tonyp
parents: 8073
diff changeset
  1208
  size_t _hum_next_live_bytes;
52368505ee8e 7027766: G1: introduce flag to dump the liveness information per region at the end of marking
tonyp
parents: 8073
diff changeset
  1209
52368505ee8e 7027766: G1: introduce flag to dump the liveness information per region at the end of marking
tonyp
parents: 8073
diff changeset
  1210
  static double perc(size_t val, size_t total) {
52368505ee8e 7027766: G1: introduce flag to dump the liveness information per region at the end of marking
tonyp
parents: 8073
diff changeset
  1211
    if (total == 0) {
52368505ee8e 7027766: G1: introduce flag to dump the liveness information per region at the end of marking
tonyp
parents: 8073
diff changeset
  1212
      return 0.0;
52368505ee8e 7027766: G1: introduce flag to dump the liveness information per region at the end of marking
tonyp
parents: 8073
diff changeset
  1213
    } else {
52368505ee8e 7027766: G1: introduce flag to dump the liveness information per region at the end of marking
tonyp
parents: 8073
diff changeset
  1214
      return 100.0 * ((double) val / (double) total);
52368505ee8e 7027766: G1: introduce flag to dump the liveness information per region at the end of marking
tonyp
parents: 8073
diff changeset
  1215
    }
52368505ee8e 7027766: G1: introduce flag to dump the liveness information per region at the end of marking
tonyp
parents: 8073
diff changeset
  1216
  }
52368505ee8e 7027766: G1: introduce flag to dump the liveness information per region at the end of marking
tonyp
parents: 8073
diff changeset
  1217
52368505ee8e 7027766: G1: introduce flag to dump the liveness information per region at the end of marking
tonyp
parents: 8073
diff changeset
  1218
  static double bytes_to_mb(size_t val) {
52368505ee8e 7027766: G1: introduce flag to dump the liveness information per region at the end of marking
tonyp
parents: 8073
diff changeset
  1219
    return (double) val / (double) M;
52368505ee8e 7027766: G1: introduce flag to dump the liveness information per region at the end of marking
tonyp
parents: 8073
diff changeset
  1220
  }
52368505ee8e 7027766: G1: introduce flag to dump the liveness information per region at the end of marking
tonyp
parents: 8073
diff changeset
  1221
52368505ee8e 7027766: G1: introduce flag to dump the liveness information per region at the end of marking
tonyp
parents: 8073
diff changeset
  1222
  // See the .cpp file.
52368505ee8e 7027766: G1: introduce flag to dump the liveness information per region at the end of marking
tonyp
parents: 8073
diff changeset
  1223
  size_t get_hum_bytes(size_t* hum_bytes);
52368505ee8e 7027766: G1: introduce flag to dump the liveness information per region at the end of marking
tonyp
parents: 8073
diff changeset
  1224
  void get_hum_bytes(size_t* used_bytes, size_t* capacity_bytes,
52368505ee8e 7027766: G1: introduce flag to dump the liveness information per region at the end of marking
tonyp
parents: 8073
diff changeset
  1225
                     size_t* prev_live_bytes, size_t* next_live_bytes);
52368505ee8e 7027766: G1: introduce flag to dump the liveness information per region at the end of marking
tonyp
parents: 8073
diff changeset
  1226
52368505ee8e 7027766: G1: introduce flag to dump the liveness information per region at the end of marking
tonyp
parents: 8073
diff changeset
  1227
public:
52368505ee8e 7027766: G1: introduce flag to dump the liveness information per region at the end of marking
tonyp
parents: 8073
diff changeset
  1228
  // The header and footer are printed in the constructor and
52368505ee8e 7027766: G1: introduce flag to dump the liveness information per region at the end of marking
tonyp
parents: 8073
diff changeset
  1229
  // destructor respectively.
52368505ee8e 7027766: G1: introduce flag to dump the liveness information per region at the end of marking
tonyp
parents: 8073
diff changeset
  1230
  G1PrintRegionLivenessInfoClosure(outputStream* out, const char* phase_name);
52368505ee8e 7027766: G1: introduce flag to dump the liveness information per region at the end of marking
tonyp
parents: 8073
diff changeset
  1231
  virtual bool doHeapRegion(HeapRegion* r);
52368505ee8e 7027766: G1: introduce flag to dump the liveness information per region at the end of marking
tonyp
parents: 8073
diff changeset
  1232
  ~G1PrintRegionLivenessInfoClosure();
52368505ee8e 7027766: G1: introduce flag to dump the liveness information per region at the end of marking
tonyp
parents: 8073
diff changeset
  1233
};
52368505ee8e 7027766: G1: introduce flag to dump the liveness information per region at the end of marking
tonyp
parents: 8073
diff changeset
  1234
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6761
diff changeset
  1235
#endif // SHARE_VM_GC_IMPLEMENTATION_G1_CONCURRENTMARK_HPP