hotspot/src/share/vm/gc_implementation/g1/concurrentMark.inline.hpp
author johnc
Thu, 09 May 2013 11:16:39 -0700
changeset 17327 4bd0581aa231
parent 15949 a55dea304e8c
child 20309 7445302daff6
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:
9994
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
     1
/*
15949
a55dea304e8c 8008079: G1: Add nextObject routine to CMBitMapRO and replace nextWord
tamao
parents: 14073
diff changeset
     2
 * Copyright (c) 2001, 2013, Oracle and/or its affiliates. All rights reserved.
9994
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
     4
 *
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
     7
 * published by the Free Software Foundation.
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
     8
 *
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
    13
 * accompanied this code).
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
    14
 *
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
    18
 *
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
    21
 * questions.
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
    22
 *
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
    23
 */
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
    24
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
    25
#ifndef SHARE_VM_GC_IMPLEMENTATION_G1_CONCURRENTMARK_INLINE_HPP
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
    26
#define SHARE_VM_GC_IMPLEMENTATION_G1_CONCURRENTMARK_INLINE_HPP
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
    27
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
    28
#include "gc_implementation/g1/concurrentMark.hpp"
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
    29
#include "gc_implementation/g1/g1CollectedHeap.inline.hpp"
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
    30
13919
01f6d01a9004 7200261: G1: Liveness counting inconsistencies during marking verification
johnc
parents: 12381
diff changeset
    31
// Utility routine to set an exclusive range of cards on the given
01f6d01a9004 7200261: G1: Liveness counting inconsistencies during marking verification
johnc
parents: 12381
diff changeset
    32
// card liveness bitmap
01f6d01a9004 7200261: G1: Liveness counting inconsistencies during marking verification
johnc
parents: 12381
diff changeset
    33
