hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.inline.hpp
author johnc
Tue, 28 Aug 2012 15:20:08 -0700
changeset 13517 f158a0c702d4
parent 10243 d00a21009f1f
child 16604 800a65bfe347
permissions -rw-r--r--
7041879: G1: introduce stress testing parameter to cause frequent evacuation failures Summary: Add the flags G1EvacuationFailureALot flag (and supporting flags) to force trigger evacuation failures. The support flags control how often to trigger an evacuation failure and during which types of evacuation pause. This functionality is analogous to that of PromotionFailureALot for the other collectors. Reviewed-by: brutisso
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
     1
/*
13517
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 10243
diff changeset
     2
 * Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved.
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
     4
 *
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
     7
 * published by the Free Software Foundation.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
     8
 *
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    13
 * accompanied this code).
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    14
 *
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    18
 *
5547
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 2742
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 2742
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: 2742
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: 6260
diff changeset
    25
#ifndef SHARE_VM_GC_IMPLEMENTATION_G1_G1COLLECTEDHEAP_INLINE_HPP
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6260
diff changeset
    26
#define SHARE_VM_GC_IMPLEMENTATION_G1_G1COLLECTEDHEAP_INLINE_HPP
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6260
diff changeset
    27
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6260
diff changeset
    28
#include "gc_implementation/g1/concurrentMark.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6260
diff changeset
    29
#include "gc_implementation/g1/g1CollectedHeap.hpp"
8928
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 7923
diff changeset
    30
#include "gc_implementation/g1/g1AllocRegion.inline.hpp"
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
    31
#include "gc_implementation/g1/g1CollectorPolicy.hpp"
7920
298df61588a2 7011379: G1: overly long concurrent marking cycles
tonyp
parents: 7905
diff changeset
    32
#include "gc_implementation/g1/heapRegionSeq.inline.hpp"
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6260
diff changeset
    33
#include "utilities/taskqueue.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6260
diff changeset
    34
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    35
// Inline functions for G1CollectedHeap
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    36
9989
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 8928
diff changeset
    37
template <class T>
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    38
inline HeapRegion*
9989
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 8928
diff changeset
    39
G1CollectedHeap::heap_region_containing(const T addr) const {
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 8928
diff changeset
    40
  HeapRegion* hr = _hrs.addr_to_region((HeapWord*) addr);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    41
  // hr can be null if addr in perm_gen
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    42
  if (hr != NULL && hr->continuesHumongous()) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    43
    hr = hr->humongous_start_region();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    44
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    45
  return hr;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    46
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    47
9989
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 8928
diff changeset
    48
template <class T>
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    49
inline HeapRegion*
9989
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 8928
diff changeset
    50
G1CollectedHeap::heap_region_containing_raw(const T addr) const {
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 8928
diff changeset
    51
  assert(_g1_reserved.contains((const void*) addr), "invariant");
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 8928
diff changeset
    52
  HeapRegion* res = _hrs.addr_to_region_unsafe((HeapWord*) addr);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    53
  return res;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    54
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    55
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    56
inline bool G1CollectedHeap::obj_in_cs(oop obj) {
9989
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 8928
diff changeset
    57
  HeapRegion* r = _hrs.addr_to_region((HeapWord*) obj);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    58
  return r != NULL && r->in_collection_set();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    59
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    60
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
    61
inline HeapWord*
8928
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 7923
diff changeset
    62
G1CollectedHeap::attempt_allocation(size_t word_size,
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 7923
diff changeset
    63
                                    unsigned int* gc_count_before_ret) {
7905
cc7740616b03 6994297: G1: do first-level slow-path allocations with a CAS
tonyp
parents: 7416
diff changeset
    64
  assert_heap_not_locked_and_not_at_safepoint();
8928
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 7923
diff changeset
    65
  assert(!isHumongous(word_size), "attempt_allocation() should not "
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 7923
diff changeset
    66
         "be called for humongous allocation requests");
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
    67
8928
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 7923
diff changeset
    68
  HeapWord* result = _mutator_alloc_region.attempt_allocation(word_size,
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 7923
diff changeset
    69
                                                      false /* bot_updates */);
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 7923
diff changeset
    70
  if (result == NULL) {
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 7923
diff changeset
    71
    result = attempt_allocation_slow(word_size, gc_count_before_ret);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    72
  }
8928
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 7923
diff changeset
    73
  assert_heap_not_locked();
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 7923
diff changeset
    74
  if (result != NULL) {
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 7923
diff changeset
    75
    dirty_young_block(result, word_size);
7905
cc7740616b03 6994297: G1: do first-level slow-path allocations with a CAS
tonyp
parents: 7416
diff changeset
    76
  }
8928
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 7923
diff changeset
    77
  return result;
7905
cc7740616b03 6994297: G1: do first-level slow-path allocations with a CAS
tonyp
parents: 7416
diff changeset
    78
}
cc7740616b03 6994297: G1: do first-level slow-path allocations with a CAS
tonyp
parents: 7416
diff changeset
    79
