hotspot/src/share/vm/gc_implementation/g1/concurrentMark.hpp
author johnc
Thu, 09 May 2013 11:16:39 -0700
changeset 17327 4bd0581aa231
parent 16685 41c34debcde0
child 17395 2cd3ef1be718
permissions -rw-r--r--
7176479: G1: JVM crashes on T5-8 system with 1.5 TB heap Summary: Refactor G1's hot card cache and card counts table into their own files. Simplify the card counts table, including removing the encoding of the card index in each entry. The card counts table now has a 1:1 correspondence with the cards spanned by heap. Space for the card counts table is reserved from virtual memory (rather than C heap) during JVM startup and is committed/expanded when the heap is expanded. Changes were also reviewed-by Vitaly Davidovich. Reviewed-by: tschatzl, jmasa
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
/*
15090
18bfcc1bbe39 8004816: G1: Kitchensink failures after marking stack changes
johnc
parents: 14740
diff changeset
     2
 * Copyright (c) 2001, 2013, 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;
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 12381
diff changeset
    33
typedef GenericTaskQueue<oop, mtGC>            CMTaskQueue;
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 12381
diff changeset
    34
typedef GenericTaskQueueSet<CMTaskQueue, mtGC> 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:
12272
f87fd1292095 7127697: G1: remove dead code after recent concurrent mark changes
tonyp
parents: 11584
diff changeset
    45
  G1CMIsAliveClosure(G1CollectedHeap* g1) : _g1(g1) { }
7657
a80e571c3d96 7006113: G1: Initialize ReferenceProcessor::_is_alive_non_header field
johnc
parents: 7397
diff changeset
    46
a80e571c3d96 7006113: G1: Initialize ReferenceProcessor::_is_alive_non_header field
johnc
parents: 7397
diff changeset
    47
  void do_object(oop obj) {
a80e571c3d96 7006113: G1: Initialize ReferenceProcessor::_is_alive_non_header field
johnc
parents: 7397
diff changeset
    48
    ShouldNotCallThis();
a80e571c3d96 7006113: G1: Initialize ReferenceProcessor::_is_alive_non_header field
johnc
parents: 7397
diff changeset
    49
  }
a80e571c3d96 7006113: G1: Initialize ReferenceProcessor::_is_alive_non_header field
johnc
parents: 7397
diff changeset
    50
  bool do_object_b(oop obj);
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
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    53
// 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
    54
// class, with one bit per (1<<_shifter) HeapWords.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    55
2013
49e915da0905 6700941: G1: allocation spec missing for some G1 classes
apetrusenko
parents: 1374
diff changeset
    56
class CMBitMapRO VALUE_OBJ_CLASS_SPEC {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    57
 protected:
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    58
  HeapWord* _bmStartWord;      // base address of range covered by map
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    59
  size_t    _bmWordSize;       // map size (in #HeapWords covered)
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    60
  const int _shifter;          // map to char or bit
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    61
  VirtualSpace _virtual_space; // underlying the bit map
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    62
  BitMap    _bm;               // the bit map itself
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    63
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    64
 public:
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    65
  // constructor
14740
1431ef92fed1 8000244: G1: Ergonomically set MarkStackSize and use virtual space for global marking stack
johnc
parents: 14073
diff changeset
    66
  CMBitMapRO(int shifter);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    67
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    68
  enum { do_yield = true };
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
  // inquiries
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    71
  HeapWord* startWord()   const { return _bmStartWord; }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    72
  size_t    sizeInWords() const { return _bmWordSize;  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    73
  // the following is one past the last word in space
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    74
  HeapWord* endWord()     const { return _bmStartWord + _bmWordSize; }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    75
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    76
  // read marks
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
  bool isMarked(HeapWord* addr) const {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    79
    assert(_bmStartWord <= addr && addr < (_bmStartWord + _bmWordSize),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    80
           "outside underlying space?");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    81
    return _bm.at(heapWordToOffset(addr));
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    82
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    83
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    84
  // iteration
11574
8a7fe61966c0 7121547: G1: High number mispredicted branches while iterating over the marking bitmap
johnc
parents: 11455
diff changeset
    85
  inline bool iterate(BitMapClosure* cl, MemRegion mr);
8a7fe61966c0 7121547: G1: High number mispredicted branches while iterating over the marking bitmap
johnc
parents: 11455
diff changeset
    86
  inline bool iterate(BitMapClosure* cl);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    87
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    88
  // 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
    89
  // "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
    90
  // 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
    91
  HeapWord* getNextMarkedWordAddress(HeapWord* addr,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    92
                                     HeapWord* limit = NULL) const;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    93
  // 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
    94
  // "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
    95
  // 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
    96
  HeapWord* getNextUnmarkedWordAddress(HeapWord* addr,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    97
                                       HeapWord* limit = NULL) const;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    98
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    99
  // conversion utilities
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   100
  HeapWord* offsetToHeapWord(size_t offset) const {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   101
    return _bmStartWord + (offset << _shifter);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   102
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   103
  size_t heapWordToOffset(HeapWord* addr) const {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   104
    return pointer_delta(addr, _bmStartWord) >> _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
  int heapWordDiffToOffsetDiff(size_t diff) const;
15949
a55dea304e8c 8008079: G1: Add nextObject routine to CMBitMapRO and replace nextWord
tamao
parents: 15495
diff changeset
   107
a55dea304e8c 8008079: G1: Add nextObject routine to CMBitMapRO and replace nextWord
tamao
parents: 15495
diff changeset
   108
  // The argument addr should be the start address of a valid object
a55dea304e8c 8008079: G1: Add nextObject routine to CMBitMapRO and replace nextWord
tamao
parents: 15495
diff changeset
   109
  HeapWord* nextObject(HeapWord* addr) {
a55dea304e8c 8008079: G1: Add nextObject routine to CMBitMapRO and replace nextWord
tamao
parents: 15495
diff changeset
   110
    oop obj = (oop) addr;
a55dea304e8c 8008079: G1: Add nextObject routine to CMBitMapRO and replace nextWord
tamao
parents: 15495
diff changeset
   111
    HeapWord* res =  addr + obj->size();
a55dea304e8c 8008079: G1: Add nextObject routine to CMBitMapRO and replace nextWord
tamao
parents: 15495
diff changeset
   112
    assert(offsetToHeapWord(heapWordToOffset(res)) == res, "sanity");
a55dea304e8c 8008079: G1: Add nextObject routine to CMBitMapRO and replace nextWord
tamao
parents: 15495
diff changeset
   113
    return res;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   114
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   115
16685
41c34debcde0 8011872: Include Bit Map addresses in the hs_err files
stefank
parents: 16389
diff changeset
   116
  void print_on_error(outputStream* st, const char* prefix) const;
41c34debcde0 8011872: Include Bit Map addresses in the hs_err files
stefank
parents: 16389
diff changeset
   117
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   118
  // debugging
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   119
  NOT_PRODUCT(bool covers(ReservedSpace rs) const;)
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   120
};
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   121
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   122
class CMBitMap : public CMBitMapRO {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   123
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   124
 public:
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   125
  // constructor
14740
1431ef92fed1 8000244: G1: Ergonomically set MarkStackSize and use virtual space for global marking stack
johnc
parents: 14073
diff changeset
   126
  CMBitMap(int shifter) :
1431ef92fed1 8000244: G1: Ergonomically set MarkStackSize and use virtual space for global marking stack
johnc
parents: 14073
diff changeset
   127
    CMBitMapRO(shifter) {}
1431ef92fed1 8000244: G1: Ergonomically set MarkStackSize and use virtual space for global marking stack
johnc
parents: 14073
diff changeset
   128
1431ef92fed1 8000244: G1: Ergonomically set MarkStackSize and use virtual space for global marking stack
johnc
parents: 14073
diff changeset
   129
  // Allocates the back store for the marking bitmap
1431ef92fed1 8000244: G1: Ergonomically set MarkStackSize and use virtual space for global marking stack
johnc
parents: 14073
diff changeset
   130
  bool allocate(ReservedSpace heap_rs);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   131
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   132
  // write marks
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   133
  void mark(HeapWord* addr) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   134
    assert(_bmStartWord <= addr && addr < (_bmStartWord + _bmWordSize),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   135
           "outside underlying space?");
9994
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents: 9936
diff changeset
   136
    _bm.set_bit(heapWordToOffset(addr));
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   137
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   138
  void clear(HeapWord* addr) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   139
    assert(_bmStartWord <= addr && addr < (_bmStartWord + _bmWordSize),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   140
           "outside underlying space?");
9994
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents: 9936
diff changeset
   141
    _bm.clear_bit(heapWordToOffset(addr));
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   142
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   143
  bool parMark(HeapWord* addr) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   144
    assert(_bmStartWord <= addr && addr < (_bmStartWord + _bmWordSize),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   145
           "outside underlying space?");
9994
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents: 9936
diff changeset
   146
    return _bm.par_set_bit(heapWordToOffset(addr));
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   147
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   148
  bool parClear(HeapWord* addr) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   149
    assert(_bmStartWord <= addr && addr < (_bmStartWord + _bmWordSize),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   150
           "outside underlying space?");
9994
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents: 9936
diff changeset
   151
    return _bm.par_clear_bit(heapWordToOffset(addr));
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   152
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   153
  void markRange(MemRegion mr);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   154
  void clearAll();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   155
  void clearRange(MemRegion mr);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   156
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   157
  // Starting at the bit corresponding to "addr" (inclusive), find the next
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   158
  // "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
   159
  // 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
   160
  // 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
   161
  // 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
   162
  // 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
   163
  // MemRegion.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   164
  MemRegion getAndClearMarkedRegion(HeapWord* addr, HeapWord* end_addr);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   165
};
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   166
14740
1431ef92fed1 8000244: G1: Ergonomically set MarkStackSize and use virtual space for global marking stack
johnc
parents: 14073
diff changeset
   167
// Represents a marking stack used by ConcurrentMarking in the G1 collector.
2013
49e915da0905 6700941: G1: allocation spec missing for some G1 classes
apetrusenko
parents: 1374
diff changeset
   168
class CMMarkStack VALUE_OBJ_CLASS_SPEC {
14740
1431ef92fed1 8000244: G1: Ergonomically set MarkStackSize and use virtual space for global marking stack
johnc
parents: 14073
diff changeset
   169
  VirtualSpace _virtual_space;   // Underlying backing store for actual stack
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   170
  ConcurrentMark* _cm;
16388
60de0264afe8 8009536: G1: Apache Lucene hang during reference processing
johnc
parents: 15949
diff changeset
   171
  oop* _base;        // bottom of stack
14740
1431ef92fed1 8000244: G1: Ergonomically set MarkStackSize and use virtual space for global marking stack
johnc
parents: 14073
diff changeset
   172
  jint _index;       // one more than last occupied index
1431ef92fed1 8000244: G1: Ergonomically set MarkStackSize and use virtual space for global marking stack
johnc
parents: 14073
diff changeset
   173
  jint _capacity;    // max #elements
1431ef92fed1 8000244: G1: Ergonomically set MarkStackSize and use virtual space for global marking stack
johnc
parents: 14073
diff changeset
   174
  jint _saved_index; // value of _index saved at start of GC
1431ef92fed1 8000244: G1: Ergonomically set MarkStackSize and use virtual space for global marking stack
johnc
parents: 14073
diff changeset
   175
  NOT_PRODUCT(jint _max_depth;)   // max depth plumbed during run
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   176
14740
1431ef92fed1 8000244: G1: Ergonomically set MarkStackSize and use virtual space for global marking stack
johnc
parents: 14073
diff changeset
   177
  bool  _overflow;
1431ef92fed1 8000244: G1: Ergonomically set MarkStackSize and use virtual space for global marking stack
johnc
parents: 14073
diff changeset
   178
  bool  _should_expand;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   179
  DEBUG_ONLY(bool _drain_in_progress;)
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   180
  DEBUG_ONLY(bool _drain_in_progress_yields;)
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   181
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   182
 public:
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   183
  CMMarkStack(ConcurrentMark* cm);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   184
  ~CMMarkStack();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   185
14740
1431ef92fed1 8000244: G1: Ergonomically set MarkStackSize and use virtual space for global marking stack
johnc
parents: 14073
diff changeset
   186
#ifndef PRODUCT
1431ef92fed1 8000244: G1: Ergonomically set MarkStackSize and use virtual space for global marking stack
johnc
parents: 14073
diff changeset
   187
  jint max_depth() const {
1431ef92fed1 8000244: G1: Ergonomically set MarkStackSize and use virtual space for global marking stack
johnc
parents: 14073
diff changeset
   188
    return _max_depth;
1431ef92fed1 8000244: G1: Ergonomically set MarkStackSize and use virtual space for global marking stack
johnc
parents: 14073
diff changeset
   189
  }
1431ef92fed1 8000244: G1: Ergonomically set MarkStackSize and use virtual space for global marking stack
johnc
parents: 14073
diff changeset
   190
#endif
1431ef92fed1 8000244: G1: Ergonomically set MarkStackSize and use virtual space for global marking stack
johnc
parents: 14073
diff changeset
   191
1431ef92fed1 8000244: G1: Ergonomically set MarkStackSize and use virtual space for global marking stack
johnc
parents: 14073
diff changeset
   192
  bool allocate(size_t capacity);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   193
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   194
  oop pop() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   195
    if (!isEmpty()) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   196
      return _base[--_index] ;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   197
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   198
    return NULL;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   199
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   200
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   201
  // 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
   202
  // *Requires* that "ptr" is already marked.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   203
  void push(oop ptr) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   204
    if (isFull()) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   205
      // Record overflow.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   206
      _overflow = true;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   207
      return;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   208
    } else {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   209
      _base[_index++] = ptr;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   210
      NOT_PRODUCT(_max_depth = MAX2(_max_depth, _index));
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   211
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   212
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   213
  // Non-block impl.  Note: concurrency is allowed only with other
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   214
  // "par_push" operations, not with "pop" or "drain".  We would need
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   215
  // parallel versions of them if such concurrency was desired.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   216
  void par_push(oop ptr);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   217
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   218
  // Pushes the first "n" elements of "ptr_arr" on the stack.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   219
  // Non-block impl.  Note: concurrency is allowed only with other
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   220
  // "par_adjoin_arr" or "push" operations, not with "pop" or "drain".
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   221
  void par_adjoin_arr(oop* ptr_arr, int n);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   222
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   223
  // Pushes the first "n" elements of "ptr_arr" on the stack.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   224
  // Locking impl: concurrency is allowed only with
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   225
  // "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
   226
  // locking strategy.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   227
  void par_push_arr(oop* ptr_arr, int n);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   228
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   229
  // 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
   230
  // 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
   231
  // unspecified order.  The actual number transferred is given in "n" ("n
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   232
  // == 0" is deliberately redundant with the return value.)  Locking impl:
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   233
  // 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
   234
  // operations, which use the same locking strategy.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   235
  bool par_pop_arr(oop* ptr_arr, int max, int* n);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   236
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   237
  // 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
   238
  // 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
   239
  // even if closure applications add entries to the stack.)  The "bm"
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   240
  // 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
   241
  // 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
   242
  // concurrent marker performing the drain offers to yield after
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   243
  // processing each object.  If a yield occurs, stops the drain operation
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   244
  // and returns false.  Otherwise, returns true.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   245
  template<class OopClosureClass>
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   246
  bool drain(OopClosureClass* cl, CMBitMap* bm, bool yield_after = false);
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
  bool isEmpty()    { return _index == 0; }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   249
  bool isFull()     { return _index == _capacity; }
14740
1431ef92fed1 8000244: G1: Ergonomically set MarkStackSize and use virtual space for global marking stack
johnc
parents: 14073
diff changeset
   250
  int  maxElems()   { return _capacity; }
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   251
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   252
  bool overflow() { return _overflow; }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   253
  void clear_overflow() { _overflow = false; }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   254
14740
1431ef92fed1 8000244: G1: Ergonomically set MarkStackSize and use virtual space for global marking stack
johnc
parents: 14073
diff changeset
   255
  bool should_expand() const { return _should_expand; }
1431ef92fed1 8000244: G1: Ergonomically set MarkStackSize and use virtual space for global marking stack
johnc
parents: 14073
diff changeset
   256
  void set_should_expand();
1431ef92fed1 8000244: G1: Ergonomically set MarkStackSize and use virtual space for global marking stack
johnc
parents: 14073
diff changeset
   257
1431ef92fed1 8000244: G1: Ergonomically set MarkStackSize and use virtual space for global marking stack
johnc
parents: 14073
diff changeset
   258
  // Expand the stack, typically in response to an overflow condition
1431ef92fed1 8000244: G1: Ergonomically set MarkStackSize and use virtual space for global marking stack
johnc
parents: 14073
diff changeset
   259
  void expand();
1431ef92fed1 8000244: G1: Ergonomically set MarkStackSize and use virtual space for global marking stack
johnc
parents: 14073
diff changeset
   260
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   261
  int  size() { return _index; }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   262
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   263
  void setEmpty()   { _index = 0; clear_overflow(); }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   264
11455
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11396
diff changeset
   265
  // Record the current index.
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11396
diff changeset
   266
  void note_start_of_gc();
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11396
diff changeset
   267
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11396
diff changeset
   268
  // Make sure that we have not added any entries to the stack during GC.
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11396
diff changeset
   269
  void note_end_of_gc();
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11396
diff changeset
   270
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   271
  // 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
   272
  // the call above.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   273
  void oops_do(OopClosure* f);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   274
};
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   275
9417
6719a2e727c0 7034139: G1: assert(Thread::current()->is_ConcurrentGC_thread()) failed: only a conc GC thread can call this.
tonyp
parents: 8930
diff changeset
   276
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
   277
private:
6719a2e727c0 7034139: G1: assert(Thread::current()->is_ConcurrentGC_thread()) failed: only a conc GC thread can call this.
tonyp
parents: 8930
diff changeset
   278
#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
   279
  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
   280
  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
   281
#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
   282
6719a2e727c0 7034139: G1: assert(Thread::current()->is_ConcurrentGC_thread()) failed: only a conc GC thread can call this.
tonyp
parents: 8930
diff changeset
   283
public:
6719a2e727c0 7034139: G1: assert(Thread::current()->is_ConcurrentGC_thread()) failed: only a conc GC thread can call this.
tonyp
parents: 8930
diff changeset
   284
  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
   285
  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
   286
  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
   287
};
6719a2e727c0 7034139: G1: assert(Thread::current()->is_ConcurrentGC_thread()) failed: only a conc GC thread can call this.
tonyp
parents: 8930
diff changeset
   288
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   289
// this will enable a variety of different statistics per GC task
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   290
#define _MARKING_STATS_       0
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   291
// this will enable the higher verbose levels
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   292
#define _MARKING_VERBOSE_     0
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   293
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   294
#if _MARKING_STATS_
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   295
#define statsOnly(statement)  \
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   296
do {                          \
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   297
  statement ;                 \
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   298
} while (0)
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   299
#else // _MARKING_STATS_
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   300
#define statsOnly(statement)  \
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   301
do {                          \
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   302
} while (0)
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   303
#endif // _MARKING_STATS_
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   304
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   305
typedef enum {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   306
  no_verbose  = 0,   // verbose turned off
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   307
  stats_verbose,     // only prints stats at the end of marking
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   308
  low_verbose,       // low verbose, mostly per region and per major event
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   309
  medium_verbose,    // a bit more detailed than low
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   310
  high_verbose       // per object verbose
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   311
} CMVerboseLevel;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   312
11584
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   313
class YoungList;
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   314
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   315
// Root Regions are regions that are not empty at the beginning of a
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   316
// marking cycle and which we might collect during an evacuation pause
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   317
// while the cycle is active. Given that, during evacuation pauses, we
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   318
// do not copy objects that are explicitly marked, what we have to do
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   319
// for the root regions is to scan them and mark all objects reachable
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   320
// from them. According to the SATB assumptions, we only need to visit
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   321
// each object once during marking. So, as long as we finish this scan
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   322
// before the next evacuation pause, we can copy the objects from the
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   323
// root regions without having to mark them or do anything else to them.
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   324
//
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   325
// Currently, we only support root region scanning once (at the start
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   326
// of the marking cycle) and the root regions are all the survivor
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   327
// regions populated during the initial-mark pause.
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   328
class CMRootRegions VALUE_OBJ_CLASS_SPEC {
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   329
private:
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   330
  YoungList*           _young_list;
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   331
  ConcurrentMark*      _cm;
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   332
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   333
  volatile bool        _scan_in_progress;
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   334
  volatile bool        _should_abort;
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   335
  HeapRegion* volatile _next_survivor;
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   336
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   337
public:
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   338
  CMRootRegions();
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   339
  // We actually do most of the initialization in this method.
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   340
  void init(G1CollectedHeap* g1h, ConcurrentMark* cm);
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   341
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   342
  // Reset the claiming / scanning of the root regions.
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   343
  void prepare_for_scan();
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   344
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   345
  // Forces get_next() to return NULL so that the iteration aborts early.
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   346
  void abort() { _should_abort = true; }
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   347
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   348
  // Return true if the CM thread are actively scanning root regions,
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   349
  // false otherwise.
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   350
  bool scan_in_progress() { return _scan_in_progress; }
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   351
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   352
  // Claim the next root region to scan atomically, or return NULL if
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   353
  // all have been claimed.
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   354
  HeapRegion* claim_next();
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   355
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   356
  // Flag that we're done with root region scanning and notify anyone
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   357
  // who's waiting on it. If aborted is false, assume that all regions
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   358
  // have been claimed.
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   359
  void scan_finished();
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   360
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   361
  // If CM threads are still scanning root regions, wait until they
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   362
  // are done. Return true if we had to wait, false otherwise.
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   363
  bool wait_until_scan_finished();
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   364
};
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   365
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   366
class ConcurrentMarkThread;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   367
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 12381
diff changeset
   368
class ConcurrentMark: public CHeapObj<mtGC> {
14740
1431ef92fed1 8000244: G1: Ergonomically set MarkStackSize and use virtual space for global marking stack
johnc
parents: 14073
diff changeset
   369
  friend class CMMarkStack;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   370
  friend class ConcurrentMarkThread;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   371
  friend class CMTask;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   372
  friend class CMBitMapClosure;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   373
  friend class CMGlobalObjectClosure;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   374
  friend class CMRemarkTask;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   375
  friend class CMConcurrentMarkingTask;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   376
  friend class G1ParNoteEndTask;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   377
  friend class CalcLiveObjectsClosure;
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10280
diff changeset
   378
  friend class G1CMRefProcTaskProxy;
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10280
diff changeset
   379
  friend class G1CMRefProcTaskExecutor;
15495
d791a8e8cf6b 8005032: G1: Cleanup serial reference processing closures in concurrent marking
johnc
parents: 15489
diff changeset
   380
  friend class G1CMKeepAliveAndDrainClosure;
d791a8e8cf6b 8005032: G1: Cleanup serial reference processing closures in concurrent marking
johnc
parents: 15489
diff changeset
   381
  friend class G1CMDrainMarkingStackClosure;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   382
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   383
protected:
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   384
  ConcurrentMarkThread* _cmThread;   // the thread doing the work
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   385
  G1CollectedHeap*      _g1h;        // the heap.
11396
917d8673b5ef 7121618: Change type of number of GC workers to unsigned int.
jmasa
parents: 11250
diff changeset
   386
  uint                  _parallel_marking_threads; // the number of marking
11174
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 10670
diff changeset
   387
                                                   // threads we're use
11396
917d8673b5ef 7121618: Change type of number of GC workers to unsigned int.
jmasa
parents: 11250
diff changeset
   388
  uint                  _max_parallel_marking_threads; // max number of marking
11174
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 10670
diff changeset
   389
                                                   // threads we'll ever use
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   390
  double                _sleep_factor; // how much we have to sleep, with
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   391
                                       // respect to the work we just did, to
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   392
                                       // meet the marking overhead goal
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   393
  double                _marking_task_overhead; // marking target overhead for
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   394
                                                // a single task
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   395
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   396
  // same as the two above, but for the cleanup task
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   397
  double                _cleanup_sleep_factor;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   398
  double                _cleanup_task_overhead;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   399
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7657
diff changeset
   400
  FreeRegionList        _cleanup_list;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   401
11575
d7a2e4295dc9 7130334: G1: Change comments and error messages that refer to CMS in g1/concurrentMark.cpp/hpp
brutisso
parents: 11574
diff changeset
   402
  // Concurrent marking support structures
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   403
  CMBitMap                _markBitMap1;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   404
  CMBitMap                _markBitMap2;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   405
  CMBitMapRO*             _prevMarkBitMap; // completed mark bitmap
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   406
  CMBitMap*               _nextMarkBitMap; // under-construction mark bitmap
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   407
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   408
  BitMap                  _region_bm;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   409
  BitMap                  _card_bm;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   410
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   411
  // Heap bounds
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   412
  HeapWord*               _heap_start;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   413
  HeapWord*               _heap_end;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   414
11584
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   415
  // Root region tracking and claiming.
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   416
  CMRootRegions           _root_regions;
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   417
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   418
  // For gray objects
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   419
  CMMarkStack             _markStack; // Grey objects behind global finger.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   420
  HeapWord* volatile      _finger;  // the global finger, region aligned,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   421
                                    // always points to the end of the
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   422
                                    // last claimed region
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   423
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   424
  // marking tasks
14073
6012178c0c19 7127708: G1: change task num types from int to uint in concurrent mark
johnc
parents: 13919
diff changeset
   425
  uint                    _max_worker_id;// maximum worker id
11396
917d8673b5ef 7121618: Change type of number of GC workers to unsigned int.
jmasa
parents: 11250
diff changeset
   426
  uint                    _active_tasks; // task num currently active
14073
6012178c0c19 7127708: G1: change task num types from int to uint in concurrent mark
johnc
parents: 13919
diff changeset
   427
  CMTask**                _tasks;        // task queue array (max_worker_id len)
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   428
  CMTaskQueueSet*         _task_queues;  // task queue set
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   429
  ParallelTaskTerminator  _terminator;   // for termination
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
  // Two sync barriers that are used to synchronise tasks when an
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   432
  // overflow occurs. The algorithm is the following. All tasks enter
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   433
  // the first one to ensure that they have all stopped manipulating
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   434
  // the global data structures. After they exit it, they re-initialise
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   435
  // their data structures and task 0 re-initialises the global data
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   436
  // structures. Then, they enter the second sync barrier. This
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   437
  // ensure, that no task starts doing work before all data
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   438
  // structures (local and global) have been re-initialised. When they
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   439
  // exit it, they are free to start working again.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   440
  WorkGangBarrierSync     _first_overflow_barrier_sync;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   441
  WorkGangBarrierSync     _second_overflow_barrier_sync;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   442
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   443
  // 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
   444
  // structures is detected.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   445
  volatile bool           _has_overflown;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   446
  // true: marking is concurrent, false: we're in remark
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   447
  volatile bool           _concurrent;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   448
  // 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
   449
  volatile bool           _has_aborted;
6761
f9191297ce83 6941395: G1: Use only lock-free versions of region stack push() and pop()
johnc
parents: 5547
diff changeset
   450
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   451
  // used when remark aborts due to an overflow to indicate that
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   452
  // another concurrent marking phase should start
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   453
  volatile bool           _restart_for_overflow;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   454
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   455
  // 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
   456
  // 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
   457
  // to determine the points between the end of concurrent marking and
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   458
  // time of remark.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   459
  volatile bool           _concurrent_marking_in_progress;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   460
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   461
  // verbose level
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   462
  CMVerboseLevel          _verbose_level;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   463
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   464
  // All of these times are in ms.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   465
  NumberSeq _init_times;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   466
  NumberSeq _remark_times;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   467
  NumberSeq   _remark_mark_times;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   468
  NumberSeq   _remark_weak_ref_times;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   469
  NumberSeq _cleanup_times;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   470
  double    _total_counting_time;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   471
  double    _total_rs_scrub_time;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   472
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   473
  double*   _accum_task_vtime;   // accumulated task vtime
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   474
11174
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 10670
diff changeset
   475
  FlexibleWorkGang* _parallel_workers;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   476
9417
6719a2e727c0 7034139: G1: assert(Thread::current()->is_ConcurrentGC_thread()) failed: only a conc GC thread can call this.
tonyp
parents: 8930
diff changeset
   477
  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
   478
  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
   479
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   480
  void weakRefsWork(bool clear_all_soft_refs);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   481
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   482
  void swapMarkBitMaps();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   483
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   484
  // It resets the global marking data structures, as well as the
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   485
  // task local ones; should be called during initial mark.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   486
  void reset();
15090
18bfcc1bbe39 8004816: G1: Kitchensink failures after marking stack changes
johnc
parents: 14740
diff changeset
   487
18bfcc1bbe39 8004816: G1: Kitchensink failures after marking stack changes
johnc
parents: 14740
diff changeset
   488
  // Resets all the marking data structures. Called when we have to restart
18bfcc1bbe39 8004816: G1: Kitchensink failures after marking stack changes
johnc
parents: 14740
diff changeset
   489
  // marking or when marking completes (via set_non_marking_state below).
18bfcc1bbe39 8004816: G1: Kitchensink failures after marking stack changes
johnc
parents: 14740
diff changeset
   490
  void reset_marking_state(bool clear_overflow = true);
18bfcc1bbe39 8004816: G1: Kitchensink failures after marking stack changes
johnc
parents: 14740
diff changeset
   491
18bfcc1bbe39 8004816: G1: Kitchensink failures after marking stack changes
johnc
parents: 14740
diff changeset
   492
  // We do this after we're done with marking so that the marking data
18bfcc1bbe39 8004816: G1: Kitchensink failures after marking stack changes
johnc
parents: 14740
diff changeset
   493
  // structures are initialised to a sensible and predictable state.
18bfcc1bbe39 8004816: G1: Kitchensink failures after marking stack changes
johnc
parents: 14740
diff changeset
   494
  void set_non_marking_state();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   495
16389
70f98431dd29 8009940: G1: assert(_finger == _heap_end) failed, concurrentMark.cpp:809
johnc
parents: 16388
diff changeset
   496
  // Called to indicate how many threads are currently active.
70f98431dd29 8009940: G1: assert(_finger == _heap_end) failed, concurrentMark.cpp:809
johnc
parents: 16388
diff changeset
   497
  void set_concurrency(uint active_tasks);
70f98431dd29 8009940: G1: assert(_finger == _heap_end) failed, concurrentMark.cpp:809
johnc
parents: 16388
diff changeset
   498
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   499
  // 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
   500
  // mark or remark) and how many threads are currently active.
16389
70f98431dd29 8009940: G1: assert(_finger == _heap_end) failed, concurrentMark.cpp:809
johnc
parents: 16388
diff changeset
   501
  void set_concurrency_and_phase(uint active_tasks, bool concurrent);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   502
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   503
  // prints all gathered CM-related statistics
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   504
  void print_stats();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   505
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7657
diff changeset
   506
  bool cleanup_list_is_empty() {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7657
diff changeset
   507
    return _cleanup_list.is_empty();
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7657
diff changeset
   508
  }
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7657
diff changeset
   509
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   510
  // accessor methods
15489
0f2bd608c4f2 8005875: G1: Kitchensink fails with ParallelGCThreads=0
johnc
parents: 15090
diff changeset
   511
  uint parallel_marking_threads() const     { return _parallel_marking_threads; }
0f2bd608c4f2 8005875: G1: Kitchensink fails with ParallelGCThreads=0
johnc
parents: 15090
diff changeset
   512
  uint max_parallel_marking_threads() const { return _max_parallel_marking_threads;}
0f2bd608c4f2 8005875: G1: Kitchensink fails with ParallelGCThreads=0
johnc
parents: 15090
diff changeset
   513
  double sleep_factor()                     { return _sleep_factor; }
0f2bd608c4f2 8005875: G1: Kitchensink fails with ParallelGCThreads=0
johnc
parents: 15090
diff changeset
   514
  double marking_task_overhead()            { return _marking_task_overhead;}
0f2bd608c4f2 8005875: G1: Kitchensink fails with ParallelGCThreads=0
johnc
parents: 15090
diff changeset
   515
  double cleanup_sleep_factor()             { return _cleanup_sleep_factor; }
0f2bd608c4f2 8005875: G1: Kitchensink fails with ParallelGCThreads=0
johnc
parents: 15090
diff changeset
   516
  double cleanup_task_overhead()            { return _cleanup_task_overhead;}
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   517
15489
0f2bd608c4f2 8005875: G1: Kitchensink fails with ParallelGCThreads=0
johnc
parents: 15090
diff changeset
   518
  bool use_parallel_marking_threads() const {
0f2bd608c4f2 8005875: G1: Kitchensink fails with ParallelGCThreads=0
johnc
parents: 15090
diff changeset
   519
    assert(parallel_marking_threads() <=
0f2bd608c4f2 8005875: G1: Kitchensink fails with ParallelGCThreads=0
johnc
parents: 15090
diff changeset
   520
           max_parallel_marking_threads(), "sanity");
0f2bd608c4f2 8005875: G1: Kitchensink fails with ParallelGCThreads=0
johnc
parents: 15090
diff changeset
   521
    assert((_parallel_workers == NULL && parallel_marking_threads() == 0) ||
0f2bd608c4f2 8005875: G1: Kitchensink fails with ParallelGCThreads=0
johnc
parents: 15090
diff changeset
   522
           parallel_marking_threads() > 0,
0f2bd608c4f2 8005875: G1: Kitchensink fails with ParallelGCThreads=0
johnc
parents: 15090
diff changeset
   523
           "parallel workers not set up correctly");
0f2bd608c4f2 8005875: G1: Kitchensink fails with ParallelGCThreads=0
johnc
parents: 15090
diff changeset
   524
    return _parallel_workers != NULL;
0f2bd608c4f2 8005875: G1: Kitchensink fails with ParallelGCThreads=0
johnc
parents: 15090
diff changeset
   525
  }
0f2bd608c4f2 8005875: G1: Kitchensink fails with ParallelGCThreads=0
johnc
parents: 15090
diff changeset
   526
0f2bd608c4f2 8005875: G1: Kitchensink fails with ParallelGCThreads=0
johnc
parents: 15090
diff changeset
   527
  HeapWord*               finger()          { return _finger;   }
0f2bd608c4f2 8005875: G1: Kitchensink fails with ParallelGCThreads=0
johnc
parents: 15090
diff changeset
   528
  bool                    concurrent()      { return _concurrent; }
0f2bd608c4f2 8005875: G1: Kitchensink fails with ParallelGCThreads=0
johnc
parents: 15090
diff changeset
   529
  uint                    active_tasks()    { return _active_tasks; }
0f2bd608c4f2 8005875: G1: Kitchensink fails with ParallelGCThreads=0
johnc
parents: 15090
diff changeset
   530
  ParallelTaskTerminator* terminator()      { return &_terminator; }
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   531
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   532
  // It claims the next available region to be scanned by a marking
14073
6012178c0c19 7127708: G1: change task num types from int to uint in concurrent mark
johnc
parents: 13919
diff changeset
   533
  // task/thread. It might return NULL if the next region is empty or
6012178c0c19 7127708: G1: change task num types from int to uint in concurrent mark
johnc
parents: 13919
diff changeset
   534
  // we have run out of regions. In the latter case, out_of_regions()
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   535
  // determines whether we've really run out of regions or the task
14073
6012178c0c19 7127708: G1: change task num types from int to uint in concurrent mark
johnc
parents: 13919
diff changeset
   536
  // should call claim_region() again. This might seem a bit
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   537
  // awkward. Originally, the code was written so that claim_region()
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   538
  // either successfully returned with a non-empty region or there
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   539
  // 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
   540
  // that, in certain circumstances, it iterated over large chunks of
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   541
  // 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
   542
  // was preventing the calling task to call its regular clock
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   543
  // 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
   544
  // claim_region() and is allowed to call the regular clock method
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   545
  // frequently.
14073
6012178c0c19 7127708: G1: change task num types from int to uint in concurrent mark
johnc
parents: 13919
diff changeset
   546
  HeapRegion* claim_region(uint worker_id);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   547
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   548
  // It determines whether we've run out of regions to scan.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   549
  bool        out_of_regions() { return _finger == _heap_end; }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   550
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   551
  // Returns the task with the given id
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   552
  CMTask* task(int id) {
4026
10386ea70fe5 6888619: G1: too many guarantees in concurrent marking
tonyp
parents: 4022
diff changeset
   553
    assert(0 <= id && id < (int) _active_tasks,
10386ea70fe5 6888619: G1: too many guarantees in concurrent marking
tonyp
parents: 4022
diff changeset
   554
           "task id not within active bounds");
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   555
    return _tasks[id];
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   556
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   557
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   558
  // Returns the task queue with the given id
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   559
  CMTaskQueue* task_queue(int id) {
4026
10386ea70fe5 6888619: G1: too many guarantees in concurrent marking
tonyp
parents: 4022
diff changeset
   560
    assert(0 <= id && id < (int) _active_tasks,
10386ea70fe5 6888619: G1: too many guarantees in concurrent marking
tonyp
parents: 4022
diff changeset
   561
           "task queue id not within active bounds");
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   562
    return (CMTaskQueue*) _task_queues->queue(id);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   563
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   564
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   565
  // Returns the task queue set
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   566
  CMTaskQueueSet* task_queues()  { return _task_queues; }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   567
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   568
  // Access / manipulation of the overflow flag which is set to
12272
f87fd1292095 7127697: G1: remove dead code after recent concurrent mark changes
tonyp
parents: 11584
diff changeset
   569
  // indicate that the global stack has overflown
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   570
  bool has_overflown()           { return _has_overflown; }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   571
  void set_has_overflown()       { _has_overflown = true; }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   572
  void clear_has_overflown()     { _has_overflown = false; }
11584
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   573
  bool restart_for_overflow()    { return _restart_for_overflow; }
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   574
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   575
  bool has_aborted()             { return _has_aborted; }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   576
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   577
  // Methods to enter the two overflow sync barriers
14073
6012178c0c19 7127708: G1: change task num types from int to uint in concurrent mark
johnc
parents: 13919
diff changeset
   578
  void enter_first_sync_barrier(uint worker_id);
6012178c0c19 7127708: G1: change task num types from int to uint in concurrent mark
johnc
parents: 13919
diff changeset
   579
  void enter_second_sync_barrier(uint worker_id);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   580
9417
6719a2e727c0 7034139: G1: assert(Thread::current()->is_ConcurrentGC_thread()) failed: only a conc GC thread can call this.
tonyp
parents: 8930
diff changeset
   581
  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
   582
    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
   583
  }
6719a2e727c0 7034139: G1: assert(Thread::current()->is_ConcurrentGC_thread()) failed: only a conc GC thread can call this.
tonyp
parents: 8930
diff changeset
   584
6719a2e727c0 7034139: G1: assert(Thread::current()->is_ConcurrentGC_thread()) failed: only a conc GC thread can call this.
tonyp
parents: 8930
diff changeset
   585
  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
   586
    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
   587
  }
6719a2e727c0 7034139: G1: assert(Thread::current()->is_ConcurrentGC_thread()) failed: only a conc GC thread can call this.
tonyp
parents: 8930
diff changeset
   588
6719a2e727c0 7034139: G1: assert(Thread::current()->is_ConcurrentGC_thread()) failed: only a conc GC thread can call this.
tonyp
parents: 8930
diff changeset
   589
  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
   590
    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
   591
      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
   592
    } else {
6719a2e727c0 7034139: G1: assert(Thread::current()->is_ConcurrentGC_thread()) failed: only a conc GC thread can call this.
tonyp
parents: 8930
diff changeset
   593
      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
   594
    }
6719a2e727c0 7034139: G1: assert(Thread::current()->is_ConcurrentGC_thread()) failed: only a conc GC thread can call this.
tonyp
parents: 8930
diff changeset
   595
  }
6719a2e727c0 7034139: G1: assert(Thread::current()->is_ConcurrentGC_thread()) failed: only a conc GC thread can call this.
tonyp
parents: 8930
diff changeset
   596
11583
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11575
diff changeset
   597
  // Live Data Counting data structures...
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11575
diff changeset
   598
  // These data structures are initialized at the start of
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11575
diff changeset
   599
  // marking. They are written to while marking is active.
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11575
diff changeset
   600
  // They are aggregated during remark; the aggregated values
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11575
diff changeset
   601
  // are then used to populate the _region_bm, _card_bm, and
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11575
diff changeset
   602
  // the total live bytes, which are then subsequently updated
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11575
diff changeset
   603
  // during cleanup.
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11575
diff changeset
   604
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11575
diff changeset
   605
  // An array of bitmaps (one bit map per task). Each bitmap
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11575
diff changeset
   606
  // is used to record the cards spanned by the live objects
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11575
diff changeset
   607
  // marked by that task/worker.
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11575
diff changeset
   608
  BitMap*  _count_card_bitmaps;
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11575
diff changeset
   609
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11575
diff changeset
   610
  // Used to record the number of marked live bytes
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11575
diff changeset
   611
  // (for each region, by worker thread).
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11575
diff changeset
   612
  size_t** _count_marked_bytes;
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11575
diff changeset
   613
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11575
diff changeset
   614
  // Card index of the bottom of the G1 heap. Used for biasing indices into
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11575
diff changeset
   615
  // the card bitmaps.
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11575
diff changeset
   616
  intptr_t _heap_bottom_card_num;
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11575
diff changeset
   617
14740
1431ef92fed1 8000244: G1: Ergonomically set MarkStackSize and use virtual space for global marking stack
johnc
parents: 14073
diff changeset
   618
  // Set to true when initialization is complete
1431ef92fed1 8000244: G1: Ergonomically set MarkStackSize and use virtual space for global marking stack
johnc
parents: 14073
diff changeset
   619
  bool _completed_initialization;
1431ef92fed1 8000244: G1: Ergonomically set MarkStackSize and use virtual space for global marking stack
johnc
parents: 14073
diff changeset
   620
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   621
public:
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   622
  // Manipulation of the global mark stack.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   623
  // 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
   624
  // 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
   625
  // called during evacuation pauses and doesn't compete with the
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   626
  // other two (which are called by the marking tasks during
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   627
  // concurrent marking or remark).
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   628
  bool mark_stack_push(oop p) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   629
    _markStack.par_push(p);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   630
    if (_markStack.overflow()) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   631
      set_has_overflown();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   632
      return false;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   633
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   634
    return true;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   635
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   636
  bool mark_stack_push(oop* arr, int n) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   637
    _markStack.par_push_arr(arr, n);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   638
    if (_markStack.overflow()) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   639
      set_has_overflown();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   640
      return false;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   641
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   642
    return true;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   643
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   644
  void mark_stack_pop(oop* arr, int max, int* n) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   645
    _markStack.par_pop_arr(arr, max, n);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   646
  }
9999
5f0b78217054 7055073: G1: code cleanup in the concurrentMark.* files
tonyp
parents: 9995
diff changeset
   647
  size_t mark_stack_size()                { return _markStack.size(); }
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   648
  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
   649
  bool mark_stack_overflow()              { return _markStack.overflow(); }
5f0b78217054 7055073: G1: code cleanup in the concurrentMark.* files
tonyp
parents: 9995
diff changeset
   650
  bool mark_stack_empty()                 { return _markStack.isEmpty(); }
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   651
11584
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   652
  CMRootRegions* root_regions() { return &_root_regions; }
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   653
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   654
  bool concurrent_marking_in_progress() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   655
    return _concurrent_marking_in_progress;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   656
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   657
  void set_concurrent_marking_in_progress() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   658
    _concurrent_marking_in_progress = true;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   659
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   660
  void clear_concurrent_marking_in_progress() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   661
    _concurrent_marking_in_progress = false;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   662
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   663
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   664
  void update_accum_task_vtime(int i, double vtime) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   665
    _accum_task_vtime[i] += vtime;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   666
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   667
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   668
  double all_task_accum_vtime() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   669
    double ret = 0.0;
14073
6012178c0c19 7127708: G1: change task num types from int to uint in concurrent mark
johnc
parents: 13919
diff changeset
   670
    for (uint i = 0; i < _max_worker_id; ++i)
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   671
      ret += _accum_task_vtime[i];
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   672
    return ret;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   673
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   674
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   675
  // Attempts to steal an object from the task queues of other tasks
14073
6012178c0c19 7127708: G1: change task num types from int to uint in concurrent mark
johnc
parents: 13919
diff changeset
   676
  bool try_stealing(uint worker_id, int* hash_seed, oop& obj) {
6012178c0c19 7127708: G1: change task num types from int to uint in concurrent mark
johnc
parents: 13919
diff changeset
   677
    return _task_queues->steal(worker_id, hash_seed, obj);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   678
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   679
14740
1431ef92fed1 8000244: G1: Ergonomically set MarkStackSize and use virtual space for global marking stack
johnc
parents: 14073
diff changeset
   680
  ConcurrentMark(G1CollectedHeap* g1h, ReservedSpace heap_rs);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   681
  ~ConcurrentMark();
11583
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11575
diff changeset
   682
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   683
  ConcurrentMarkThread* cmThread() { return _cmThread; }
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
  CMBitMapRO* prevMarkBitMap() const { return _prevMarkBitMap; }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   686
  CMBitMap*   nextMarkBitMap() const { return _nextMarkBitMap; }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   687
11174
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 10670
diff changeset
   688
  // Returns the number of GC threads to be used in a concurrent
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 10670
diff changeset
   689
  // phase based on the number of GC threads being used in a STW
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 10670
diff changeset
   690
  // phase.
11396
917d8673b5ef 7121618: Change type of number of GC workers to unsigned int.
jmasa
parents: 11250
diff changeset
   691
  uint scale_parallel_threads(uint n_par_threads);
11174
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 10670
diff changeset
   692
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 10670
diff changeset
   693
  // Calculates the number of GC threads to be used in a concurrent phase.
11396
917d8673b5ef 7121618: Change type of number of GC workers to unsigned int.
jmasa
parents: 11250
diff changeset
   694
  uint calc_parallel_marking_threads();
11174
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 10670
diff changeset
   695
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   696
  // The following three are interaction between CM and
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   697
  // G1CollectedHeap
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   698
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   699
  // This notifies CM that a root during initial-mark needs to be
11584
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   700
  // grayed. It is MT-safe. word_size is the size of the object in
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   701
  // words. It is passed explicitly as sometimes we cannot calculate
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   702
  // it from the given object because it might be in an inconsistent
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   703
  // state (e.g., in to-space and being copied). So the caller is
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   704
  // responsible for dealing with this issue (e.g., get the size from
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   705
  // the from-space image when the to-space image might be
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   706
  // inconsistent) and always passing the size. hr is the region that
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   707
  // contains the object and it's passed optionally from callers who
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   708
  // might already have it (no point in recalculating it).
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   709
  inline void grayRoot(oop obj, size_t word_size,
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   710
                       uint worker_id, HeapRegion* hr = NULL);
11455
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11396
diff changeset
   711
5344
f78ef2531f44 6937142: G1: improvements to debugging output (S-M)
tonyp
parents: 5242
diff changeset
   712
  // 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
   713
  // 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
   714
  // liveness information for the object and its referents. The dump
f78ef2531f44 6937142: G1: improvements to debugging output (S-M)
tonyp
parents: 5242
diff changeset
   715
  // 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
   716
  // G1PrintReachableBaseFile + "." + str.
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9994
diff changeset
   717
  // vo decides whether the prev (vo == UsePrevMarking), the next
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9994
diff changeset
   718
  // (vo == UseNextMarking) marking information, or the mark word
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9994
diff changeset
   719
  // (vo == UseMarkWord) will be used to determine the liveness of
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9994
diff changeset
   720
  // each object / referent.
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9994
diff changeset
   721
  // 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
   722
  // 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
   723
  // are used:
5344
f78ef2531f44 6937142: G1: improvements to debugging output (S-M)
tonyp
parents: 5242
diff changeset
   724
  //   M : an explicitly live object (its bitmap bit is set)
f78ef2531f44 6937142: G1: improvements to debugging output (S-M)
tonyp
parents: 5242
diff changeset
   725
  //   > : an implicitly live object (over tams)
f78ef2531f44 6937142: G1: improvements to debugging output (S-M)
tonyp
parents: 5242
diff changeset
   726
  //   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
   727
  //   NOT : a reference field whose referent is not live
f78ef2531f44 6937142: G1: improvements to debugging output (S-M)
tonyp
parents: 5242
diff changeset
   728
  //   AND MARKED : indicates that an object is both explicitly and
f78ef2531f44 6937142: G1: improvements to debugging output (S-M)
tonyp
parents: 5242
diff changeset
   729
  //   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
   730
  void print_reachable(const char* str,
9995
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9994
diff changeset
   731
                       VerifyOption vo, bool all) PRODUCT_RETURN;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   732
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   733
  // Clear the next marking bitmap (will be called concurrently).
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   734
  void clearNextBitmap();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   735
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   736
  // 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
   737
  // initial root checkpoint. Since this checkpoint can be done at two
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   738
  // 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
   739
  // 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
   740
  // 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
   741
  // the post method. TP
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   742
  void checkpointRootsInitialPre();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   743
  void checkpointRootsInitialPost();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   744
11584
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   745
  // Scan all the root regions and mark everything reachable from
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   746
  // them.
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   747
  void scanRootRegions();
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   748
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   749
  // Scan a single root region and mark everything reachable from it.
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   750
  void scanRootRegion(HeapRegion* hr, uint worker_id);
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   751
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   752
  // Do concurrent phase of marking, to a tentative transitive closure.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   753
  void markFromRoots();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   754
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   755
  void checkpointRootsFinal(bool clear_all_soft_refs);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   756
  void checkpointRootsFinalWork();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   757
  void cleanup();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   758
  void completeCleanup();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   759
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   760
  // 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
   761
  // this carefully!
11455
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11396
diff changeset
   762
  inline void markPrev(oop p);
11583
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11575
diff changeset
   763
11455
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11396
diff changeset
   764
  // Clears marks for all objects in the given range, for the prev,
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11396
diff changeset
   765
  // next, or both bitmaps.  NB: the previous bitmap is usually
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11396
diff changeset
   766
  // read-only, so use this carefully!
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11396
diff changeset
   767
  void clearRangePrevBitmap(MemRegion mr);
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11396
diff changeset
   768
  void clearRangeNextBitmap(MemRegion mr);
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11396
diff changeset
   769
  void clearRangeBothBitmaps(MemRegion mr);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   770
11455
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11396
diff changeset
   771
  // Notify data structures that a GC has started.
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11396
diff changeset
   772
  void note_start_of_gc() {
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11396
diff changeset
   773
    _markStack.note_start_of_gc();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   774
  }
11455
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11396
diff changeset
   775
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11396
diff changeset
   776
  // Notify data structures that a GC is finished.
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11396
diff changeset
   777
  void note_end_of_gc() {
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11396
diff changeset
   778
    _markStack.note_end_of_gc();
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11396
diff changeset
   779
  }
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11396
diff changeset
   780
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11396
diff changeset
   781
  // Verify that there are no CSet oops on the stacks (taskqueues /
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11396
diff changeset
   782
  // global mark stack), enqueued SATB buffers, per-thread SATB
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11396
diff changeset
   783
  // buffers, and fingers (global / per-task). The boolean parameters
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11396
diff changeset
   784
  // decide which of the above data structures to verify. If marking
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11396
diff changeset
   785
  // is not in progress, it's a no-op.
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11396
diff changeset
   786
  void verify_no_cset_oops(bool verify_stacks,
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11396
diff changeset
   787
                           bool verify_enqueued_buffers,
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11396
diff changeset
   788
                           bool verify_thread_buffers,
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11396
diff changeset
   789
                           bool verify_fingers) PRODUCT_RETURN;
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11396
diff changeset
   790
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   791
  // 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
   792
  // 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
   793
  // doesn't do anything if concurrent_marking_in_progress() is false,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   794
  // unless the force parameter is true.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   795
  void update_g1_committed(bool force = false);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   796
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   797
  bool isMarked(oop p) const {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   798
    assert(p != NULL && p->is_oop(), "expected an oop");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   799
    HeapWord* addr = (HeapWord*)p;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   800
    assert(addr >= _nextMarkBitMap->startWord() ||
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   801
           addr < _nextMarkBitMap->endWord(), "in a region");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   802
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   803
    return _nextMarkBitMap->isMarked(addr);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   804
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   805
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   806
  inline bool not_yet_marked(oop p) const;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   807
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   808
  // XXX Debug code
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   809
  bool containing_card_is_marked(void* p);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   810
  bool containing_cards_are_marked(void* start, void* last);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   811
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   812
  bool isPrevMarked(oop p) const {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   813
    assert(p != NULL && p->is_oop(), "expected an oop");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   814
    HeapWord* addr = (HeapWord*)p;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   815
    assert(addr >= _prevMarkBitMap->startWord() ||
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   816
           addr < _prevMarkBitMap->endWord(), "in a region");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   817
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   818
    return _prevMarkBitMap->isMarked(addr);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   819
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   820
11396
917d8673b5ef 7121618: Change type of number of GC workers to unsigned int.
jmasa
parents: 11250
diff changeset
   821
  inline bool do_yield_check(uint worker_i = 0);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   822
  inline bool should_yield();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   823
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   824
  // 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
   825
  void abort();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   826
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   827
  // This prints the global/local fingers. It is used for debugging.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   828
  NOT_PRODUCT(void print_finger();)
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   829
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   830
  void print_summary_info();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   831
4022
2ec87d5043f7 6885041: G1: inconsistent thread dump
tonyp
parents: 3691
diff changeset
   832
  void print_worker_threads_on(outputStream* st) const;
2ec87d5043f7 6885041: G1: inconsistent thread dump
tonyp
parents: 3691
diff changeset
   833
16685
41c34debcde0 8011872: Include Bit Map addresses in the hs_err files
stefank
parents: 16389
diff changeset
   834
  void print_on_error(outputStream* st) const;
41c34debcde0 8011872: Include Bit Map addresses in the hs_err files
stefank
parents: 16389
diff changeset
   835
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   836
  // The following indicate whether a given verbose level has been
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   837
  // set. Notice that anything above stats is conditional to
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   838
  // _MARKING_VERBOSE_ having been set to 1
9999
5f0b78217054 7055073: G1: code cleanup in the concurrentMark.* files
tonyp
parents: 9995
diff changeset
   839
  bool verbose_stats() {
5f0b78217054 7055073: G1: code cleanup in the concurrentMark.* files
tonyp
parents: 9995
diff changeset
   840
    return _verbose_level >= stats_verbose;
5f0b78217054 7055073: G1: code cleanup in the concurrentMark.* files
tonyp
parents: 9995
diff changeset
   841
  }
5f0b78217054 7055073: G1: code cleanup in the concurrentMark.* files
tonyp
parents: 9995
diff changeset
   842
  bool verbose_low() {
5f0b78217054 7055073: G1: code cleanup in the concurrentMark.* files
tonyp
parents: 9995
diff changeset
   843
    return _MARKING_VERBOSE_ && _verbose_level >= low_verbose;
5f0b78217054 7055073: G1: code cleanup in the concurrentMark.* files
tonyp
parents: 9995
diff changeset
   844
  }
5f0b78217054 7055073: G1: code cleanup in the concurrentMark.* files
tonyp
parents: 9995
diff changeset
   845
  bool verbose_medium() {
5f0b78217054 7055073: G1: code cleanup in the concurrentMark.* files
tonyp
parents: 9995
diff changeset
   846
    return _MARKING_VERBOSE_ && _verbose_level >= medium_verbose;
5f0b78217054 7055073: G1: code cleanup in the concurrentMark.* files
tonyp
parents: 9995
diff changeset
   847
  }
5f0b78217054 7055073: G1: code cleanup in the concurrentMark.* files
tonyp
parents: 9995
diff changeset
   848
  bool verbose_high() {
5f0b78217054 7055073: G1: code cleanup in the concurrentMark.* files
tonyp
parents: 9995
diff changeset
   849
    return _MARKING_VERBOSE_ && _verbose_level >= high_verbose;
5f0b78217054 7055073: G1: code cleanup in the concurrentMark.* files
tonyp
parents: 9995
diff changeset
   850
  }
11583
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11575
diff changeset
   851
13919
01f6d01a9004 7200261: G1: Liveness counting inconsistencies during marking verification
johnc
parents: 13195
diff changeset
   852
  // Liveness counting
01f6d01a9004 7200261: G1: Liveness counting inconsistencies during marking verification
johnc
parents: 13195
diff changeset
   853
01f6d01a9004 7200261: G1: Liveness counting inconsistencies during marking verification
johnc
parents: 13195
diff changeset
   854
  // Utility routine to set an exclusive range of cards on the given
01f6d01a9004 7200261: G1: Liveness counting inconsistencies during marking verification
johnc
parents: 13195
diff changeset
   855
  // card liveness bitmap
01f6d01a9004 7200261: G1: Liveness counting inconsistencies during marking verification
johnc
parents: 13195
diff changeset
   856
  inline void set_card_bitmap_range(BitMap* card_bm,
01f6d01a9004 7200261: G1: Liveness counting inconsistencies during marking verification
johnc
parents: 13195
diff changeset
   857
                                    BitMap::idx_t start_idx,
01f6d01a9004 7200261: G1: Liveness counting inconsistencies during marking verification
johnc
parents: 13195
diff changeset
   858
                                    BitMap::idx_t end_idx,
01f6d01a9004 7200261: G1: Liveness counting inconsistencies during marking verification
johnc
parents: 13195
diff changeset
   859
                                    bool is_par);
11583
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11575
diff changeset
   860
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11575
diff changeset
   861
  // Returns the card number of the bottom of the G1 heap.
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11575
diff changeset
   862
  // Used in biasing indices into accounting card bitmaps.
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11575
diff changeset
   863
  intptr_t heap_bottom_card_num() const {
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11575
diff changeset
   864
    return _heap_bottom_card_num;
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11575
diff changeset
   865
  }
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11575
diff changeset
   866
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11575
diff changeset
   867
  // Returns the card bitmap for a given task or worker id.
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11575
diff changeset
   868
  BitMap* count_card_bitmap_for(uint worker_id) {
14073
6012178c0c19 7127708: G1: change task num types from int to uint in concurrent mark
johnc
parents: 13919
diff changeset
   869
    assert(0 <= worker_id && worker_id < _max_worker_id, "oob");
11583
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11575
diff changeset
   870
    assert(_count_card_bitmaps != NULL, "uninitialized");
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11575
diff changeset
   871
    BitMap* task_card_bm = &_count_card_bitmaps[worker_id];
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11575
diff changeset
   872
    assert(task_card_bm->size() == _card_bm.size(), "size mismatch");
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11575
diff changeset
   873
    return task_card_bm;
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11575
diff changeset
   874
  }
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11575
diff changeset
   875
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11575
diff changeset
   876
  // Returns the array containing the marked bytes for each region,
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11575
diff changeset
   877
  // for the given worker or task id.
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11575
diff changeset
   878
  size_t* count_marked_bytes_array_for(uint worker_id) {
14073
6012178c0c19 7127708: G1: change task num types from int to uint in concurrent mark
johnc
parents: 13919
diff changeset
   879
    assert(0 <= worker_id && worker_id < _max_worker_id, "oob");
11583
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11575
diff changeset
   880
    assert(_count_marked_bytes != NULL, "uninitialized");
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11575
diff changeset
   881
    size_t* marked_bytes_array = _count_marked_bytes[worker_id];
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11575
diff changeset
   882
    assert(marked_bytes_array != NULL, "uninitialized");
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11575
diff changeset
   883
    return marked_bytes_array;
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11575
diff changeset
   884
  }
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11575
diff changeset
   885
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11575
diff changeset
   886
  // Returns the index in the liveness accounting card table bitmap
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11575
diff changeset
   887
  // for the given address
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11575
diff changeset
   888
  inline BitMap::idx_t card_bitmap_index_for(HeapWord* addr);
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11575
diff changeset
   889
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11575
diff changeset
   890
  // Counts the size of the given memory region in the the given
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11575
diff changeset
   891
  // marked_bytes array slot for the given HeapRegion.
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11575
diff changeset
   892
  // Sets the bits in the given card bitmap that are associated with the
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11575
diff changeset
   893
  // cards that are spanned by the memory region.
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11575
diff changeset
   894
  inline void count_region(MemRegion mr, HeapRegion* hr,
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11575
diff changeset
   895
                           size_t* marked_bytes_array,
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11575
diff changeset
   896
                           BitMap* task_card_bm);
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11575
diff changeset
   897
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11575
diff changeset
   898
  // Counts the given memory region in the task/worker counting
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11575
diff changeset
   899
  // data structures for the given worker id.
11584
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   900
  inline void count_region(MemRegion mr, HeapRegion* hr, uint worker_id);
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   901
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   902
  // Counts the given memory region in the task/worker counting
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   903
  // data structures for the given worker id.
11583
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11575
diff changeset
   904
  inline void count_region(MemRegion mr, uint worker_id);
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11575
diff changeset
   905
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11575
diff changeset
   906
  // Counts the given object in the given task/worker counting
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11575
diff changeset
   907
  // data structures.
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11575
diff changeset
   908
  inline void count_object(oop obj, HeapRegion* hr,
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11575
diff changeset
   909
                           size_t* marked_bytes_array,
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11575
diff changeset
   910
                           BitMap* task_card_bm);
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11575
diff changeset
   911
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11575
diff changeset
   912
  // Counts the given object in the task/worker counting data
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11575
diff changeset
   913
  // structures for the given worker id.
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11575
diff changeset
   914
  inline void count_object(oop obj, HeapRegion* hr, uint worker_id);
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11575
diff changeset
   915
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11575
diff changeset
   916
  // Attempts to mark the given object and, if successful, counts
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11575
diff changeset
   917
  // the object in the given task/worker counting structures.
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11575
diff changeset
   918
  inline bool par_mark_and_count(oop obj, HeapRegion* hr,
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11575
diff changeset
   919
                                 size_t* marked_bytes_array,
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11575
diff changeset
   920
                                 BitMap* task_card_bm);
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11575
diff changeset
   921
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11575
diff changeset
   922
  // Attempts to mark the given object and, if successful, counts
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11575
diff changeset
   923
  // the object in the task/worker counting structures for the
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11575
diff changeset
   924
  // given worker id.
11584
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   925
  inline bool par_mark_and_count(oop obj, size_t word_size,
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   926
                                 HeapRegion* hr, uint worker_id);
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   927
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   928
  // Attempts to mark the given object and, if successful, counts
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   929
  // the object in the task/worker counting structures for the
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   930
  // given worker id.
11583
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11575
diff changeset
   931
  inline bool par_mark_and_count(oop obj, HeapRegion* hr, uint worker_id);
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11575
diff changeset
   932
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11575
diff changeset
   933
  // Similar to the above routine but we don't know the heap region that
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11575
diff changeset
   934
  // contains the object to be marked/counted, which this routine looks up.
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11575
diff changeset
   935
  inline bool par_mark_and_count(oop obj, uint worker_id);
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11575
diff changeset
   936
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11575
diff changeset
   937
  // Similar to the above routine but there are times when we cannot
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11575
diff changeset
   938
  // safely calculate the size of obj due to races and we, therefore,
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11575
diff changeset
   939
  // pass the size in as a parameter. It is the caller's reponsibility
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11575
diff changeset
   940
  // to ensure that the size passed in for obj is valid.
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11575
diff changeset
   941
  inline bool par_mark_and_count(oop obj, size_t word_size, uint worker_id);
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11575
diff changeset
   942
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11575
diff changeset
   943
  // Unconditionally mark the given object, and unconditinally count
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11575
diff changeset
   944
  // the object in the counting structures for worker id 0.
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11575
diff changeset
   945
  // Should *not* be called from parallel code.
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11575
diff changeset
   946
  inline bool mark_and_count(oop obj, HeapRegion* hr);
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11575
diff changeset
   947
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11575
diff changeset
   948
  // Similar to the above routine but we don't know the heap region that
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11575
diff changeset
   949
  // contains the object to be marked/counted, which this routine looks up.
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11575
diff changeset
   950
  // Should *not* be called from parallel code.
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11575
diff changeset
   951
  inline bool mark_and_count(oop obj);
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11575
diff changeset
   952
14740
1431ef92fed1 8000244: G1: Ergonomically set MarkStackSize and use virtual space for global marking stack
johnc
parents: 14073
diff changeset
   953
  // Returns true if initialization was successfully completed.
1431ef92fed1 8000244: G1: Ergonomically set MarkStackSize and use virtual space for global marking stack
johnc
parents: 14073
diff changeset
   954
  bool completed_initialization() const {
1431ef92fed1 8000244: G1: Ergonomically set MarkStackSize and use virtual space for global marking stack
johnc
parents: 14073
diff changeset
   955
    return _completed_initialization;
1431ef92fed1 8000244: G1: Ergonomically set MarkStackSize and use virtual space for global marking stack
johnc
parents: 14073
diff changeset
   956
  }
1431ef92fed1 8000244: G1: Ergonomically set MarkStackSize and use virtual space for global marking stack
johnc
parents: 14073
diff changeset
   957
11583
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11575
diff changeset
   958
protected:
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11575
diff changeset
   959
  // Clear all the per-task bitmaps and arrays used to store the
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11575
diff changeset
   960
  // counting data.
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11575
diff changeset
   961
  void clear_all_count_data();
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11575
diff changeset
   962
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11575
diff changeset
   963
  // Aggregates the counting data for each worker/task
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11575
diff changeset
   964
  // that was constructed while marking. Also sets
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11575
diff changeset
   965
  // the amount of marked bytes for each region and
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11575
diff changeset
   966
  // the top at concurrent mark count.
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11575
diff changeset
   967
  void aggregate_count_data();
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11575
diff changeset
   968
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11575
diff changeset
   969
  // Verification routine
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11575
diff changeset
   970
  void verify_count_data();
1374
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
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   973
// A class representing a marking task.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   974
class CMTask : public TerminatorTerminator {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   975
private:
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   976
  enum PrivateConstants {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   977
    // the regular clock call is called once the scanned words reaches
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   978
    // this limit
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   979
    words_scanned_period          = 12*1024,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   980
    // the regular clock call is called once the number of visited
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   981
    // references reaches this limit
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   982
    refs_reached_period           = 384,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   983
    // 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
   984
    init_hash_seed                = 17,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   985
    // how many entries will be transferred between global stack and
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   986
    // local queues
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   987
    global_stack_transfer_size    = 16
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   988
  };
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   989
14073
6012178c0c19 7127708: G1: change task num types from int to uint in concurrent mark
johnc
parents: 13919
diff changeset
   990
  uint                        _worker_id;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   991
  G1CollectedHeap*            _g1h;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   992
  ConcurrentMark*             _cm;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   993
  CMBitMap*                   _nextMarkBitMap;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   994
  // the task queue of this task
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   995
  CMTaskQueue*                _task_queue;
3262
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 2105
diff changeset
   996
private:
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   997
  // the task queue set---needed for stealing
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   998
  CMTaskQueueSet*             _task_queues;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   999
  // indicates whether the task has been claimed---this is only  for
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1000
  // debugging purposes
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1001
  bool                        _claimed;
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
  // number of calls to this task
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1004
  int                         _calls;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1005
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1006
  // when the virtual timer reaches this time, the marking step should
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1007
  // exit
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1008
  double                      _time_target_ms;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1009
  // the start time of the current marking step
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1010
  double                      _start_time_ms;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1011
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1012
  // the oop closure used for iterations over oops
9994
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents: 9936
diff changeset
  1013
  G1CMOopClosure*             _cm_oop_closure;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1014
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1015
  // 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
  1016
  HeapRegion*                 _curr_region;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1017
  // 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
  1018
  HeapWord*                   _finger;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1019
  // 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
  1020
  HeapWord*                   _region_limit;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1021
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1022
  // the number of words this task has scanned
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1023
  size_t                      _words_scanned;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1024
  // When _words_scanned reaches this limit, the regular clock is
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1025
  // called. Notice that this might be decreased under certain
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1026
  // circumstances (i.e. when we believe that we did an expensive
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1027
  // operation).
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1028
  size_t                      _words_scanned_limit;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1029
  // 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
  1030
  // before it was decreased).
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1031
  size_t                      _real_words_scanned_limit;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1032
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1033
  // the number of references this task has visited
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1034
  size_t                      _refs_reached;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1035
  // When _refs_reached reaches this limit, the regular clock is
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1036
  // called. Notice this this might be decreased under certain
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1037
  // circumstances (i.e. when we believe that we did an expensive
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1038
  // operation).
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1039
  size_t                      _refs_reached_limit;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1040
  // 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
  1041
  // it was decreased).
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1042
  size_t                      _real_refs_reached_limit;
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
  // used by the work stealing stuff
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1045
  int                         _hash_seed;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1046
  // 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
  1047
  bool                        _has_aborted;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1048
  // 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
  1049
  bool                        _has_timed_out;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1050
  // true when we're draining SATB buffers; this avoids the task
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1051
  // aborting due to SATB buffers being available (as we're already
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1052
  // dealing with them)
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1053
  bool                        _draining_satb_buffers;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1054
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1055
  // number sequence of past step times
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1056
  NumberSeq                   _step_times_ms;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1057
  // elapsed time of this task
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1058
  double                      _elapsed_time_ms;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1059
  // termination time of this task
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1060
  double                      _termination_time_ms;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1061
  // when this task got into the termination protocol
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1062
  double                      _termination_start_time_ms;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1063
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1064
  // 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
  1065
  // 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
  1066
  // 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
  1067
  // phase, i.e. SATB buffer availability...)
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1068
  bool                        _concurrent;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1069
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1070
  TruncatedSeq                _marking_step_diffs_ms;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1071
11583
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11575
diff changeset
  1072
  // Counting data structures. Embedding the task's marked_bytes_array
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11575
diff changeset
  1073
  // and card bitmap into the actual task saves having to go through
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11575
diff changeset
  1074
  // the ConcurrentMark object.
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11575
diff changeset
  1075
  size_t*                     _marked_bytes_array;
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11575
diff changeset
  1076
  BitMap*                     _card_bm;
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11575
diff changeset
  1077
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1078
  // LOTS of statistics related with this task
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1079
#if _MARKING_STATS_
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1080
  NumberSeq                   _all_clock_intervals_ms;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1081
  double                      _interval_start_time_ms;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1082
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1083
  int                         _aborted;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1084
  int                         _aborted_overflow;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1085
  int                         _aborted_cm_aborted;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1086
  int                         _aborted_yield;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1087
  int                         _aborted_timed_out;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1088
  int                         _aborted_satb;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1089
  int                         _aborted_termination;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1090
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1091
  int                         _steal_attempts;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1092
  int                         _steals;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1093
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1094
  int                         _clock_due_to_marking;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1095
  int                         _clock_due_to_scanning;
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
  int                         _local_pushes;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1098
  int                         _local_pops;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1099
  int                         _local_max_size;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1100
  int                         _objs_scanned;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1101
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1102
  int                         _global_pushes;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1103
  int                         _global_pops;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1104
  int                         _global_max_size;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1105
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1106
  int                         _global_transfers_to;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1107
  int                         _global_transfers_from;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1108
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1109
  int                         _regions_claimed;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1110
  int                         _objs_found_on_bitmap;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1111
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1112
  int                         _satb_buffers_processed;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1113
#endif // _MARKING_STATS_
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
  // it updates the local fields after this task has claimed
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1116
  // a new region to scan
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1117
  void setup_for_region(HeapRegion* hr);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1118
  // it brings up-to-date the limit of the region
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1119
  void update_region_limit();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1120
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1121
  // called when either the words scanned or the refs visited limit
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1122
  // has been reached
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1123
  void reached_limit();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1124
  // recalculates the words scanned and refs visited limits
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1125
  void recalculate_limits();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1126
  // decreases the words scanned and refs visited limits when we reach
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1127
  // an expensive operation
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1128
  void decrease_limits();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1129
  // it checks whether the words scanned or refs visited reached their
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1130
  // respective limit and calls reached_limit() if they have
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1131
  void check_limits() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1132
    if (_words_scanned >= _words_scanned_limit ||
9999
5f0b78217054 7055073: G1: code cleanup in the concurrentMark.* files
tonyp
parents: 9995
diff changeset
  1133
        _refs_reached >= _refs_reached_limit) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1134
      reached_limit();
9999
5f0b78217054 7055073: G1: code cleanup in the concurrentMark.* files
tonyp
parents: 9995
diff changeset
  1135
    }
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1136
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1137
  // 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
  1138
  // 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
  1139
  // to abort
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1140
  void regular_clock_call();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1141
  bool concurrent() { return _concurrent; }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1142
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1143
public:
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1144
  // 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
  1145
  // a marking phase.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1146
  void reset(CMBitMap* _nextMarkBitMap);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1147
  // it clears all the fields that correspond to a claimed region.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1148
  void clear_region_fields();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1149
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1150
  void set_concurrent(bool concurrent) { _concurrent = concurrent; }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1151
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1152
  // The main method of this class which performs a marking step
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1153
  // trying not to exceed the given duration. However, it might exit
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1154
  // prematurely, according to some conditions (i.e. SATB buffers are
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1155
  // available for processing).
16388
60de0264afe8 8009536: G1: Apache Lucene hang during reference processing
johnc
parents: 15949
diff changeset
  1156
  void do_marking_step(double target_ms,
60de0264afe8 8009536: G1: Apache Lucene hang during reference processing
johnc
parents: 15949
diff changeset
  1157
                       bool do_termination,
60de0264afe8 8009536: G1: Apache Lucene hang during reference processing
johnc
parents: 15949
diff changeset
  1158
                       bool is_serial);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1159
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1160
  // These two calls start and stop the timer
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1161
  void record_start_time() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1162
    _elapsed_time_ms = os::elapsedTime() * 1000.0;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1163
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1164
  void record_end_time() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1165
    _elapsed_time_ms = os::elapsedTime() * 1000.0 - _elapsed_time_ms;
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
14073
6012178c0c19 7127708: G1: change task num types from int to uint in concurrent mark
johnc
parents: 13919
diff changeset
  1168
  // returns the worker ID associated with this task.
6012178c0c19 7127708: G1: change task num types from int to uint in concurrent mark
johnc
parents: 13919
diff changeset
  1169
  uint worker_id() { return _worker_id; }
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1170
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1171
  // From TerminatorTerminator. It determines whether this task should
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1172
  // exit the termination protocol after it's entered it.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1173
  virtual bool should_exit_termination();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1174
9936
59dac2950cc7 7041440: G1: assert(obj->is_oop_or_null(true )) failed: Error #
johnc
parents: 9417
diff changeset
  1175
  // 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
  1176
  // 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
  1177
  // being evacuated.
59dac2950cc7 7041440: G1: assert(obj->is_oop_or_null(true )) failed: Error #
johnc
parents: 9417
diff changeset
  1178
  void giveup_current_region();
59dac2950cc7 7041440: G1: assert(obj->is_oop_or_null(true )) failed: Error #
johnc
parents: 9417
diff changeset
  1179
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1180
  HeapWord* finger()            { return _finger; }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1181
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1182
  bool has_aborted()            { return _has_aborted; }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1183
  void set_has_aborted()        { _has_aborted = true; }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1184
  void clear_has_aborted()      { _has_aborted = false; }
8073
a14dc27842dc 6608385: G1: need to support parallel reference processing
johnc
parents: 7923
diff changeset
  1185
  bool has_timed_out()          { return _has_timed_out; }
a14dc27842dc 6608385: G1: need to support parallel reference processing
johnc
parents: 7923
diff changeset
  1186
  bool claimed()                { return _claimed; }
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1187
9994
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents: 9936
diff changeset
  1188
  void set_cm_oop_closure(G1CMOopClosure* cm_oop_closure);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1189
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1190
  // 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
  1191
  // on the local queue
9994
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents: 9936
diff changeset
  1192
  inline void deal_with_reference(oop obj);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1193
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1194
  // It scans an object and visits its children.
9994
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents: 9936
diff changeset
  1195
  void scan_object(oop obj);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1196
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1197
  // It pushes an object on the local queue.
9994
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents: 9936
diff changeset
  1198
  inline void push(oop obj);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1199
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1200
  // These two move entries to/from the global stack.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1201
  void move_entries_to_global_stack();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1202
  void get_entries_from_global_stack();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1203
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1204
  // 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
  1205
  // 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
  1206
  // partially is false, then it stops when the queue is empty.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1207
  void drain_local_queue(bool partially);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1208
  // 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
  1209
  // 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
  1210
  // 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
  1211
  // partially if false, it tries to empty them totally.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1212
  void drain_global_stack(bool partially);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1213
  // It keeps picking SATB buffers and processing them until no SATB
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1214
  // buffers are available.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1215
  void drain_satb_buffers();
11455
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11396
diff changeset
  1216
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1217
  // moves the local finger to a new location
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1218
  inline void move_finger_to(HeapWord* new_finger) {
4026
10386ea70fe5 6888619: G1: too many guarantees in concurrent marking
tonyp
parents: 4022
diff changeset
  1219
    assert(new_finger >= _finger && new_finger < _region_limit, "invariant");
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1220
    _finger = new_finger;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1221
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1222
14073
6012178c0c19 7127708: G1: change task num types from int to uint in concurrent mark
johnc
parents: 13919
diff changeset
  1223
  CMTask(uint worker_id, ConcurrentMark *cm,
11583
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11575
diff changeset
  1224
         size_t* marked_bytes, BitMap* card_bm,
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1225
         CMTaskQueue* task_queue, CMTaskQueueSet* task_queues);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1226
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1227
  // it prints statistics associated with this task
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1228
  void print_stats();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1229
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1230
#if _MARKING_STATS_
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1231
  void increase_objs_found_on_bitmap() { ++_objs_found_on_bitmap; }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1232
#endif // _MARKING_STATS_
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1233
};
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6761
diff changeset
  1234
8930
52368505ee8e 7027766: G1: introduce flag to dump the liveness information per region at the end of marking
tonyp
parents: 8073
diff changeset
  1235
// 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
  1236
// 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
  1237
// 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
  1238
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
  1239
private:
52368505ee8e 7027766: G1: introduce flag to dump the liveness information per region at the end of marking
tonyp
parents: 8073
diff changeset
  1240
  outputStream* _out;
52368505ee8e 7027766: G1: introduce flag to dump the liveness information per region at the end of marking
tonyp
parents: 8073
diff changeset
  1241
52368505ee8e 7027766: G1: introduce flag to dump the liveness information per region at the end of marking
tonyp
parents: 8073
diff changeset
  1242
  // 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
  1243
  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
  1244
  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
  1245
  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
  1246
  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
  1247
52368505ee8e 7027766: G1: introduce flag to dump the liveness information per region at the end of marking
tonyp
parents: 8073
diff changeset
  1248
  // 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
  1249
  // (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
  1250
  // 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
  1251
  // 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
  1252
  // 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
  1253
  // 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
  1254
  // 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
  1255
  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
  1256
  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
  1257
  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
  1258
  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
  1259
52368505ee8e 7027766: G1: introduce flag to dump the liveness information per region at the end of marking
tonyp
parents: 8073
diff changeset
  1260
  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
  1261
    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
  1262
      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
  1263
    } else {
52368505ee8e 7027766: G1: introduce flag to dump the liveness information per region at the end of marking
tonyp
parents: 8073
diff changeset
  1264
      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
  1265
    }
52368505ee8e 7027766: G1: introduce flag to dump the liveness information per region at the end of marking
tonyp
parents: 8073
diff changeset
  1266
  }
52368505ee8e 7027766: G1: introduce flag to dump the liveness information per region at the end of marking
tonyp
parents: 8073
diff changeset
  1267
52368505ee8e 7027766: G1: introduce flag to dump the liveness information per region at the end of marking
tonyp
parents: 8073
diff changeset
  1268
  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
  1269
    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
  1270
  }
52368505ee8e 7027766: G1: introduce flag to dump the liveness information per region at the end of marking
tonyp
parents: 8073
diff changeset
  1271
52368505ee8e 7027766: G1: introduce flag to dump the liveness information per region at the end of marking
tonyp
parents: 8073
diff changeset
  1272
  // 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
  1273
  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
  1274
  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
  1275
                     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
  1276
52368505ee8e 7027766: G1: introduce flag to dump the liveness information per region at the end of marking
tonyp
parents: 8073
diff changeset
  1277
public:
52368505ee8e 7027766: G1: introduce flag to dump the liveness information per region at the end of marking
tonyp
parents: 8073
diff changeset
  1278
  // 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
  1279
  // destructor respectively.
52368505ee8e 7027766: G1: introduce flag to dump the liveness information per region at the end of marking
tonyp
parents: 8073
diff changeset
  1280
  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
  1281
  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
  1282
  ~G1PrintRegionLivenessInfoClosure();
52368505ee8e 7027766: G1: introduce flag to dump the liveness information per region at the end of marking
tonyp
parents: 8073
diff changeset
  1283
};
52368505ee8e 7027766: G1: introduce flag to dump the liveness information per region at the end of marking
tonyp
parents: 8073
diff changeset
  1284
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6761
diff changeset
  1285
#endif // SHARE_VM_GC_IMPLEMENTATION_G1_CONCURRENTMARK_HPP