inline void ConcurrentMark::set_card_bitmap_range(BitMap* card_bm,
01f6d01a9004 7200261: G1: Liveness counting inconsistencies during marking verification
johnc
parents: 12381
diff changeset
    34
                                                  BitMap::idx_t start_idx,
01f6d01a9004 7200261: G1: Liveness counting inconsistencies during marking verification
johnc
parents: 12381
diff changeset
    35
                                                  BitMap::idx_t end_idx,
01f6d01a9004 7200261: G1: Liveness counting inconsistencies during marking verification
johnc
parents: 12381
diff changeset
    36
                                                  bool is_par) {
01f6d01a9004 7200261: G1: Liveness counting inconsistencies during marking verification
johnc
parents: 12381
diff changeset
    37
01f6d01a9004 7200261: G1: Liveness counting inconsistencies during marking verification
johnc
parents: 12381
diff changeset
    38
  // Set the exclusive bit range [start_idx, end_idx).
01f6d01a9004 7200261: G1: Liveness counting inconsistencies during marking verification
johnc
parents: 12381
diff changeset
    39
  assert((end_idx - start_idx) > 0, "at least one card");
01f6d01a9004 7200261: G1: Liveness counting inconsistencies during marking verification
johnc
parents: 12381
diff changeset
    40
  assert(end_idx <= card_bm->size(), "sanity");
01f6d01a9004 7200261: G1: Liveness counting inconsistencies during marking verification
johnc
parents: 12381
diff changeset
    41
01f6d01a9004 7200261: G1: Liveness counting inconsistencies during marking verification
johnc
parents: 12381
diff changeset
    42
  // Silently clip the end index
01f6d01a9004 7200261: G1: Liveness counting inconsistencies during marking verification
johnc
parents: 12381
diff changeset
    43
  end_idx = MIN2(end_idx, card_bm->size());
01f6d01a9004 7200261: G1: Liveness counting inconsistencies during marking verification
johnc
parents: 12381
diff changeset
    44
01f6d01a9004 7200261: G1: Liveness counting inconsistencies during marking verification
johnc
parents: 12381
diff changeset
    45
  // For small ranges use a simple loop; otherwise use set_range or
01f6d01a9004 7200261: G1: Liveness counting inconsistencies during marking verification
johnc
parents: 12381
diff changeset
    46
  // use par_at_put_range (if parallel). The range is made up of the
01f6d01a9004 7200261: G1: Liveness counting inconsistencies during marking verification
johnc
parents: 12381
diff changeset
    47
  // cards that are spanned by an object/mem region so 8 cards will
01f6d01a9004 7200261: G1: Liveness counting inconsistencies during marking verification
johnc
parents: 12381
diff changeset
    48
  // allow up to object sizes up to 4K to be handled using the loop.
01f6d01a9004 7200261: G1: Liveness counting inconsistencies during marking verification
johnc
parents: 12381
diff changeset
    49
  if ((end_idx - start_idx) <= 8) {
01f6d01a9004 7200261: G1: Liveness counting inconsistencies during marking verification
johnc
parents: 12381
diff changeset
    50
    for (BitMap::idx_t i = start_idx; i < end_idx; i += 1) {
01f6d01a9004 7200261: G1: Liveness counting inconsistencies during marking verification
johnc
parents: 12381
diff changeset
    51
      if (is_par) {
01f6d01a9004 7200261: G1: Liveness counting inconsistencies during marking verification
johnc
parents: 12381
diff changeset
    52
        card_bm->par_set_bit(i);
01f6d01a9004 7200261: G1: Liveness counting inconsistencies during marking verification
johnc
parents: 12381
diff changeset
    53
      } else {
01f6d01a9004 7200261: G1: Liveness counting inconsistencies during marking verification
johnc
parents: 12381
diff changeset
    54
        card_bm->set_bit(i);
01f6d01a9004 7200261: G1: Liveness counting inconsistencies during marking verification
johnc
parents: 12381
diff changeset
    55
      }
01f6d01a9004 7200261: G1: Liveness counting inconsistencies during marking verification
johnc
parents: 12381
diff changeset
    56
    }
01f6d01a9004 7200261: G1: Liveness counting inconsistencies during marking verification
johnc
parents: 12381
diff changeset
    57
  } else {
01f6d01a9004 7200261: G1: Liveness counting inconsistencies during marking verification
johnc
parents: 12381
diff changeset
    58
    // Note BitMap::par_at_put_range() and BitMap::set_range() are exclusive.
01f6d01a9004 7200261: G1: Liveness counting inconsistencies during marking verification
johnc
parents: 12381
diff changeset
    59
    if (is_par) {
01f6d01a9004 7200261: G1: Liveness counting inconsistencies during marking verification
johnc
parents: 12381
diff changeset
    60
      card_bm->par_at_put_range(start_idx, end_idx, true);
01f6d01a9004 7200261: G1: Liveness counting inconsistencies during marking verification
johnc
parents: 12381
diff changeset
    61
    } else {
01f6d01a9004 7200261: G1: Liveness counting inconsistencies during marking verification
johnc
parents: 12381
diff changeset
    62
      card_bm->set_range(start_idx, end_idx);
01f6d01a9004 7200261: G1: Liveness counting inconsistencies during marking verification
johnc
parents: 12381
diff changeset
    63
    }
01f6d01a9004 7200261: G1: Liveness counting inconsistencies during marking verification
johnc
parents: 12381
diff changeset
    64
  }
01f6d01a9004 7200261: G1: Liveness counting inconsistencies during marking verification
johnc
parents: 12381
diff changeset
    65
}
01f6d01a9004 7200261: G1: Liveness counting inconsistencies during marking verification
johnc
parents: 12381
diff changeset
    66
11583
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
    67
// Returns the index in the liveness accounting card bitmap
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
    68
// for the given address
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
    69
inline BitMap::idx_t ConcurrentMark::card_bitmap_index_for(HeapWord* addr) {
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
    70
  // Below, the term "card num" means the result of shifting an address
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
    71
  // by the card shift -- address 0 corresponds to card number 0.  One
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
    72
  // must subtract the card num of the bottom of the heap to obtain a
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
    73
  // card table index.
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
    74
  intptr_t card_num = intptr_t(uintptr_t(addr) >> CardTableModRefBS::card_shift);
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
    75
  return card_num - heap_bottom_card_num();
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
    76
}
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
    77
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
    78
// Counts the given memory region in the given task/worker
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
    79
// counting data structures.
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
    80