10243
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 9989
diff changeset
    80
inline HeapWord* G1CollectedHeap::survivor_attempt_allocation(size_t
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 9989
diff changeset
    81
                                                              word_size) {
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 9989
diff changeset
    82
  assert(!isHumongous(word_size),
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 9989
diff changeset
    83
         "we should not be seeing humongous-size allocations in this path");
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 9989
diff changeset
    84
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 9989
diff changeset
    85
  HeapWord* result = _survivor_gc_alloc_region.attempt_allocation(word_size,
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 9989
diff changeset
    86
                                                      false /* bot_updates */);
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 9989
diff changeset
    87
  if (result == NULL) {
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 9989
diff changeset
    88
    MutexLockerEx x(FreeList_lock, Mutex::_no_safepoint_check_flag);
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 9989
diff changeset
    89
    result = _survivor_gc_alloc_region.attempt_allocation_locked(word_size,
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 9989
diff changeset
    90
                                                      false /* bot_updates */);
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 9989
diff changeset
    91
  }
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 9989
diff changeset
    92
  if (result != NULL) {
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 9989
diff changeset
    93
    dirty_young_block(result, word_size);
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 9989
diff changeset
    94
  }
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 9989
diff changeset
    95
  return result;
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 9989
diff changeset
    96
}
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 9989
diff changeset
    97
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 9989
diff changeset
    98