inline void ConcurrentMark::count_region(MemRegion mr, HeapRegion* hr,
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
    81
                                         size_t* marked_bytes_array,
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
    82
                                         BitMap* task_card_bm) {
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
    83
  G1CollectedHeap* g1h = _g1h;
13919
01f6d01a9004 7200261: G1: Liveness counting inconsistencies during marking verification
johnc
parents: 12381
diff changeset
    84
  CardTableModRefBS* ct_bs = (CardTableModRefBS*) (g1h->barrier_set());
01f6d01a9004 7200261: G1: Liveness counting inconsistencies during marking verification
johnc
parents: 12381
diff changeset
    85
11583
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
    86
  HeapWord* start = mr.start();
13919
01f6d01a9004 7200261: G1: Liveness counting inconsistencies during marking verification
johnc
parents: 12381
diff changeset
    87
  HeapWord* end = mr.end();
11583
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
    88
  size_t region_size_bytes = mr.byte_size();
12381
1438e0fbfa27 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 11584
diff changeset
    89
  uint index = hr->hrs_index();
11583
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
    90
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
    91
  assert(!hr->continuesHumongous(), "should not be HC region");
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
    92
  assert(hr == g1h->heap_region_containing(start), "sanity");
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
    93
  assert(hr == g1h->heap_region_containing(mr.last()), "sanity");
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
    94
  assert(marked_bytes_array != NULL, "pre-condition");
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
    95
  assert(task_card_bm != NULL, "pre-condition");
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
    96
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
    97
  // Add to the task local marked bytes for this region.
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
    98
  marked_bytes_array[index] += region_size_bytes;
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
    99
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   100
  BitMap::idx_t start_idx = card_bitmap_index_for(start);
13919
01f6d01a9004 7200261: G1: Liveness counting inconsistencies during marking verification
johnc
parents: 12381
diff changeset
   101
  BitMap::idx_t end_idx = card_bitmap_index_for(end);
11583
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   102
13919
01f6d01a9004 7200261: G1: Liveness counting inconsistencies during marking verification
johnc
parents: 12381
diff changeset
   103
  // Note: if we're looking at the last region in heap - end
01f6d01a9004 7200261: G1: Liveness counting inconsistencies during marking verification
johnc
parents: 12381
diff changeset
   104
  // could be actually just beyond the end of the heap; end_idx
01f6d01a9004 7200261: G1: Liveness counting inconsistencies during marking verification
johnc
parents: 12381
diff changeset
   105
  // will then correspond to a (non-existent) card that is also
01f6d01a9004 7200261: G1: Liveness counting inconsistencies during marking verification
johnc
parents: 12381
diff changeset
   106
  // just beyond the heap.
01f6d01a9004 7200261: G1: Liveness counting inconsistencies during marking verification
johnc
parents: 12381
diff changeset
   107
  if (g1h->is_in_g1_reserved(end) && !ct_bs->is_card_aligned(end)) {
01f6d01a9004 7200261: G1: Liveness counting inconsistencies during marking verification
johnc
parents: 12381
diff changeset
   108
    // end of region is not card aligned - incremement to cover
01f6d01a9004 7200261: G1: Liveness counting inconsistencies during marking verification
johnc
parents: 12381
diff changeset
   109
    // all the cards spanned by the region.
01f6d01a9004 7200261: G1: Liveness counting inconsistencies during marking verification
johnc
parents: 12381
diff changeset
   110
    end_idx += 1;
11583
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   111
  }
13919
01f6d01a9004 7200261: G1: Liveness counting inconsistencies during marking verification
johnc
parents: 12381
diff changeset
   112
  // The card bitmap is task/worker specific => no need to use
01f6d01a9004 7200261: G1: Liveness counting inconsistencies during marking verification
johnc
parents: 12381
diff changeset
   113
  // the 'par' BitMap routines.
01f6d01a9004 7200261: G1: Liveness counting inconsistencies during marking verification
johnc
parents: 12381
diff changeset
   114
  // Set bits in the exclusive bit range [start_idx, end_idx).
01f6d01a9004 7200261: G1: Liveness counting inconsistencies during marking verification
johnc
parents: 12381
diff changeset
   115
  set_card_bitmap_range(task_card_bm, start_idx, end_idx, false /* is_par */);
11583
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   116
}
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   117
11584
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   118
// 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
   119
// data structures for the given worker id.
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   120
inline void ConcurrentMark::count_region(MemRegion mr,
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   121
                                         HeapRegion* hr,
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   122
                                         uint worker_id) {
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   123
  size_t* marked_bytes_array = count_marked_bytes_array_for(worker_id);
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   124
  BitMap* task_card_bm = count_card_bitmap_for(worker_id);
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   125
  count_region(mr, hr, marked_bytes_array, task_card_bm);
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   126
}
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   127
11583
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   128
// Counts the given memory region, which may be a single object, in the
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   129
// task/worker counting data structures for the given worker id.
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   130
inline void ConcurrentMark::count_region(MemRegion mr, uint worker_id) {
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   131
  HeapWord* addr = mr.start();
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   132
  HeapRegion* hr = _g1h->heap_region_containing_raw(addr);
11584
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   133
  count_region(mr, hr, worker_id);
11583
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   134
}
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   135
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   136
// Counts the given object in the given task/worker counting data structures.
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   137
inline void ConcurrentMark::count_object(oop obj,
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   138
                                         HeapRegion* hr,
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   139
                                         size_t* marked_bytes_array,
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   140
                                         BitMap* task_card_bm) {
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   141
  MemRegion mr((HeapWord*)obj, obj->size());
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   142
  count_region(mr, hr, marked_bytes_array, task_card_bm);
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   143
}
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   144
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   145
// Counts the given object in the task/worker counting data
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   146
// structures for the given worker id.
11584
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   147
inline void ConcurrentMark::count_object(oop obj,
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   148
                                         HeapRegion* hr,
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   149
                                         uint worker_id) {
11583
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   150
  size_t* marked_bytes_array = count_marked_bytes_array_for(worker_id);
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   151
  BitMap* task_card_bm = count_card_bitmap_for(worker_id);
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   152
  HeapWord* addr = (HeapWord*) obj;
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   153
  count_object(obj, hr, marked_bytes_array, task_card_bm);
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   154
}
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   155
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   156
// Attempts to mark the given object and, if successful, counts
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   157
// the object in the given task/worker counting structures.
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   158
inline bool ConcurrentMark::par_mark_and_count(oop obj,
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   159
                                               HeapRegion* hr,
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   160
                                               size_t* marked_bytes_array,
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   161
                                               BitMap* task_card_bm) {
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   162
  HeapWord* addr = (HeapWord*)obj;
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   163
  if (_nextMarkBitMap->parMark(addr)) {
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   164
    // Update the task specific count data for the object.
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   165
    count_object(obj, hr, marked_bytes_array, task_card_bm);
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   166
    return true;
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   167
  }
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   168
  return false;
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   169
}
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   170
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   171
// Attempts to mark the given object and, if successful, counts
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   172
// the object in the task/worker counting structures for the
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   173
// given worker id.
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   174
inline bool ConcurrentMark::par_mark_and_count(oop obj,
11584
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   175
                                               size_t word_size,
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   176
                                               HeapRegion* hr,
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   177
                                               uint worker_id) {
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   178
  HeapWord* addr = (HeapWord*)obj;
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   179
  if (_nextMarkBitMap->parMark(addr)) {
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   180
    MemRegion mr(addr, word_size);
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   181
    count_region(mr, hr, worker_id);
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   182
    return true;
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   183
  }
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   184
  return false;
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   185
}
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   186
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   187
// 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
   188
// 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
   189