inline HeapWord* G1CollectedHeap::old_attempt_allocation(size_t word_size) {
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 9989
diff changeset
    99
  assert(!isHumongous(word_size),
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 9989
diff changeset
   100
         "we should not be seeing humongous-size allocations in this path");
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 9989
diff changeset
   101
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 9989
diff changeset
   102
  HeapWord* result = _old_gc_alloc_region.attempt_allocation(word_size,
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 9989
diff changeset
   103
                                                       true /* bot_updates */);
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 9989
diff changeset
   104
  if (result == NULL) {
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 9989
diff changeset
   105
    MutexLockerEx x(FreeList_lock, Mutex::_no_safepoint_check_flag);
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 9989
diff changeset
   106
    result = _old_gc_alloc_region.attempt_allocation_locked(word_size,
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 9989
diff changeset
   107
                                                       true /* bot_updates */);
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 9989
diff changeset
   108
  }
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 9989
diff changeset
   109
  return result;
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 9989
diff changeset
   110
}
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 9989
diff changeset
   111
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   112
// It dirties the cards that cover the block so that so that the post
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   113
// write barrier never queues anything when updating objects on this
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   114
// block. It is assumed (and in fact we assert) that the block
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   115
// belongs to a young region.
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   116
inline void
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   117
G1CollectedHeap::dirty_young_block(HeapWord* start, size_t word_size) {
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   118
  assert_heap_not_locked();
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   119
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   120
  // Assign the containing region to containing_hr so that we don't
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   121
  // have to keep calling heap_region_containing_raw() in the
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   122
  // asserts below.
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   123
  DEBUG_ONLY(HeapRegion* containing_hr = heap_region_containing_raw(start);)
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   124
  assert(containing_hr != NULL && start != NULL && word_size > 0,
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   125
         "pre-condition");
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   126
  assert(containing_hr->is_in(start), "it should contain start");
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   127
  assert(containing_hr->is_young(), "it should be young");
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   128
  assert(!containing_hr->isHumongous(), "it should not be humongous");
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   129
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   130
  HeapWord* end = start + word_size;
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   131
  assert(containing_hr->is_in(end - 1), "it should also contain end - 1");
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   132
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   133
  MemRegion mr(start, end);
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   134
  ((CardTableModRefBS*)_g1h->barrier_set())->dirty(mr);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   135
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   136
6251
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 5547
diff changeset
   137
inline RefToScanQueue* G1CollectedHeap::task_queue(int i) const {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   138
  return _task_queues->queue(i);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   139
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   140
13517
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 10243
diff changeset
   141
inline bool G1CollectedHeap::isMarkedPrev(oop obj) const {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   142
  return _cm->prevMarkBitMap()->isMarked((HeapWord *)obj);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   143
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   144
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   145
inline bool G1CollectedHeap::isMarkedNext(oop obj) const {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   146
  return _cm->nextMarkBitMap()->isMarked((HeapWord *)obj);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   147
}
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6260
diff changeset
   148
13517
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 10243
diff changeset
   149
#ifndef PRODUCT
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 10243
diff changeset
   150
// Support for G1EvacuationFailureALot
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 10243
diff changeset
   151
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 10243
diff changeset
   152
inline bool
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 10243
diff changeset
   153
G1CollectedHeap::evacuation_failure_alot_for_gc_type(bool gcs_are_young,
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 10243
diff changeset
   154
                                                     bool during_initial_mark,
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 10243
diff changeset
   155
                                                     bool during_marking) {
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 10243
diff changeset
   156
  bool res = false;
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 10243
diff changeset
   157
  if (during_marking) {
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 10243
diff changeset
   158
    res |= G1EvacuationFailureALotDuringConcMark;
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 10243
diff changeset
   159
  }
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 10243
diff changeset
   160
  if (during_initial_mark) {
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 10243
diff changeset
   161
    res |= G1EvacuationFailureALotDuringInitialMark;
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 10243
diff changeset
   162
  }
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 10243
diff changeset
   163
  if (gcs_are_young) {
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 10243
diff changeset
   164
    res |= G1EvacuationFailureALotDuringYoungGC;
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 10243
diff changeset
   165
  } else {
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 10243
diff changeset
   166
    // GCs are mixed
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 10243
diff changeset
   167
    res |= G1EvacuationFailureALotDuringMixedGC;
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 10243
diff changeset
   168
  }
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 10243
diff changeset
   169
  return res;
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 10243
diff changeset
   170
}
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 10243
diff changeset
   171
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 10243
diff changeset
   172
inline void
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 10243
diff changeset
   173
G1CollectedHeap::set_evacuation_failure_alot_for_current_gc() {
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 10243
diff changeset
   174
  if (G1EvacuationFailureALot) {
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 10243
diff changeset
   175
    // Note we can't assert that _evacuation_failure_alot_for_current_gc
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 10243
diff changeset
   176
    // is clear here. It may have been set during a previous GC but that GC
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 10243
diff changeset
   177
    // did not copy enough objects (i.e. G1EvacuationFailureALotCount) to
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 10243
diff changeset
   178
    // trigger an evacuation failure and clear the flags and and counts.
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 10243
diff changeset
   179
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 10243
diff changeset
   180
    // Check if we have gone over the interval.
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 10243
diff changeset
   181
    const size_t gc_num = total_collections();
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 10243
diff changeset
   182
    const size_t elapsed_gcs = gc_num - _evacuation_failure_alot_gc_number;
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 10243
diff changeset
   183
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 10243
diff changeset
   184
    _evacuation_failure_alot_for_current_gc = (elapsed_gcs >= G1EvacuationFailureALotInterval);
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 10243
diff changeset
   185
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 10243
diff changeset
   186
    // Now check if G1EvacuationFailureALot is enabled for the current GC type.
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 10243
diff changeset
   187
    const bool gcs_are_young = g1_policy()->gcs_are_young();
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 10243
diff changeset
   188
    const bool during_im = g1_policy()->during_initial_mark_pause();
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 10243
diff changeset
   189
    const bool during_marking = mark_in_progress();
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 10243
diff changeset
   190
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 10243
diff changeset
   191
    _evacuation_failure_alot_for_current_gc &=
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 10243
diff changeset
   192
      evacuation_failure_alot_for_gc_type(gcs_are_young,
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 10243
diff changeset
   193
                                          during_im,
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 10243
diff changeset
   194
                                          during_marking);
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 10243
diff changeset
   195
  }
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 10243
diff changeset
   196
}
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 10243
diff changeset
   197
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 10243
diff changeset
   198
inline bool
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 10243
diff changeset
   199
G1CollectedHeap::evacuation_should_fail() {
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 10243
diff changeset
   200
  if (!G1EvacuationFailureALot || !_evacuation_failure_alot_for_current_gc) {
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 10243
diff changeset
   201
    return false;
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 10243
diff changeset
   202
  }
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 10243
diff changeset
   203
  // G1EvacuationFailureALot is in effect for current GC
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 10243
diff changeset
   204
  // Access to _evacuation_failure_alot_count is not atomic;
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 10243
diff changeset
   205
  // the value does not have to be exact.
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 10243
diff changeset
   206
  if (++_evacuation_failure_alot_count < G1EvacuationFailureALotCount) {
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 10243
diff changeset
   207
    return false;
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 10243
diff changeset
   208
  }
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 10243
diff changeset
   209
  _evacuation_failure_alot_count = 0;
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 10243
diff changeset
   210
  return true;
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 10243
diff changeset
   211
}
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 10243
diff changeset
   212
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 10243
diff changeset
   213
inline void G1CollectedHeap::reset_evacuation_should_fail() {
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 10243
diff changeset
   214
  if (G1EvacuationFailureALot) {
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 10243
diff changeset
   215
    _evacuation_failure_alot_gc_number = total_collections();
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 10243
diff changeset
   216
    _evacuation_failure_alot_count = 0;
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 10243
diff changeset
   217
    _evacuation_failure_alot_for_current_gc = false;
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 10243
diff changeset
   218
  }
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 10243
diff changeset
   219
}
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 10243
diff changeset
   220
#endif  // #ifndef PRODUCT
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 10243
diff changeset
   221
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6260
diff changeset
   222
#endif // SHARE_VM_GC_IMPLEMENTATION_G1_G1COLLECTEDHEAP_INLINE_HPP