// given worker id.
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   190
inline bool ConcurrentMark::par_mark_and_count(oop obj,
11583
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   191
                                               HeapRegion* hr,
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   192
                                               uint worker_id) {
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   193
  HeapWord* addr = (HeapWord*)obj;
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   194
  if (_nextMarkBitMap->parMark(addr)) {
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   195
    // Update the task specific count data for the object.
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   196
    count_object(obj, hr, worker_id);
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   197
    return true;
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   198
  }
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   199
  return false;
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   200
}
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   201
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   202
// As above - but we don't know the heap region containing the
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   203
// object and so have to supply it.
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   204
inline bool ConcurrentMark::par_mark_and_count(oop obj, uint worker_id) {
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   205
  HeapWord* addr = (HeapWord*)obj;
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   206
  HeapRegion* hr = _g1h->heap_region_containing_raw(addr);
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   207
  return par_mark_and_count(obj, hr, worker_id);
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   208
}
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   209
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   210
// Similar to the above routine but we already know the size, in words, of
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   211
// the object that we wish to mark/count
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   212
inline bool ConcurrentMark::par_mark_and_count(oop obj,
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   213
                                               size_t word_size,
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   214
                                               uint worker_id) {
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   215
  HeapWord* addr = (HeapWord*)obj;
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   216
  if (_nextMarkBitMap->parMark(addr)) {
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   217
    // Update the task specific count data for the object.
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   218
    MemRegion mr(addr, word_size);
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   219
    count_region(mr, worker_id);
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   220
    return true;
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   221
  }
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   222
  return false;
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   223
}
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   224
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   225
// Unconditionally mark the given object, and unconditinally count
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   226
// the object in the counting structures for worker id 0.
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   227
// Should *not* be called from parallel code.
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   228
inline bool ConcurrentMark::mark_and_count(oop obj, HeapRegion* hr) {
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   229
  HeapWord* addr = (HeapWord*)obj;
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   230
  _nextMarkBitMap->mark(addr);
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   231
  // Update the task specific count data for the object.
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   232
  count_object(obj, hr, 0 /* worker_id */);
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   233
  return true;
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   234
}
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   235
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   236
// As above - but we don't have the heap region containing the
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   237
// object, so we have to supply it.
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   238
inline bool ConcurrentMark::mark_and_count(oop obj) {
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   239
  HeapWord* addr = (HeapWord*)obj;
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   240
  HeapRegion* hr = _g1h->heap_region_containing_raw(addr);
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   241
  return mark_and_count(obj, hr);
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   242
}
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   243
11574
8a7fe61966c0 7121547: G1: High number mispredicted branches while iterating over the marking bitmap
johnc
parents: 11455
diff changeset
   244
inline bool CMBitMapRO::iterate(BitMapClosure* cl, MemRegion mr) {
8a7fe61966c0 7121547: G1: High number mispredicted branches while iterating over the marking bitmap
johnc
parents: 11455
diff changeset
   245
  HeapWord* start_addr = MAX2(startWord(), mr.start());
8a7fe61966c0 7121547: G1: High number mispredicted branches while iterating over the marking bitmap
johnc
parents: 11455
diff changeset
   246
  HeapWord* end_addr = MIN2(endWord(), mr.end());
8a7fe61966c0 7121547: G1: High number mispredicted branches while iterating over the marking bitmap
johnc
parents: 11455
diff changeset
   247
8a7fe61966c0 7121547: G1: High number mispredicted branches while iterating over the marking bitmap
johnc
parents: 11455
diff changeset
   248
  if (end_addr > start_addr) {
8a7fe61966c0 7121547: G1: High number mispredicted branches while iterating over the marking bitmap
johnc
parents: 11455
diff changeset
   249
    // Right-open interval [start-offset, end-offset).
8a7fe61966c0 7121547: G1: High number mispredicted branches while iterating over the marking bitmap
johnc
parents: 11455
diff changeset
   250
    BitMap::idx_t start_offset = heapWordToOffset(start_addr);
8a7fe61966c0 7121547: G1: High number mispredicted branches while iterating over the marking bitmap
johnc
parents: 11455
diff changeset
   251
    BitMap::idx_t end_offset = heapWordToOffset(end_addr);
8a7fe61966c0 7121547: G1: High number mispredicted branches while iterating over the marking bitmap
johnc
parents: 11455
diff changeset
   252
8a7fe61966c0 7121547: G1: High number mispredicted branches while iterating over the marking bitmap
johnc
parents: 11455
diff changeset
   253
    start_offset = _bm.get_next_one_offset(start_offset, end_offset);
8a7fe61966c0 7121547: G1: High number mispredicted branches while iterating over the marking bitmap
johnc
parents: 11455
diff changeset
   254
    while (start_offset < end_offset) {
8a7fe61966c0 7121547: G1: High number mispredicted branches while iterating over the marking bitmap
johnc
parents: 11455
diff changeset
   255
      if (!cl->do_bit(start_offset)) {
8a7fe61966c0 7121547: G1: High number mispredicted branches while iterating over the marking bitmap
johnc
parents: 11455
diff changeset
   256
        return false;
8a7fe61966c0 7121547: G1: High number mispredicted branches while iterating over the marking bitmap
johnc
parents: 11455
diff changeset
   257
      }
15949
a55dea304e8c 8008079: G1: Add nextObject routine to CMBitMapRO and replace nextWord
tamao
parents: 14073
diff changeset
   258
      HeapWord* next_addr = MIN2(nextObject(offsetToHeapWord(start_offset)), end_addr);
11574
8a7fe61966c0 7121547: G1: High number mispredicted branches while iterating over the marking bitmap
johnc
parents: 11455
diff changeset
   259
      BitMap::idx_t next_offset = heapWordToOffset(next_addr);
8a7fe61966c0 7121547: G1: High number mispredicted branches while iterating over the marking bitmap
johnc
parents: 11455
diff changeset
   260
      start_offset = _bm.get_next_one_offset(next_offset, end_offset);
8a7fe61966c0 7121547: G1: High number mispredicted branches while iterating over the marking bitmap
johnc
parents: 11455
diff changeset
   261
    }
8a7fe61966c0 7121547: G1: High number mispredicted branches while iterating over the marking bitmap
johnc
parents: 11455
diff changeset
   262
  }
8a7fe61966c0 7121547: G1: High number mispredicted branches while iterating over the marking bitmap
johnc
parents: 11455
diff changeset
   263
  return true;
8a7fe61966c0 7121547: G1: High number mispredicted branches while iterating over the marking bitmap
johnc
parents: 11455
diff changeset
   264
}
8a7fe61966c0 7121547: G1: High number mispredicted branches while iterating over the marking bitmap
johnc
parents: 11455
diff changeset
   265
8a7fe61966c0 7121547: G1: High number mispredicted branches while iterating over the marking bitmap
johnc
parents: 11455
diff changeset
   266
inline bool CMBitMapRO::iterate(BitMapClosure* cl) {
8a7fe61966c0 7121547: G1: High number mispredicted branches while iterating over the marking bitmap
johnc
parents: 11455
diff changeset
   267
  MemRegion mr(startWord(), sizeInWords());
8a7fe61966c0 7121547: G1: High number mispredicted branches while iterating over the marking bitmap
johnc
parents: 11455
diff changeset
   268
  return iterate(cl, mr);
8a7fe61966c0 7121547: G1: High number mispredicted branches while iterating over the marking bitmap
johnc
parents: 11455
diff changeset
   269
}
8a7fe61966c0 7121547: G1: High number mispredicted branches while iterating over the marking bitmap
johnc
parents: 11455
diff changeset
   270
9994
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   271
inline void CMTask::push(oop obj) {
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   272
  HeapWord* objAddr = (HeapWord*) obj;
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   273
  assert(_g1h->is_in_g1_reserved(objAddr), "invariant");
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   274
  assert(!_g1h->is_on_master_free_list(
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   275
              _g1h->heap_region_containing((HeapWord*) objAddr)), "invariant");
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   276
  assert(!_g1h->is_obj_ill(obj), "invariant");
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   277
  assert(_nextMarkBitMap->isMarked(objAddr), "invariant");
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   278
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   279
  if (_cm->verbose_high()) {
14073
6012178c0c19 7127708: G1: change task num types from int to uint in concurrent mark
johnc
parents: 13919
diff changeset
   280
    gclog_or_tty->print_cr("[%u] pushing "PTR_FORMAT, _worker_id, (void*) obj);
9994
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   281
  }
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   282
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   283
  if (!_task_queue->push(obj)) {
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   284
    // The local task queue looks full. We need to push some entries
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   285
    // to the global stack.
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   286
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   287
    if (_cm->verbose_medium()) {
14073
6012178c0c19 7127708: G1: change task num types from int to uint in concurrent mark
johnc
parents: 13919
diff changeset
   288
      gclog_or_tty->print_cr("[%u] task queue overflow, "
9994
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   289
                             "moving entries to the global stack",
14073
6012178c0c19 7127708: G1: change task num types from int to uint in concurrent mark
johnc
parents: 13919
diff changeset
   290
                             _worker_id);
9994
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   291
    }
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   292
    move_entries_to_global_stack();
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   293
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   294
    // this should succeed since, even if we overflow the global
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   295
    // stack, we should have definitely removed some entries from the
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   296
    // local queue. So, there must be space on it.
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   297
    bool success = _task_queue->push(obj);
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   298
    assert(success, "invariant");
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   299
  }
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   300
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   301
  statsOnly( int tmp_size = _task_queue->size();
9999
5f0b78217054 7055073: G1: code cleanup in the concurrentMark.* files
tonyp
parents: 9994
diff changeset
   302
             if (tmp_size > _local_max_size) {
9994
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   303
               _local_max_size = tmp_size;
9999
5f0b78217054 7055073: G1: code cleanup in the concurrentMark.* files
tonyp
parents: 9994
diff changeset
   304
             }
9994
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   305
             ++_local_pushes );
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   306
}
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   307
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   308
// This determines whether the method below will check both the local
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   309
// and global fingers when determining whether to push on the stack a
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   310
// gray object (value 1) or whether it will only check the global one
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   311
// (value 0). The tradeoffs are that the former will be a bit more
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   312
// accurate and possibly push less on the stack, but it might also be
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   313
// a little bit slower.
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   314
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   315
#define _CHECK_BOTH_FINGERS_      1
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   316
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   317
inline void CMTask::deal_with_reference(oop obj) {
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   318
  if (_cm->verbose_high()) {
14073
6012178c0c19 7127708: G1: change task num types from int to uint in concurrent mark
johnc
parents: 13919
diff changeset
   319
    gclog_or_tty->print_cr("[%u] we're dealing with reference = "PTR_FORMAT,
6012178c0c19 7127708: G1: change task num types from int to uint in concurrent mark
johnc
parents: 13919
diff changeset
   320
                           _worker_id, (void*) obj);
9994
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   321
  }
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   322
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   323
  ++_refs_reached;
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   324
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   325
  HeapWord* objAddr = (HeapWord*) obj;
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   326
  assert(obj->is_oop_or_null(true /* ignore mark word */), "Error");
11583
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   327
  if (_g1h->is_in_g1_reserved(objAddr)) {
9994
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   328
    assert(obj != NULL, "null check is implicit");
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   329
    if (!_nextMarkBitMap->isMarked(objAddr)) {
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   330
      // Only get the containing region if the object is not marked on the
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   331
      // bitmap (otherwise, it's a waste of time since we won't do
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   332
      // anything with it).
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   333
      HeapRegion* hr = _g1h->heap_region_containing_raw(obj);
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   334
      if (!hr->obj_allocated_since_next_marking(obj)) {
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   335
        if (_cm->verbose_high()) {
14073
6012178c0c19 7127708: G1: change task num types from int to uint in concurrent mark
johnc
parents: 13919
diff changeset
   336
          gclog_or_tty->print_cr("[%u] "PTR_FORMAT" is not considered marked",
6012178c0c19 7127708: G1: change task num types from int to uint in concurrent mark
johnc
parents: 13919
diff changeset
   337
                                 _worker_id, (void*) obj);
9994
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   338
        }
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   339
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   340
        // we need to mark it first
11583
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   341
        if (_cm->par_mark_and_count(obj, hr, _marked_bytes_array, _card_bm)) {
9994
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   342
          // No OrderAccess:store_load() is needed. It is implicit in the
11583
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   343
          // CAS done in CMBitMap::parMark() call in the routine above.
9994
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   344
          HeapWord* global_finger = _cm->finger();
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   345
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   346
#if _CHECK_BOTH_FINGERS_
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   347
          // we will check both the local and global fingers
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   348
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   349
          if (_finger != NULL && objAddr < _finger) {
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   350
            if (_cm->verbose_high()) {
14073
6012178c0c19 7127708: G1: change task num types from int to uint in concurrent mark
johnc
parents: 13919
diff changeset
   351
              gclog_or_tty->print_cr("[%u] below the local finger ("PTR_FORMAT"), "
6012178c0c19 7127708: G1: change task num types from int to uint in concurrent mark
johnc
parents: 13919
diff changeset
   352
                                     "pushing it", _worker_id, _finger);
9994
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   353
            }
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   354
            push(obj);
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   355
          } else if (_curr_region != NULL && objAddr < _region_limit) {
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   356
            // do nothing
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   357
          } else if (objAddr < global_finger) {
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   358
            // Notice that the global finger might be moving forward
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   359
            // concurrently. This is not a problem. In the worst case, we
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   360
            // mark the object while it is above the global finger and, by
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   361
            // the time we read the global finger, it has moved forward
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   362
            // passed this object. In this case, the object will probably
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   363
            // be visited when a task is scanning the region and will also
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   364
            // be pushed on the stack. So, some duplicate work, but no
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   365
            // correctness problems.
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   366
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   367
            if (_cm->verbose_high()) {
14073
6012178c0c19 7127708: G1: change task num types from int to uint in concurrent mark
johnc
parents: 13919
diff changeset
   368
              gclog_or_tty->print_cr("[%u] below the global finger "
9994
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   369
                                     "("PTR_FORMAT"), pushing it",
14073
6012178c0c19 7127708: G1: change task num types from int to uint in concurrent mark
johnc
parents: 13919
diff changeset
   370
                                     _worker_id, global_finger);
9994
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   371
            }
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   372
            push(obj);
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   373
          } else {
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   374
            // do nothing
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   375
          }
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   376
#else // _CHECK_BOTH_FINGERS_
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   377
          // we will only check the global finger
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   378
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   379
          if (objAddr < global_finger) {
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   380
            // see long comment above
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   381
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   382
            if (_cm->verbose_high()) {
14073
6012178c0c19 7127708: G1: change task num types from int to uint in concurrent mark
johnc
parents: 13919
diff changeset
   383
              gclog_or_tty->print_cr("[%u] below the global finger "
9994
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   384
                                     "("PTR_FORMAT"), pushing it",
14073
6012178c0c19 7127708: G1: change task num types from int to uint in concurrent mark
johnc
parents: 13919
diff changeset
   385
                                     _worker_id, global_finger);
9994
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   386
            }
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   387
            push(obj);
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   388
          }
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   389
#endif // _CHECK_BOTH_FINGERS_
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   390
        }
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   391
      }
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   392
    }
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   393
  }
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   394
}
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   395
11455
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 9999
diff changeset
   396
inline void ConcurrentMark::markPrev(oop p) {
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 9999
diff changeset
   397
  assert(!_prevMarkBitMap->isMarked((HeapWord*) p), "sanity");
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 9999
diff changeset
   398
  // Note we are overriding the read-only view of the prev map here, via
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 9999
diff changeset
   399
  // the cast.
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 9999
diff changeset
   400
  ((CMBitMap*)_prevMarkBitMap)->mark((HeapWord*) p);
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 9999
diff changeset
   401
}
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 9999
diff changeset
   402
11584
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   403
inline void ConcurrentMark::grayRoot(oop obj, size_t word_size,
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   404
                                     uint worker_id, HeapRegion* hr) {
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   405
  assert(obj != NULL, "pre-condition");
11455
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 9999
diff changeset
   406
  HeapWord* addr = (HeapWord*) obj;
11584
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   407
  if (hr == NULL) {
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   408
    hr = _g1h->heap_region_containing_raw(addr);
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   409
  } else {
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   410
    assert(hr->is_in(addr), "pre-condition");
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   411
  }
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   412
  assert(hr != NULL, "sanity");
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   413
  // Given that we're looking for a region that contains an object
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   414
  // header it's impossible to get back a HC region.
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   415
  assert(!hr->continuesHumongous(), "sanity");
11455
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 9999
diff changeset
   416
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 9999
diff changeset
   417
  // We cannot assert that word_size == obj->size() given that obj
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 9999
diff changeset
   418
  // might not be in a consistent state (another thread might be in
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 9999
diff changeset
   419
  // the process of copying it). So the best thing we can do is to
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 9999
diff changeset
   420
  // assert that word_size is under an upper bound which is its
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 9999
diff changeset
   421
  // containing region's capacity.
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 9999
diff changeset
   422
  assert(word_size * HeapWordSize <= hr->capacity(),
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 9999
diff changeset
   423
         err_msg("size: "SIZE_FORMAT" capacity: "SIZE_FORMAT" "HR_FORMAT,
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 9999
diff changeset
   424
                 word_size * HeapWordSize, hr->capacity(),
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 9999
diff changeset
   425
                 HR_FORMAT_PARAMS(hr)));
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 9999
diff changeset
   426
11584
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   427
  if (addr < hr->next_top_at_mark_start()) {
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   428
    if (!_nextMarkBitMap->isMarked(addr)) {
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   429
      par_mark_and_count(obj, word_size, hr, worker_id);
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   430
    }
11455
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 9999
diff changeset
   431
  }
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 9999
diff changeset
   432
}
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 9999
diff changeset
   433
9994
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   434
#endif // SHARE_VM_GC_IMPLEMENTATION_G1_CONCURRENTMARK_INLINE_HPP