src/hotspot/share/gc/g1/heapRegion.cpp
author tschatzl
Mon, 26 Mar 2018 16:51:43 +0200
changeset 49607 acffe6ff3ae7
parent 49603 6ce4db4460ca
child 49632 64f9ebc85e67
permissions -rw-r--r--
8180415: Rebuild remembered sets during the concurrent cycle Summary: In general maintain remembered sets of old regions only from the start of the concurrent cycle to the mixed gc they are used, at most until the end of the mixed phase. Reviewed-by: sjohanss, sangheki
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
/*
49164
7e958a8ebcd3 8195142: Refactor out card table from CardTableModRefBS to flatten the BarrierSet hierarchy
eosterlund
parents: 47885
diff changeset
     2
 * Copyright (c) 2001, 2018, 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: 5545
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 5545
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: 5545
diff changeset
    21
 * questions.
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    22
 *
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    23
 */
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    24
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6983
diff changeset
    25
#include "precompiled.hpp"
19339
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18999
diff changeset
    26
#include "code/nmethod.hpp"
30764
fec48bf5a827 8079792: GC directory structure cleanup
pliden
parents: 29796
diff changeset
    27
#include "gc/g1/g1BlockOffsetTable.inline.hpp"
fec48bf5a827 8079792: GC directory structure cleanup
pliden
parents: 29796
diff changeset
    28
#include "gc/g1/g1CollectedHeap.inline.hpp"
36098
e056a98ac7ca 8149650: Create a trace event for G1 heap region type transitions
david
parents: 36091
diff changeset
    29
#include "gc/g1/g1HeapRegionTraceType.hpp"
30764
fec48bf5a827 8079792: GC directory structure cleanup
pliden
parents: 29796
diff changeset
    30
#include "gc/g1/g1OopClosures.inline.hpp"
fec48bf5a827 8079792: GC directory structure cleanup
pliden
parents: 29796
diff changeset
    31
#include "gc/g1/heapRegion.inline.hpp"
fec48bf5a827 8079792: GC directory structure cleanup
pliden
parents: 29796
diff changeset
    32
#include "gc/g1/heapRegionBounds.inline.hpp"
fec48bf5a827 8079792: GC directory structure cleanup
pliden
parents: 29796
diff changeset
    33
#include "gc/g1/heapRegionManager.inline.hpp"
fec48bf5a827 8079792: GC directory structure cleanup
pliden
parents: 29796
diff changeset
    34
#include "gc/g1/heapRegionRemSet.hpp"
36098
e056a98ac7ca 8149650: Create a trace event for G1 heap region type transitions
david
parents: 36091
diff changeset
    35
#include "gc/g1/heapRegionTracer.hpp"
30764
fec48bf5a827 8079792: GC directory structure cleanup
pliden
parents: 29796
diff changeset
    36
#include "gc/shared/genOopClosures.inline.hpp"
fec48bf5a827 8079792: GC directory structure cleanup
pliden
parents: 29796
diff changeset
    37
#include "gc/shared/space.inline.hpp"
35061
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34671
diff changeset
    38
#include "logging/log.hpp"
46701
f559541c0daa 8181917: Refactor UL LogStreams to avoid using resource area
stuefe
parents: 46630
diff changeset
    39
#include "logging/logStream.hpp"
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6983
diff changeset
    40
#include "memory/iterator.hpp"
37248
11a660dbbb8e 8132524: Missing includes to resourceArea.hpp
jprovino
parents: 37243
diff changeset
    41
#include "memory/resourceArea.hpp"
49592
77fb0be7d19f 8199946: Move load/store and encode/decode out of oopDesc
stefank
parents: 49323
diff changeset
    42
#include "oops/access.inline.hpp"
77fb0be7d19f 8199946: Move load/store and encode/decode out of oopDesc
stefank
parents: 49323
diff changeset
    43
#include "oops/compressedOops.inline.hpp"
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6983
diff changeset
    44
#include "oops/oop.inline.hpp"
40655
9f644073d3a0 8157907: Incorrect inclusion of atomic.hpp instead of atomic.inline.hpp
dholmes
parents: 39979
diff changeset
    45
#include "runtime/atomic.hpp"
24351
61b33cc6d3cf 8042195: Introduce umbrella header orderAccess.inline.hpp.
goetz
parents: 23538
diff changeset
    46
#include "runtime/orderAccess.inline.hpp"
47885
5caa1d5f74c1 8186571: Implementation: JEP 307: Parallel Full GC for G1
sjohanss
parents: 47216
diff changeset
    47
#include "utilities/growableArray.hpp"
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    48
10677
370a8da2d63f 7095194: G1: HeapRegion::GrainBytes, GrainWords, and CardsPerRegion should be size_t
johnc
parents: 10674
diff changeset
    49
int    HeapRegion::LogOfHRGrainBytes = 0;
370a8da2d63f 7095194: G1: HeapRegion::GrainBytes, GrainWords, and CardsPerRegion should be size_t
johnc
parents: 10674
diff changeset
    50
int    HeapRegion::LogOfHRGrainWords = 0;
370a8da2d63f 7095194: G1: HeapRegion::GrainBytes, GrainWords, and CardsPerRegion should be size_t
johnc
parents: 10674
diff changeset
    51
size_t HeapRegion::GrainBytes        = 0;
370a8da2d63f 7095194: G1: HeapRegion::GrainBytes, GrainWords, and CardsPerRegion should be size_t
johnc
parents: 10674
diff changeset
    52
size_t HeapRegion::GrainWords        = 0;
370a8da2d63f 7095194: G1: HeapRegion::GrainBytes, GrainWords, and CardsPerRegion should be size_t
johnc
parents: 10674
diff changeset
    53
size_t HeapRegion::CardsPerRegion    = 0;
3697
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3283
diff changeset
    54
19986
33d188c66ed9 8010722: assert: failed: heap size is too big for compressed oops
tschatzl
parents: 19728
diff changeset
    55
size_t HeapRegion::max_region_size() {
26840
f3c7613a7bbb 8057710: Refactor G1 heap region default sizes
sjohanss
parents: 26839
diff changeset
    56
  return HeapRegionBounds::max_size();
19986
33d188c66ed9 8010722: assert: failed: heap size is too big for compressed oops
tschatzl
parents: 19728
diff changeset
    57
}
33d188c66ed9 8010722: assert: failed: heap size is too big for compressed oops
tschatzl
parents: 19728
diff changeset
    58
31346
a70d45c06136 8042668: GC Support for shared heap ranges in CDS
jiangli
parents: 31331
diff changeset
    59
size_t HeapRegion::min_region_size_in_words() {
a70d45c06136 8042668: GC Support for shared heap ranges in CDS
jiangli
parents: 31331
diff changeset
    60
  return HeapRegionBounds::min_size() >> LogHeapWordSize;
a70d45c06136 8042668: GC Support for shared heap ranges in CDS
jiangli
parents: 31331
diff changeset
    61
}
a70d45c06136 8042668: GC Support for shared heap ranges in CDS
jiangli
parents: 31331
diff changeset
    62
19728
9e1556506d2d 8019902: G1: Use the average heap size rather than the minimum heap size to calculate the region size
brutisso
parents: 19339
diff changeset
    63
void HeapRegion::setup_heap_region_size(size_t initial_heap_size, size_t max_heap_size) {
29697
92501504191b 8074459: Flags handling memory sizes should be of type size_t
jwilhelm
parents: 29681
diff changeset
    64
  size_t region_size = G1HeapRegionSize;
3697
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3283
diff changeset
    65
  if (FLAG_IS_DEFAULT(G1HeapRegionSize)) {
19728
9e1556506d2d 8019902: G1: Use the average heap size rather than the minimum heap size to calculate the region size
brutisso
parents: 19339
diff changeset
    66
    size_t average_heap_size = (initial_heap_size + max_heap_size) / 2;
26840
f3c7613a7bbb 8057710: Refactor G1 heap region default sizes
sjohanss
parents: 26839
diff changeset
    67
    region_size = MAX2(average_heap_size / HeapRegionBounds::target_number(),
29697
92501504191b 8074459: Flags handling memory sizes should be of type size_t
jwilhelm
parents: 29681
diff changeset
    68
                       HeapRegionBounds::min_size());
3697
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3283
diff changeset
    69
  }
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3283
diff changeset
    70
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3283
diff changeset
    71
  int region_size_log = log2_long((jlong) region_size);
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3283
diff changeset
    72
  // Recalculate the region size to make sure it's a power of
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3283
diff changeset
    73
  // 2. This means that region_size is the largest power of 2 that's
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3283
diff changeset
    74
  // <= what we've calculated so far.
29697
92501504191b 8074459: Flags handling memory sizes should be of type size_t
jwilhelm
parents: 29681
diff changeset
    75
  region_size = ((size_t)1 << region_size_log);
3697
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3283
diff changeset
    76
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3283
diff changeset
    77
  // Now make sure that we don't go over or under our limits.
26840
f3c7613a7bbb 8057710: Refactor G1 heap region default sizes
sjohanss
parents: 26839
diff changeset
    78
  if (region_size < HeapRegionBounds::min_size()) {
f3c7613a7bbb 8057710: Refactor G1 heap region default sizes
sjohanss
parents: 26839
diff changeset
    79
    region_size = HeapRegionBounds::min_size();
f3c7613a7bbb 8057710: Refactor G1 heap region default sizes
sjohanss
parents: 26839
diff changeset
    80
  } else if (region_size > HeapRegionBounds::max_size()) {
f3c7613a7bbb 8057710: Refactor G1 heap region default sizes
sjohanss
parents: 26839
diff changeset
    81
    region_size = HeapRegionBounds::max_size();
3697
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3283
diff changeset
    82
  }
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3283
diff changeset
    83
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3283
diff changeset
    84
  // And recalculate the log.
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3283
diff changeset
    85
  region_size_log = log2_long((jlong) region_size);
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3283
diff changeset
    86
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3283
diff changeset
    87
  // Now, set up the globals.
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3283
diff changeset
    88
  guarantee(LogOfHRGrainBytes == 0, "we should only set it once");
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3283
diff changeset
    89
  LogOfHRGrainBytes = region_size_log;
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3283
diff changeset
    90
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3283
diff changeset
    91
  guarantee(LogOfHRGrainWords == 0, "we should only set it once");
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3283
diff changeset
    92
  LogOfHRGrainWords = LogOfHRGrainBytes - LogHeapWordSize;
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3283
diff changeset
    93
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3283
diff changeset
    94
  guarantee(GrainBytes == 0, "we should only set it once");
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3283
diff changeset
    95
  // The cast to int is safe, given that we've bounded region_size by
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3283
diff changeset
    96
  // MIN_REGION_SIZE and MAX_REGION_SIZE.
29697
92501504191b 8074459: Flags handling memory sizes should be of type size_t
jwilhelm
parents: 29681
diff changeset
    97
  GrainBytes = region_size;
35908
cb12f847b199 8148733: G1: Add log message to print the heap region size
brutisso
parents: 35507
diff changeset
    98
  log_info(gc, heap)("Heap region size: " SIZE_FORMAT "M", GrainBytes / M);
3697
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3283
diff changeset
    99
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3283
diff changeset
   100
  guarantee(GrainWords == 0, "we should only set it once");
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3283
diff changeset
   101
  GrainWords = GrainBytes >> LogHeapWordSize;
12381
1438e0fbfa27 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 12379
diff changeset
   102
  guarantee((size_t) 1 << LogOfHRGrainWords == GrainWords, "sanity");
3697
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3283
diff changeset
   103
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3283
diff changeset
   104
  guarantee(CardsPerRegion == 0, "we should only set it once");
49164
7e958a8ebcd3 8195142: Refactor out card table from CardTableModRefBS to flatten the BarrierSet hierarchy
eosterlund
parents: 47885
diff changeset
   105
  CardsPerRegion = GrainBytes >> G1CardTable::card_shift;
38011
74a6871d896b 8154452: Deferred cleanups after split of G1CollectorPolicy code
mgerdin
parents: 37989
diff changeset
   106
74a6871d896b 8154452: Deferred cleanups after split of G1CollectorPolicy code
mgerdin
parents: 37989
diff changeset
   107
  if (G1HeapRegionSize != GrainBytes) {
74a6871d896b 8154452: Deferred cleanups after split of G1CollectorPolicy code
mgerdin
parents: 37989
diff changeset
   108
    FLAG_SET_ERGO(size_t, G1HeapRegionSize, GrainBytes);
74a6871d896b 8154452: Deferred cleanups after split of G1CollectorPolicy code
mgerdin
parents: 37989
diff changeset
   109
  }
3697
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3283
diff changeset
   110
}
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3283
diff changeset
   111
39979
b17e445924da 8034842: Parallelize the Free CSet phase in G1
tschatzl
parents: 39698
diff changeset
   112
void HeapRegion::hr_clear(bool keep_remset, bool clear_space, bool locked) {
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7904
diff changeset
   113
  assert(_humongous_start_region == NULL,
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7904
diff changeset
   114
         "we should have already filtered out humongous regions");
29470
e34bbcd36e53 8030646: track collection set membership in one place
ehelin
parents: 29325
diff changeset
   115
  assert(!in_collection_set(),
33105
294e48b4f704 8080775: Better argument formatting for assert() and friends
david
parents: 32606
diff changeset
   116
         "Should not clear heap region %u in the collection set", hrm_index());
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   117
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   118
  set_young_index_in_cset(-1);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   119
  uninstall_surv_rate_group();
26696
623a25e6c686 8057768: Make heap region region type in G1 HeapRegion explicit
tonyp
parents: 26571
diff changeset
   120
  set_free();
8928
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 7923
diff changeset
   121
  reset_pre_dummy_top();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   122
39979
b17e445924da 8034842: Parallelize the Free CSet phase in G1
tschatzl
parents: 39698
diff changeset
   123
  if (!keep_remset) {
23453
09cfb0164acf 8027295: Free CSet takes ~50% of young pause time
tschatzl
parents: 23451
diff changeset
   124
    if (locked) {
39979
b17e445924da 8034842: Parallelize the Free CSet phase in G1
tschatzl
parents: 39698
diff changeset
   125
      rem_set()->clear_locked();
23453
09cfb0164acf 8027295: Free CSet takes ~50% of young pause time
tschatzl
parents: 23451
diff changeset
   126
    } else {
39979
b17e445924da 8034842: Parallelize the Free CSet phase in G1
tschatzl
parents: 39698
diff changeset
   127
      rem_set()->clear();
23453
09cfb0164acf 8027295: Free CSet takes ~50% of young pause time
tschatzl
parents: 23451
diff changeset
   128
    }
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   129
  }
39979
b17e445924da 8034842: Parallelize the Free CSet phase in G1
tschatzl
parents: 39698
diff changeset
   130
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   131
  zero_marked_bytes();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   132
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   133
  init_top_at_mark_start();
37989
e0a0f4de45c4 8153170: Card Live Data does not correctly handle eager reclaim
tschatzl
parents: 37985
diff changeset
   134
  _gc_time_stamp = G1CollectedHeap::heap()->get_gc_time_stamp();
1388
tonyp
parents: 1387
diff changeset
   135
  if (clear_space) clear(SpaceDecorator::Mangle);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   136
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   137
9418
32a87dd6b746 7035144: G1: nightly failure: Non-dirty cards in region that should be dirty (failures still exist...)
tonyp
parents: 8928
diff changeset
   138
void HeapRegion::par_clear() {
32a87dd6b746 7035144: G1: nightly failure: Non-dirty cards in region that should be dirty (failures still exist...)
tonyp
parents: 8928
diff changeset
   139
  assert(used() == 0, "the region should have been already cleared");
10677
370a8da2d63f 7095194: G1: HeapRegion::GrainBytes, GrainWords, and CardsPerRegion should be size_t
johnc
parents: 10674
diff changeset
   140
  assert(capacity() == HeapRegion::GrainBytes, "should be back to normal");
9418
32a87dd6b746 7035144: G1: nightly failure: Non-dirty cards in region that should be dirty (failures still exist...)
tonyp
parents: 8928
diff changeset
   141
  HeapRegionRemSet* hrrs = rem_set();
32a87dd6b746 7035144: G1: nightly failure: Non-dirty cards in region that should be dirty (failures still exist...)
tonyp
parents: 8928
diff changeset
   142
  hrrs->clear();
49164
7e958a8ebcd3 8195142: Refactor out card table from CardTableModRefBS to flatten the BarrierSet hierarchy
eosterlund
parents: 47885
diff changeset
   143
  G1CardTable* ct = G1CollectedHeap::heap()->card_table();
7e958a8ebcd3 8195142: Refactor out card table from CardTableModRefBS to flatten the BarrierSet hierarchy
eosterlund
parents: 47885
diff changeset
   144
  ct->clear(MemRegion(bottom(), end()));
9418
32a87dd6b746 7035144: G1: nightly failure: Non-dirty cards in region that should be dirty (failures still exist...)
tonyp
parents: 8928
diff changeset
   145
}
32a87dd6b746 7035144: G1: nightly failure: Non-dirty cards in region that should be dirty (failures still exist...)
tonyp
parents: 8928
diff changeset
   146
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   147
void HeapRegion::calc_gc_efficiency() {
13482
c6b6960549f1 7185699: G1: Prediction model discrepancies
johnc
parents: 13336
diff changeset
   148
  // GC efficiency is the ratio of how much space would be
c6b6960549f1 7185699: G1: Prediction model discrepancies
johnc
parents: 13336
diff changeset
   149
  // reclaimed over how long we predict it would take to reclaim it.
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   150
  G1CollectedHeap* g1h = G1CollectedHeap::heap();
37985
539c597ee0fa 8154154: Separate G1 specific policy code from the CollectorPolicy class hierarchy
mgerdin
parents: 37248
diff changeset
   151
  G1Policy* g1p = g1h->g1_policy();
13482
c6b6960549f1 7185699: G1: Prediction model discrepancies
johnc
parents: 13336
diff changeset
   152
c6b6960549f1 7185699: G1: Prediction model discrepancies
johnc
parents: 13336
diff changeset
   153
  // Retrieve a prediction of the elapsed time for this region for
c6b6960549f1 7185699: G1: Prediction model discrepancies
johnc
parents: 13336
diff changeset
   154
  // a mixed gc because the region will only be evacuated during a
c6b6960549f1 7185699: G1: Prediction model discrepancies
johnc
parents: 13336
diff changeset
   155
  // mixed gc.
c6b6960549f1 7185699: G1: Prediction model discrepancies
johnc
parents: 13336
diff changeset
   156
  double region_elapsed_time_ms =
c6b6960549f1 7185699: G1: Prediction model discrepancies
johnc
parents: 13336
diff changeset
   157
    g1p->predict_region_elapsed_time_ms(this, false /* for_young_gc */);
c6b6960549f1 7185699: G1: Prediction model discrepancies
johnc
parents: 13336
diff changeset
   158
  _gc_efficiency = (double) reclaimable_bytes() / region_elapsed_time_ms;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   159
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   160
36098
e056a98ac7ca 8149650: Create a trace event for G1 heap region type transitions
david
parents: 36091
diff changeset
   161
void HeapRegion::set_free() {
e056a98ac7ca 8149650: Create a trace event for G1 heap region type transitions
david
parents: 36091
diff changeset
   162
  report_region_type_change(G1HeapRegionTraceType::Free);
e056a98ac7ca 8149650: Create a trace event for G1 heap region type transitions
david
parents: 36091
diff changeset
   163
  _type.set_free();
e056a98ac7ca 8149650: Create a trace event for G1 heap region type transitions
david
parents: 36091
diff changeset
   164
}
e056a98ac7ca 8149650: Create a trace event for G1 heap region type transitions
david
parents: 36091
diff changeset
   165
e056a98ac7ca 8149650: Create a trace event for G1 heap region type transitions
david
parents: 36091
diff changeset
   166
void HeapRegion::set_eden() {
e056a98ac7ca 8149650: Create a trace event for G1 heap region type transitions
david
parents: 36091
diff changeset
   167
  report_region_type_change(G1HeapRegionTraceType::Eden);
e056a98ac7ca 8149650: Create a trace event for G1 heap region type transitions
david
parents: 36091
diff changeset
   168
  _type.set_eden();
e056a98ac7ca 8149650: Create a trace event for G1 heap region type transitions
david
parents: 36091
diff changeset
   169
}
e056a98ac7ca 8149650: Create a trace event for G1 heap region type transitions
david
parents: 36091
diff changeset
   170
e056a98ac7ca 8149650: Create a trace event for G1 heap region type transitions
david
parents: 36091
diff changeset
   171
void HeapRegion::set_eden_pre_gc() {
e056a98ac7ca 8149650: Create a trace event for G1 heap region type transitions
david
parents: 36091
diff changeset
   172
  report_region_type_change(G1HeapRegionTraceType::Eden);
e056a98ac7ca 8149650: Create a trace event for G1 heap region type transitions
david
parents: 36091
diff changeset
   173
  _type.set_eden_pre_gc();
e056a98ac7ca 8149650: Create a trace event for G1 heap region type transitions
david
parents: 36091
diff changeset
   174
}
e056a98ac7ca 8149650: Create a trace event for G1 heap region type transitions
david
parents: 36091
diff changeset
   175
e056a98ac7ca 8149650: Create a trace event for G1 heap region type transitions
david
parents: 36091
diff changeset
   176
void HeapRegion::set_survivor() {
e056a98ac7ca 8149650: Create a trace event for G1 heap region type transitions
david
parents: 36091
diff changeset
   177
  report_region_type_change(G1HeapRegionTraceType::Survivor);
e056a98ac7ca 8149650: Create a trace event for G1 heap region type transitions
david
parents: 36091
diff changeset
   178
  _type.set_survivor();
e056a98ac7ca 8149650: Create a trace event for G1 heap region type transitions
david
parents: 36091
diff changeset
   179
}
e056a98ac7ca 8149650: Create a trace event for G1 heap region type transitions
david
parents: 36091
diff changeset
   180
46810
7dad333205cd 8179302: Pre-resolve constant pool string entries and cache resolved_reference arrays in CDS archive.
jiangli
parents: 46701
diff changeset
   181
void HeapRegion::move_to_old() {
7dad333205cd 8179302: Pre-resolve constant pool string entries and cache resolved_reference arrays in CDS archive.
jiangli
parents: 46701
diff changeset
   182
  if (_type.relabel_as_old()) {
7dad333205cd 8179302: Pre-resolve constant pool string entries and cache resolved_reference arrays in CDS archive.
jiangli
parents: 46701
diff changeset
   183
    report_region_type_change(G1HeapRegionTraceType::Old);
7dad333205cd 8179302: Pre-resolve constant pool string entries and cache resolved_reference arrays in CDS archive.
jiangli
parents: 46701
diff changeset
   184
  }
7dad333205cd 8179302: Pre-resolve constant pool string entries and cache resolved_reference arrays in CDS archive.
jiangli
parents: 46701
diff changeset
   185
}
7dad333205cd 8179302: Pre-resolve constant pool string entries and cache resolved_reference arrays in CDS archive.
jiangli
parents: 46701
diff changeset
   186
36098
e056a98ac7ca 8149650: Create a trace event for G1 heap region type transitions
david
parents: 36091
diff changeset
   187
void HeapRegion::set_old() {
e056a98ac7ca 8149650: Create a trace event for G1 heap region type transitions
david
parents: 36091
diff changeset
   188
  report_region_type_change(G1HeapRegionTraceType::Old);
e056a98ac7ca 8149650: Create a trace event for G1 heap region type transitions
david
parents: 36091
diff changeset
   189
  _type.set_old();
e056a98ac7ca 8149650: Create a trace event for G1 heap region type transitions
david
parents: 36091
diff changeset
   190
}
e056a98ac7ca 8149650: Create a trace event for G1 heap region type transitions
david
parents: 36091
diff changeset
   191
46810
7dad333205cd 8179302: Pre-resolve constant pool string entries and cache resolved_reference arrays in CDS archive.
jiangli
parents: 46701
diff changeset
   192
void HeapRegion::set_open_archive() {
7dad333205cd 8179302: Pre-resolve constant pool string entries and cache resolved_reference arrays in CDS archive.
jiangli
parents: 46701
diff changeset
   193
  report_region_type_change(G1HeapRegionTraceType::OpenArchive);
7dad333205cd 8179302: Pre-resolve constant pool string entries and cache resolved_reference arrays in CDS archive.
jiangli
parents: 46701
diff changeset
   194
  _type.set_open_archive();
7dad333205cd 8179302: Pre-resolve constant pool string entries and cache resolved_reference arrays in CDS archive.
jiangli
parents: 46701
diff changeset
   195
}
7dad333205cd 8179302: Pre-resolve constant pool string entries and cache resolved_reference arrays in CDS archive.
jiangli
parents: 46701
diff changeset
   196
7dad333205cd 8179302: Pre-resolve constant pool string entries and cache resolved_reference arrays in CDS archive.
jiangli
parents: 46701
diff changeset
   197
void HeapRegion::set_closed_archive() {
7dad333205cd 8179302: Pre-resolve constant pool string entries and cache resolved_reference arrays in CDS archive.
jiangli
parents: 46701
diff changeset
   198
  report_region_type_change(G1HeapRegionTraceType::ClosedArchive);
7dad333205cd 8179302: Pre-resolve constant pool string entries and cache resolved_reference arrays in CDS archive.
jiangli
parents: 46701
diff changeset
   199
  _type.set_closed_archive();
36098
e056a98ac7ca 8149650: Create a trace event for G1 heap region type transitions
david
parents: 36091
diff changeset
   200
}
e056a98ac7ca 8149650: Create a trace event for G1 heap region type transitions
david
parents: 36091
diff changeset
   201
34249
a015a11067a2 8138681: Runtime.getFreeMemory() reports wrong value after humongous allocation.
david
parents: 33786
diff changeset
   202
void HeapRegion::set_starts_humongous(HeapWord* obj_top, size_t fill_size) {
26846
7d4376f8560e 8058495: G1: normalize names for isHumongous() and friends
tonyp
parents: 26840
diff changeset
   203
  assert(!is_humongous(), "sanity / pre-condition");
6983
a8c50cedbce9 6991377: G1: race between concurrent refinement and humongous object allocation
tonyp
parents: 6260
diff changeset
   204
  assert(top() == bottom(), "should be empty");
a8c50cedbce9 6991377: G1: race between concurrent refinement and humongous object allocation
tonyp
parents: 6260
diff changeset
   205
36098
e056a98ac7ca 8149650: Create a trace event for G1 heap region type transitions
david
parents: 36091
diff changeset
   206
  report_region_type_change(G1HeapRegionTraceType::StartsHumongous);
26696
623a25e6c686 8057768: Make heap region region type in G1 HeapRegion explicit
tonyp
parents: 26571
diff changeset
   207
  _type.set_starts_humongous();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   208
  _humongous_start_region = this;
6983
a8c50cedbce9 6991377: G1: race between concurrent refinement and humongous object allocation
tonyp
parents: 6260
diff changeset
   209
35461
1068dcb8d315 8146399: Refactor the BlockOffsetTable classes.
david
parents: 35210
diff changeset
   210
  _bot_part.set_for_starts_humongous(obj_top, fill_size);
6983
a8c50cedbce9 6991377: G1: race between concurrent refinement and humongous object allocation
tonyp
parents: 6260
diff changeset
   211
}
a8c50cedbce9 6991377: G1: race between concurrent refinement and humongous object allocation
tonyp
parents: 6260
diff changeset
   212
26846
7d4376f8560e 8058495: G1: normalize names for isHumongous() and friends
tonyp
parents: 26840
diff changeset
   213
void HeapRegion::set_continues_humongous(HeapRegion* first_hr) {
7d4376f8560e 8058495: G1: normalize names for isHumongous() and friends
tonyp
parents: 26840
diff changeset
   214
  assert(!is_humongous(), "sanity / pre-condition");
6983
a8c50cedbce9 6991377: G1: race between concurrent refinement and humongous object allocation
tonyp
parents: 6260
diff changeset
   215
  assert(top() == bottom(), "should be empty");
26846
7d4376f8560e 8058495: G1: normalize names for isHumongous() and friends
tonyp
parents: 26840
diff changeset
   216
  assert(first_hr->is_starts_humongous(), "pre-condition");
6983
a8c50cedbce9 6991377: G1: race between concurrent refinement and humongous object allocation
tonyp
parents: 6260
diff changeset
   217
36098
e056a98ac7ca 8149650: Create a trace event for G1 heap region type transitions
david
parents: 36091
diff changeset
   218
  report_region_type_change(G1HeapRegionTraceType::ContinuesHumongous);
26696
623a25e6c686 8057768: Make heap region region type in G1 HeapRegion explicit
tonyp
parents: 26571
diff changeset
   219
  _type.set_continues_humongous();
7904
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   220
  _humongous_start_region = first_hr;
46286
c112671e114e 8173764: G1 BOT wrongly assumes that objects must always begin at the start of G1BlockOffsetTablePart
sjohanss
parents: 46258
diff changeset
   221
c112671e114e 8173764: G1 BOT wrongly assumes that objects must always begin at the start of G1BlockOffsetTablePart
sjohanss
parents: 46258
diff changeset
   222
  _bot_part.set_object_can_span(true);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   223
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   224
26696
623a25e6c686 8057768: Make heap region region type in G1 HeapRegion explicit
tonyp
parents: 26571
diff changeset
   225
void HeapRegion::clear_humongous() {
26846
7d4376f8560e 8058495: G1: normalize names for isHumongous() and friends
tonyp
parents: 26840
diff changeset
   226
  assert(is_humongous(), "pre-condition");
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7904
diff changeset
   227
10677
370a8da2d63f 7095194: G1: HeapRegion::GrainBytes, GrainWords, and CardsPerRegion should be size_t
johnc
parents: 10674
diff changeset
   228
  assert(capacity() == HeapRegion::GrainBytes, "pre-condition");
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7904
diff changeset
   229
  _humongous_start_region = NULL;
46286
c112671e114e 8173764: G1 BOT wrongly assumes that objects must always begin at the start of G1BlockOffsetTablePart
sjohanss
parents: 46258
diff changeset
   230
c112671e114e 8173764: G1 BOT wrongly assumes that objects must always begin at the start of G1BlockOffsetTablePart
sjohanss
parents: 46258
diff changeset
   231
  _bot_part.set_object_can_span(false);
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7904
diff changeset
   232
}
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7904
diff changeset
   233
26316
93f6b40c038b 8054819: Rename HeapRegionSeq to HeapRegionManager
tschatzl
parents: 26157
diff changeset
   234
HeapRegion::HeapRegion(uint hrm_index,
35461
1068dcb8d315 8146399: Refactor the BlockOffsetTable classes.
david
parents: 35210
diff changeset
   235
                       G1BlockOffsetTable* bot,
26839
021bfc544c6f 8057658: Enable G1 FullGC extensions
sjohanss
parents: 26837
diff changeset
   236
                       MemRegion mr) :
35461
1068dcb8d315 8146399: Refactor the BlockOffsetTable classes.
david
parents: 35210
diff changeset
   237
    G1ContiguousSpace(bot),
26839
021bfc544c6f 8057658: Enable G1 FullGC extensions
sjohanss
parents: 26837
diff changeset
   238
    _hrm_index(hrm_index),
26696
623a25e6c686 8057768: Make heap region region type in G1 HeapRegion explicit
tonyp
parents: 26571
diff changeset
   239
    _humongous_start_region(NULL),
27009
e7e723732b6b 8058298: Separate heap region iterator claim values from the data structures iterated over
mlarsson
parents: 26846
diff changeset
   240
    _evacuation_failed(false),
12382
6aaecb1cbfe1 7145441: G1: collection set chooser-related cleanup
tonyp
parents: 12381
diff changeset
   241
    _prev_marked_bytes(0), _next_marked_bytes(0), _gc_efficiency(0.0),
38154
4c30333c304e 8153507: Improve Card Table Clear Task
tschatzl
parents: 38011
diff changeset
   242
    _next(NULL), _prev(NULL),
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7904
diff changeset
   243
#ifdef ASSERT
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7904
diff changeset
   244
    _containing_set(NULL),
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7904
diff changeset
   245
#endif // ASSERT
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7904
diff changeset
   246
     _young_index_in_cset(-1), _surv_rate_group(NULL), _age_index(-1),
46258
d26ebd7e2f10 8142749: HeapRegion::_predicted_bytes_to_copy is unused and can be removed
fzhinkin
parents: 42650
diff changeset
   247
    _rem_set(NULL), _recorded_rs_length(0), _predicted_elapsed_time_ms(0)
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   248
{
35461
1068dcb8d315 8146399: Refactor the BlockOffsetTable classes.
david
parents: 35210
diff changeset
   249
  _rem_set = new HeapRegionRemSet(bot, this);
26157
70eddb655686 8054818: Refactor HeapRegionSeq to manage heap region and auxiliary data
tschatzl
parents: 25730
diff changeset
   250
70eddb655686 8054818: Refactor HeapRegionSeq to manage heap region and auxiliary data
tschatzl
parents: 25730
diff changeset
   251
  initialize(mr);
70eddb655686 8054818: Refactor HeapRegionSeq to manage heap region and auxiliary data
tschatzl
parents: 25730
diff changeset
   252
}
70eddb655686 8054818: Refactor HeapRegionSeq to manage heap region and auxiliary data
tschatzl
parents: 25730
diff changeset
   253
70eddb655686 8054818: Refactor HeapRegionSeq to manage heap region and auxiliary data
tschatzl
parents: 25730
diff changeset
   254
void HeapRegion::initialize(MemRegion mr, bool clear_space, bool mangle_space) {
70eddb655686 8054818: Refactor HeapRegionSeq to manage heap region and auxiliary data
tschatzl
parents: 25730
diff changeset
   255
  assert(_rem_set->is_empty(), "Remembered set must be empty");
70eddb655686 8054818: Refactor HeapRegionSeq to manage heap region and auxiliary data
tschatzl
parents: 25730
diff changeset
   256
35461
1068dcb8d315 8146399: Refactor the BlockOffsetTable classes.
david
parents: 35210
diff changeset
   257
  G1ContiguousSpace::initialize(mr, clear_space, mangle_space);
26157
70eddb655686 8054818: Refactor HeapRegionSeq to manage heap region and auxiliary data
tschatzl
parents: 25730
diff changeset
   258
13756
3b72f3da8cd4 7016955: G1: remove the is_zeroed parameter from the HeapRegion constructor
johnc
parents: 13728
diff changeset
   259
  hr_clear(false /*par*/, false /*clear_space*/);
1388
tonyp
parents: 1387
diff changeset
   260
  set_top(bottom());
27889
7d50f95e0076 8065358: Refactor G1s usage of save_marks and reduce related races
mgerdin
parents: 27681
diff changeset
   261
  record_timestamp();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   262
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   263
36098
e056a98ac7ca 8149650: Create a trace event for G1 heap region type transitions
david
parents: 36091
diff changeset
   264
void HeapRegion::report_region_type_change(G1HeapRegionTraceType::Type to) {
e056a98ac7ca 8149650: Create a trace event for G1 heap region type transitions
david
parents: 36091
diff changeset
   265
  HeapRegionTracer::send_region_type_change(_hrm_index,
e056a98ac7ca 8149650: Create a trace event for G1 heap region type transitions
david
parents: 36091
diff changeset
   266
                                            get_trace_type(),
e056a98ac7ca 8149650: Create a trace event for G1 heap region type transitions
david
parents: 36091
diff changeset
   267
                                            to,
e056a98ac7ca 8149650: Create a trace event for G1 heap region type transitions
david
parents: 36091
diff changeset
   268
                                            (uintptr_t)bottom(),
49323
565336327354 8198424: Remove G1AllocationContext
sjohanss
parents: 49164
diff changeset
   269
                                            used());
36098
e056a98ac7ca 8149650: Create a trace event for G1 heap region type transitions
david
parents: 36091
diff changeset
   270
}
e056a98ac7ca 8149650: Create a trace event for G1 heap region type transitions
david
parents: 36091
diff changeset
   271
11455
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11393
diff changeset
   272
void HeapRegion::note_self_forwarding_removal_start(bool during_initial_mark,
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11393
diff changeset
   273
                                                    bool during_conc_mark) {
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11393
diff changeset
   274
  // We always recreate the prev marking info and we'll explicitly
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11393
diff changeset
   275
  // mark all objects we find to be self-forwarded on the prev
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11393
diff changeset
   276
  // bitmap. So all objects need to be below PTAMS.
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11393
diff changeset
   277
  _prev_marked_bytes = 0;
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11393
diff changeset
   278
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11393
diff changeset
   279
  if (during_initial_mark) {
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11393
diff changeset
   280
    // During initial-mark, we'll also explicitly mark all objects
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11393
diff changeset
   281
    // we find to be self-forwarded on the next bitmap. So all
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11393
diff changeset
   282
    // objects need to be below NTAMS.
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11393
diff changeset
   283
    _next_top_at_mark_start = top();
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11393
diff changeset
   284
    _next_marked_bytes = 0;
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11393
diff changeset
   285
  } else if (during_conc_mark) {
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11393
diff changeset
   286
    // During concurrent mark, all objects in the CSet (including
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11393
diff changeset
   287
    // the ones we find to be self-forwarded) are implicitly live.
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11393
diff changeset
   288
    // So all objects need to be above NTAMS.
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11393
diff changeset
   289
    _next_top_at_mark_start = bottom();
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11393
diff changeset
   290
    _next_marked_bytes = 0;
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11393
diff changeset
   291
  }
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11393
diff changeset
   292
}
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11393
diff changeset
   293
46258
d26ebd7e2f10 8142749: HeapRegion::_predicted_bytes_to_copy is unused and can be removed
fzhinkin
parents: 42650
diff changeset
   294
void HeapRegion::note_self_forwarding_removal_end(size_t marked_bytes) {
29580
a67a581cfe11 8073315: Enable gcc -Wtype-limits and fix upcoming issues.
goetz
parents: 29470
diff changeset
   295
  assert(marked_bytes <= used(),
33105
294e48b4f704 8080775: Better argument formatting for assert() and friends
david
parents: 32606
diff changeset
   296
         "marked: " SIZE_FORMAT " used: " SIZE_FORMAT, marked_bytes, used());
25492
d27050bdfb04 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 25491
diff changeset
   297
  _prev_top_at_mark_start = top();
11455
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11393
diff changeset
   298
  _prev_marked_bytes = marked_bytes;
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11393
diff changeset
   299
}
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11393
diff changeset
   300
19339
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18999
diff changeset
   301
// Code roots support
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18999
diff changeset
   302
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18999
diff changeset
   303
void HeapRegion::add_strong_code_root(nmethod* nm) {
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18999
diff changeset
   304
  HeapRegionRemSet* hrrs = rem_set();
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18999
diff changeset
   305
  hrrs->add_strong_code_root(nm);
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18999
diff changeset
   306
}
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18999
diff changeset
   307
26422
4ee5901e205e 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 26322
diff changeset
   308
void HeapRegion::add_strong_code_root_locked(nmethod* nm) {
4ee5901e205e 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 26322
diff changeset
   309
  assert_locked_or_safepoint(CodeCache_lock);
4ee5901e205e 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 26322
diff changeset
   310
  HeapRegionRemSet* hrrs = rem_set();
4ee5901e205e 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 26322
diff changeset
   311
  hrrs->add_strong_code_root_locked(nm);
4ee5901e205e 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 26322
diff changeset
   312
}
4ee5901e205e 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 26322
diff changeset
   313
19339
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18999
diff changeset
   314
void HeapRegion::remove_strong_code_root(nmethod* nm) {
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18999
diff changeset
   315
  HeapRegionRemSet* hrrs = rem_set();
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18999
diff changeset
   316
  hrrs->remove_strong_code_root(nm);
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18999
diff changeset
   317
}
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18999
diff changeset
   318
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18999
diff changeset
   319
void HeapRegion::strong_code_roots_do(CodeBlobClosure* blk) const {
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18999
diff changeset
   320
  HeapRegionRemSet* hrrs = rem_set();
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18999
diff changeset
   321
  hrrs->strong_code_roots_do(blk);
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18999
diff changeset
   322
}
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18999
diff changeset
   323
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18999
diff changeset
   324
class VerifyStrongCodeRootOopClosure: public OopClosure {
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18999
diff changeset
   325
  const HeapRegion* _hr;
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18999
diff changeset
   326
  bool _failures;
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18999
diff changeset
   327
  bool _has_oops_in_region;
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18999
diff changeset
   328
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18999
diff changeset
   329
  template <class T> void do_oop_work(T* p) {
49592
77fb0be7d19f 8199946: Move load/store and encode/decode out of oopDesc
stefank
parents: 49323
diff changeset
   330
    T heap_oop = RawAccess<>::oop_load(p);
77fb0be7d19f 8199946: Move load/store and encode/decode out of oopDesc
stefank
parents: 49323
diff changeset
   331
    if (!CompressedOops::is_null(heap_oop)) {
77fb0be7d19f 8199946: Move load/store and encode/decode out of oopDesc
stefank
parents: 49323
diff changeset
   332
      oop obj = CompressedOops::decode_not_null(heap_oop);
19339
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18999
diff changeset
   333
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18999
diff changeset
   334
      // Note: not all the oops embedded in the nmethod are in the
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18999
diff changeset
   335
      // current region. We only look at those which are.
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18999
diff changeset
   336
      if (_hr->is_in(obj)) {
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18999
diff changeset
   337
        // Object is in the region. Check that its less than top
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18999
diff changeset
   338
        if (_hr->top() <= (HeapWord*)obj) {
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18999
diff changeset
   339
          // Object is above top
36090
cffc1dd98258 8149541: Use log_error() instead of log_info() when verification reports a problem
brutisso
parents: 35908
diff changeset
   340
          log_error(gc, verify)("Object " PTR_FORMAT " in region [" PTR_FORMAT ", " PTR_FORMAT ") is above top " PTR_FORMAT,
35061
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34671
diff changeset
   341
                               p2i(obj), p2i(_hr->bottom()), p2i(_hr->end()), p2i(_hr->top()));
19339
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18999
diff changeset
   342
          _failures = true;
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18999
diff changeset
   343
          return;
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18999
diff changeset
   344
        }
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18999
diff changeset
   345
        // Nmethod has at least one oop in the current region
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18999
diff changeset
   346
        _has_oops_in_region = true;
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18999
diff changeset
   347
      }
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18999
diff changeset
   348
    }
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18999
diff changeset
   349
  }
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18999
diff changeset
   350
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18999
diff changeset
   351
public:
46258
d26ebd7e2f10 8142749: HeapRegion::_predicted_bytes_to_copy is unused and can be removed
fzhinkin
parents: 42650
diff changeset
   352
  VerifyStrongCodeRootOopClosure(const HeapRegion* hr):
19339
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18999
diff changeset
   353
    _hr(hr), _failures(false), _has_oops_in_region(false) {}
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18999
diff changeset
   354
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18999
diff changeset
   355
  void do_oop(narrowOop* p) { do_oop_work(p); }
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18999
diff changeset
   356
  void do_oop(oop* p)       { do_oop_work(p); }
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18999
diff changeset
   357
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18999
diff changeset
   358
  bool failures()           { return _failures; }
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18999
diff changeset
   359
  bool has_oops_in_region() { return _has_oops_in_region; }
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18999
diff changeset
   360
};
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18999
diff changeset
   361
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18999
diff changeset
   362
class VerifyStrongCodeRootCodeBlobClosure: public CodeBlobClosure {
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18999
diff changeset
   363
  const HeapRegion* _hr;
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18999
diff changeset
   364
  bool _failures;
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18999
diff changeset
   365
public:
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18999
diff changeset
   366
  VerifyStrongCodeRootCodeBlobClosure(const HeapRegion* hr) :
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18999
diff changeset
   367
    _hr(hr), _failures(false) {}
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18999
diff changeset
   368
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18999
diff changeset
   369
  void do_code_blob(CodeBlob* cb) {
42650
1f304d0c888b 8171008: Integrate AOT compiler into JDK
kvn
parents: 42589
diff changeset
   370
    nmethod* nm = (cb == NULL) ? NULL : cb->as_compiled_method()->as_nmethod_or_null();
19339
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18999
diff changeset
   371
    if (nm != NULL) {
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18999
diff changeset
   372
      // Verify that the nemthod is live
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18999
diff changeset
   373
      if (!nm->is_alive()) {
36090
cffc1dd98258 8149541: Use log_error() instead of log_info() when verification reports a problem
brutisso
parents: 35908
diff changeset
   374
        log_error(gc, verify)("region [" PTR_FORMAT "," PTR_FORMAT "] has dead nmethod " PTR_FORMAT " in its strong code roots",
cffc1dd98258 8149541: Use log_error() instead of log_info() when verification reports a problem
brutisso
parents: 35908
diff changeset
   375
                              p2i(_hr->bottom()), p2i(_hr->end()), p2i(nm));
19339
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18999
diff changeset
   376
        _failures = true;
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18999
diff changeset
   377
      } else {
46258
d26ebd7e2f10 8142749: HeapRegion::_predicted_bytes_to_copy is unused and can be removed
fzhinkin
parents: 42650
diff changeset
   378
        VerifyStrongCodeRootOopClosure oop_cl(_hr);
19339
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18999
diff changeset
   379
        nm->oops_do(&oop_cl);
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18999
diff changeset
   380
        if (!oop_cl.has_oops_in_region()) {
36090
cffc1dd98258 8149541: Use log_error() instead of log_info() when verification reports a problem
brutisso
parents: 35908
diff changeset
   381
          log_error(gc, verify)("region [" PTR_FORMAT "," PTR_FORMAT "] has nmethod " PTR_FORMAT " in its strong code roots with no pointers into region",
cffc1dd98258 8149541: Use log_error() instead of log_info() when verification reports a problem
brutisso
parents: 35908
diff changeset
   382
                                p2i(_hr->bottom()), p2i(_hr->end()), p2i(nm));
19339
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18999
diff changeset
   383
          _failures = true;
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18999
diff changeset
   384
        } else if (oop_cl.failures()) {
36090
cffc1dd98258 8149541: Use log_error() instead of log_info() when verification reports a problem
brutisso
parents: 35908
diff changeset
   385
          log_error(gc, verify)("region [" PTR_FORMAT "," PTR_FORMAT "] has other failures for nmethod " PTR_FORMAT,
cffc1dd98258 8149541: Use log_error() instead of log_info() when verification reports a problem
brutisso
parents: 35908
diff changeset
   386
                                p2i(_hr->bottom()), p2i(_hr->end()), p2i(nm));
19339
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18999
diff changeset
   387
          _failures = true;
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18999
diff changeset
   388
        }
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18999
diff changeset
   389
      }
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18999
diff changeset
   390
    }
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18999
diff changeset
   391
  }
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18999
diff changeset
   392
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18999
diff changeset
   393
  bool failures()       { return _failures; }
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18999
diff changeset
   394
};
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18999
diff changeset
   395
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18999
diff changeset
   396
void HeapRegion::verify_strong_code_roots(VerifyOption vo, bool* failures) const {
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18999
diff changeset
   397
  if (!G1VerifyHeapRegionCodeRoots) {
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18999
diff changeset
   398
    // We're not verifying code roots.
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18999
diff changeset
   399
    return;
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18999
diff changeset
   400
  }
47885
5caa1d5f74c1 8186571: Implementation: JEP 307: Parallel Full GC for G1
sjohanss
parents: 47216
diff changeset
   401
  if (vo == VerifyOption_G1UseFullMarking) {
19339
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18999
diff changeset
   402
    // Marking verification during a full GC is performed after class
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18999
diff changeset
   403
    // unloading, code cache unloading, etc so the strong code roots
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18999
diff changeset
   404
    // attached to each heap region are in an inconsistent state. They won't
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18999
diff changeset
   405
    // be consistent until the strong code roots are rebuilt after the
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18999
diff changeset
   406
    // actual GC. Skip verifying the strong code roots in this particular
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18999
diff changeset
   407
    // time.
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18999
diff changeset
   408
    assert(VerifyDuringGC, "only way to get here");
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18999
diff changeset
   409
    return;
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18999
diff changeset
   410
  }
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18999
diff changeset
   411
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18999
diff changeset
   412
  HeapRegionRemSet* hrrs = rem_set();
23451
ed2b8bb28fed 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents: 22551
diff changeset
   413
  size_t strong_code_roots_length = hrrs->strong_code_roots_list_length();
19339
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18999
diff changeset
   414
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18999
diff changeset
   415
  // if this region is empty then there should be no entries
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18999
diff changeset
   416
  // on its strong code root list
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18999
diff changeset
   417
  if (is_empty()) {
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18999
diff changeset
   418
    if (strong_code_roots_length > 0) {
36090
cffc1dd98258 8149541: Use log_error() instead of log_info() when verification reports a problem
brutisso
parents: 35908
diff changeset
   419
      log_error(gc, verify)("region [" PTR_FORMAT "," PTR_FORMAT "] is empty but has " SIZE_FORMAT " code root entries",
cffc1dd98258 8149541: Use log_error() instead of log_info() when verification reports a problem
brutisso
parents: 35908
diff changeset
   420
                            p2i(bottom()), p2i(end()), strong_code_roots_length);
19339
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18999
diff changeset
   421
      *failures = true;
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18999
diff changeset
   422
    }
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18999
diff changeset
   423
    return;
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18999
diff changeset
   424
  }
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18999
diff changeset
   425
26846
7d4376f8560e 8058495: G1: normalize names for isHumongous() and friends
tonyp
parents: 26840
diff changeset
   426
  if (is_continues_humongous()) {
19339
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18999
diff changeset
   427
    if (strong_code_roots_length > 0) {
36090
cffc1dd98258 8149541: Use log_error() instead of log_info() when verification reports a problem
brutisso
parents: 35908
diff changeset
   428
      log_error(gc, verify)("region " HR_FORMAT " is a continuation of a humongous region but has " SIZE_FORMAT " code root entries",
cffc1dd98258 8149541: Use log_error() instead of log_info() when verification reports a problem
brutisso
parents: 35908
diff changeset
   429
                            HR_FORMAT_PARAMS(this), strong_code_roots_length);
19339
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18999
diff changeset
   430
      *failures = true;
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18999
diff changeset
   431
    }
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18999
diff changeset
   432
    return;
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18999
diff changeset
   433
  }
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18999
diff changeset
   434
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18999
diff changeset
   435
  VerifyStrongCodeRootCodeBlobClosure cb_cl(this);
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18999
diff changeset
   436
  strong_code_roots_do(&cb_cl);
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18999
diff changeset
   437
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18999
diff changeset
   438
  if (cb_cl.failures()) {
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18999
diff changeset
   439
    *failures = true;
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18999
diff changeset
   440
  }
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18999
diff changeset
   441
}
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18999
diff changeset
   442
35061
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34671
diff changeset
   443
void HeapRegion::print() const { print_on(tty); }
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   444
void HeapRegion::print_on(outputStream* st) const {
34671
1239543c7821 8144837: Improve the printout of heap regions in hs_err dump files.
david
parents: 34249
diff changeset
   445
  st->print("|%4u", this->_hrm_index);
1239543c7821 8144837: Improve the printout of heap regions in hs_err dump files.
david
parents: 34249
diff changeset
   446
  st->print("|" PTR_FORMAT ", " PTR_FORMAT ", " PTR_FORMAT,
1239543c7821 8144837: Improve the printout of heap regions in hs_err dump files.
david
parents: 34249
diff changeset
   447
            p2i(bottom()), p2i(top()), p2i(end()));
1239543c7821 8144837: Improve the printout of heap regions in hs_err dump files.
david
parents: 34249
diff changeset
   448
  st->print("|%3d%%", (int) ((double) used() * 100 / capacity()));
1239543c7821 8144837: Improve the printout of heap regions in hs_err dump files.
david
parents: 34249
diff changeset
   449
  st->print("|%2s", get_short_type_str());
1239543c7821 8144837: Improve the printout of heap regions in hs_err dump files.
david
parents: 34249
diff changeset
   450
  if (in_collection_set()) {
1239543c7821 8144837: Improve the printout of heap regions in hs_err dump files.
david
parents: 34249
diff changeset
   451
    st->print("|CS");
1239543c7821 8144837: Improve the printout of heap regions in hs_err dump files.
david
parents: 34249
diff changeset
   452
  } else {
1239543c7821 8144837: Improve the printout of heap regions in hs_err dump files.
david
parents: 34249
diff changeset
   453
    st->print("|  ");
1239543c7821 8144837: Improve the printout of heap regions in hs_err dump files.
david
parents: 34249
diff changeset
   454
  }
1239543c7821 8144837: Improve the printout of heap regions in hs_err dump files.
david
parents: 34249
diff changeset
   455
  st->print("|TS%3u", _gc_time_stamp);
49607
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49603
diff changeset
   456
  st->print_cr("|TAMS " PTR_FORMAT ", " PTR_FORMAT "| %s ",
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49603
diff changeset
   457
               p2i(prev_top_at_mark_start()), p2i(next_top_at_mark_start()), rem_set()->get_state_str());
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   458
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   459
35507
aa2affc60a2f 8145442: Add the facility to verify remembered sets for G1
poonam
parents: 35461
diff changeset
   460
class G1VerificationClosure : public OopClosure {
aa2affc60a2f 8145442: Add the facility to verify remembered sets for G1
poonam
parents: 35461
diff changeset
   461
protected:
19339
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18999
diff changeset
   462
  G1CollectedHeap* _g1h;
49164
7e958a8ebcd3 8195142: Refactor out card table from CardTableModRefBS to flatten the BarrierSet hierarchy
eosterlund
parents: 47885
diff changeset
   463
  G1CardTable *_ct;
19339
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18999
diff changeset
   464
  oop _containing_obj;
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18999
diff changeset
   465
  bool _failures;
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18999
diff changeset
   466
  int _n_failures;
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18999
diff changeset
   467
  VerifyOption _vo;
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18999
diff changeset
   468
public:
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18999
diff changeset
   469
  // _vo == UsePrevMarking -> use "prev" marking information,
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18999
diff changeset
   470
  // _vo == UseNextMarking -> use "next" marking information,
47885
5caa1d5f74c1 8186571: Implementation: JEP 307: Parallel Full GC for G1
sjohanss
parents: 47216
diff changeset
   471
  // _vo == UseFullMarking -> use "next" marking bitmap but no TAMS.
35507
aa2affc60a2f 8145442: Add the facility to verify remembered sets for G1
poonam
parents: 35461
diff changeset
   472
  G1VerificationClosure(G1CollectedHeap* g1h, VerifyOption vo) :
49164
7e958a8ebcd3 8195142: Refactor out card table from CardTableModRefBS to flatten the BarrierSet hierarchy
eosterlund
parents: 47885
diff changeset
   473
    _g1h(g1h), _ct(g1h->card_table()),
35507
aa2affc60a2f 8145442: Add the facility to verify remembered sets for G1
poonam
parents: 35461
diff changeset
   474
    _containing_obj(NULL), _failures(false), _n_failures(0), _vo(vo) {
aa2affc60a2f 8145442: Add the facility to verify remembered sets for G1
poonam
parents: 35461
diff changeset
   475
  }
19339
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18999
diff changeset
   476
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18999
diff changeset
   477
  void set_containing_obj(oop obj) {
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18999
diff changeset
   478
    _containing_obj = obj;
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18999
diff changeset
   479
  }
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18999
diff changeset
   480
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18999
diff changeset
   481
  bool failures() { return _failures; }
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18999
diff changeset
   482
  int n_failures() { return _n_failures; }
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18999
diff changeset
   483
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18999
diff changeset
   484
  void print_object(outputStream* out, oop obj) {
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18999
diff changeset
   485
#ifdef PRODUCT
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18999
diff changeset
   486
    Klass* k = obj->klass();
33602
16053580a684 8139163: InstanceKlass::cast passes through NULL
coleenp
parents: 33105
diff changeset
   487
    const char* class_name = k->external_name();
19339
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18999
diff changeset
   488
    out->print_cr("class name %s", class_name);
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18999
diff changeset
   489
#else // PRODUCT
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18999
diff changeset
   490
    obj->print_on(out);
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18999
diff changeset
   491
#endif // PRODUCT
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18999
diff changeset
   492
  }
35507
aa2affc60a2f 8145442: Add the facility to verify remembered sets for G1
poonam
parents: 35461
diff changeset
   493
};
aa2affc60a2f 8145442: Add the facility to verify remembered sets for G1
poonam
parents: 35461
diff changeset
   494
aa2affc60a2f 8145442: Add the facility to verify remembered sets for G1
poonam
parents: 35461
diff changeset
   495
class VerifyLiveClosure : public G1VerificationClosure {
aa2affc60a2f 8145442: Add the facility to verify remembered sets for G1
poonam
parents: 35461
diff changeset
   496
public:
aa2affc60a2f 8145442: Add the facility to verify remembered sets for G1
poonam
parents: 35461
diff changeset
   497
  VerifyLiveClosure(G1CollectedHeap* g1h, VerifyOption vo) : G1VerificationClosure(g1h, vo) {}
aa2affc60a2f 8145442: Add the facility to verify remembered sets for G1
poonam
parents: 35461
diff changeset
   498
  virtual void do_oop(narrowOop* p) { do_oop_work(p); }
aa2affc60a2f 8145442: Add the facility to verify remembered sets for G1
poonam
parents: 35461
diff changeset
   499
  virtual void do_oop(oop* p) { do_oop_work(p); }
19339
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18999
diff changeset
   500
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18999
diff changeset
   501
  template <class T>
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18999
diff changeset
   502
  void do_oop_work(T* p) {
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18999
diff changeset
   503
    assert(_containing_obj != NULL, "Precondition");
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18999
diff changeset
   504
    assert(!_g1h->is_obj_dead_cond(_containing_obj, _vo),
35507
aa2affc60a2f 8145442: Add the facility to verify remembered sets for G1
poonam
parents: 35461
diff changeset
   505
      "Precondition");
aa2affc60a2f 8145442: Add the facility to verify remembered sets for G1
poonam
parents: 35461
diff changeset
   506
    verify_liveness(p);
aa2affc60a2f 8145442: Add the facility to verify remembered sets for G1
poonam
parents: 35461
diff changeset
   507
  }
aa2affc60a2f 8145442: Add the facility to verify remembered sets for G1
poonam
parents: 35461
diff changeset
   508
aa2affc60a2f 8145442: Add the facility to verify remembered sets for G1
poonam
parents: 35461
diff changeset
   509
  template <class T>
aa2affc60a2f 8145442: Add the facility to verify remembered sets for G1
poonam
parents: 35461
diff changeset
   510
  void verify_liveness(T* p) {
49592
77fb0be7d19f 8199946: Move load/store and encode/decode out of oopDesc
stefank
parents: 49323
diff changeset
   511
    T heap_oop = RawAccess<>::oop_load(p);
37242
91e5f98fff6f 8152632: Rename LogHandle(...) to Log(...)
stefank
parents: 36394
diff changeset
   512
    Log(gc, verify) log;
49592
77fb0be7d19f 8199946: Move load/store and encode/decode out of oopDesc
stefank
parents: 49323
diff changeset
   513
    if (!CompressedOops::is_null(heap_oop)) {
77fb0be7d19f 8199946: Move load/store and encode/decode out of oopDesc
stefank
parents: 49323
diff changeset
   514
      oop obj = CompressedOops::decode_not_null(heap_oop);
19339
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18999
diff changeset
   515
      bool failed = false;
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18999
diff changeset
   516
      if (!_g1h->is_in_closed_subset(obj) || _g1h->is_obj_dead_cond(obj, _vo)) {
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18999
diff changeset
   517
        MutexLockerEx x(ParGCRareEvent_lock,
35507
aa2affc60a2f 8145442: Add the facility to verify remembered sets for G1
poonam
parents: 35461
diff changeset
   518
          Mutex::_no_safepoint_check_flag);
19339
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18999
diff changeset
   519
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18999
diff changeset
   520
        if (!_failures) {
36090
cffc1dd98258 8149541: Use log_error() instead of log_info() when verification reports a problem
brutisso
parents: 35908
diff changeset
   521
          log.error("----------");
19339
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18999
diff changeset
   522
        }
35061
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34671
diff changeset
   523
        ResourceMark rm;
19339
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18999
diff changeset
   524
        if (!_g1h->is_in_closed_subset(obj)) {
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18999
diff changeset
   525
          HeapRegion* from = _g1h->heap_region_containing((HeapWord*)p);
36090
cffc1dd98258 8149541: Use log_error() instead of log_info() when verification reports a problem
brutisso
parents: 35908
diff changeset
   526
          log.error("Field " PTR_FORMAT " of live obj " PTR_FORMAT " in region [" PTR_FORMAT ", " PTR_FORMAT ")",
35507
aa2affc60a2f 8145442: Add the facility to verify remembered sets for G1
poonam
parents: 35461
diff changeset
   527
            p2i(p), p2i(_containing_obj), p2i(from->bottom()), p2i(from->end()));
46701
f559541c0daa 8181917: Refactor UL LogStreams to avoid using resource area
stuefe
parents: 46630
diff changeset
   528
          LogStream ls(log.error());
f559541c0daa 8181917: Refactor UL LogStreams to avoid using resource area
stuefe
parents: 46630
diff changeset
   529
          print_object(&ls, _containing_obj);
49607
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49603
diff changeset
   530
          HeapRegion* const to = _g1h->heap_region_containing(obj);
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49603
diff changeset
   531
          log.error("points to obj " PTR_FORMAT " in region " HR_FORMAT " remset %s", p2i(obj), HR_FORMAT_PARAMS(to), to->rem_set()->get_state_str());
19339
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18999
diff changeset
   532
        } else {
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18999
diff changeset
   533
          HeapRegion* from = _g1h->heap_region_containing((HeapWord*)p);
35507
aa2affc60a2f 8145442: Add the facility to verify remembered sets for G1
poonam
parents: 35461
diff changeset
   534
          HeapRegion* to = _g1h->heap_region_containing((HeapWord*)obj);
36090
cffc1dd98258 8149541: Use log_error() instead of log_info() when verification reports a problem
brutisso
parents: 35908
diff changeset
   535
          log.error("Field " PTR_FORMAT " of live obj " PTR_FORMAT " in region [" PTR_FORMAT ", " PTR_FORMAT ")",
35507
aa2affc60a2f 8145442: Add the facility to verify remembered sets for G1
poonam
parents: 35461
diff changeset
   536
            p2i(p), p2i(_containing_obj), p2i(from->bottom()), p2i(from->end()));
46701
f559541c0daa 8181917: Refactor UL LogStreams to avoid using resource area
stuefe
parents: 46630
diff changeset
   537
          LogStream ls(log.error());
f559541c0daa 8181917: Refactor UL LogStreams to avoid using resource area
stuefe
parents: 46630
diff changeset
   538
          print_object(&ls, _containing_obj);
36090
cffc1dd98258 8149541: Use log_error() instead of log_info() when verification reports a problem
brutisso
parents: 35908
diff changeset
   539
          log.error("points to dead obj " PTR_FORMAT " in region [" PTR_FORMAT ", " PTR_FORMAT ")",
35507
aa2affc60a2f 8145442: Add the facility to verify remembered sets for G1
poonam
parents: 35461
diff changeset
   540
            p2i(obj), p2i(to->bottom()), p2i(to->end()));
46701
f559541c0daa 8181917: Refactor UL LogStreams to avoid using resource area
stuefe
parents: 46630
diff changeset
   541
          print_object(&ls, obj);
19339
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18999
diff changeset
   542
        }
36090
cffc1dd98258 8149541: Use log_error() instead of log_info() when verification reports a problem
brutisso
parents: 35908
diff changeset
   543
        log.error("----------");
19339
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18999
diff changeset
   544
        _failures = true;
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18999
diff changeset
   545
        failed = true;
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18999
diff changeset
   546
        _n_failures++;
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18999
diff changeset
   547
      }
35507
aa2affc60a2f 8145442: Add the facility to verify remembered sets for G1
poonam
parents: 35461
diff changeset
   548
    }
aa2affc60a2f 8145442: Add the facility to verify remembered sets for G1
poonam
parents: 35461
diff changeset
   549
  }
aa2affc60a2f 8145442: Add the facility to verify remembered sets for G1
poonam
parents: 35461
diff changeset
   550
};
19339
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18999
diff changeset
   551
35507
aa2affc60a2f 8145442: Add the facility to verify remembered sets for G1
poonam
parents: 35461
diff changeset
   552
class VerifyRemSetClosure : public G1VerificationClosure {
aa2affc60a2f 8145442: Add the facility to verify remembered sets for G1
poonam
parents: 35461
diff changeset
   553
public:
aa2affc60a2f 8145442: Add the facility to verify remembered sets for G1
poonam
parents: 35461
diff changeset
   554
  VerifyRemSetClosure(G1CollectedHeap* g1h, VerifyOption vo) : G1VerificationClosure(g1h, vo) {}
aa2affc60a2f 8145442: Add the facility to verify remembered sets for G1
poonam
parents: 35461
diff changeset
   555
  virtual void do_oop(narrowOop* p) { do_oop_work(p); }
aa2affc60a2f 8145442: Add the facility to verify remembered sets for G1
poonam
parents: 35461
diff changeset
   556
  virtual void do_oop(oop* p) { do_oop_work(p); }
aa2affc60a2f 8145442: Add the facility to verify remembered sets for G1
poonam
parents: 35461
diff changeset
   557
aa2affc60a2f 8145442: Add the facility to verify remembered sets for G1
poonam
parents: 35461
diff changeset
   558
  template <class T>
aa2affc60a2f 8145442: Add the facility to verify remembered sets for G1
poonam
parents: 35461
diff changeset
   559
  void do_oop_work(T* p) {
aa2affc60a2f 8145442: Add the facility to verify remembered sets for G1
poonam
parents: 35461
diff changeset
   560
    assert(_containing_obj != NULL, "Precondition");
aa2affc60a2f 8145442: Add the facility to verify remembered sets for G1
poonam
parents: 35461
diff changeset
   561
    assert(!_g1h->is_obj_dead_cond(_containing_obj, _vo),
aa2affc60a2f 8145442: Add the facility to verify remembered sets for G1
poonam
parents: 35461
diff changeset
   562
      "Precondition");
aa2affc60a2f 8145442: Add the facility to verify remembered sets for G1
poonam
parents: 35461
diff changeset
   563
    verify_remembered_set(p);
aa2affc60a2f 8145442: Add the facility to verify remembered sets for G1
poonam
parents: 35461
diff changeset
   564
  }
19339
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18999
diff changeset
   565
35507
aa2affc60a2f 8145442: Add the facility to verify remembered sets for G1
poonam
parents: 35461
diff changeset
   566
  template <class T>
aa2affc60a2f 8145442: Add the facility to verify remembered sets for G1
poonam
parents: 35461
diff changeset
   567
  void verify_remembered_set(T* p) {
49592
77fb0be7d19f 8199946: Move load/store and encode/decode out of oopDesc
stefank
parents: 49323
diff changeset
   568
    T heap_oop = RawAccess<>::oop_load(p);
37242
91e5f98fff6f 8152632: Rename LogHandle(...) to Log(...)
stefank
parents: 36394
diff changeset
   569
    Log(gc, verify) log;
49592
77fb0be7d19f 8199946: Move load/store and encode/decode out of oopDesc
stefank
parents: 49323
diff changeset
   570
    if (!CompressedOops::is_null(heap_oop)) {
77fb0be7d19f 8199946: Move load/store and encode/decode out of oopDesc
stefank
parents: 49323
diff changeset
   571
      oop obj = CompressedOops::decode_not_null(heap_oop);
35507
aa2affc60a2f 8145442: Add the facility to verify remembered sets for G1
poonam
parents: 35461
diff changeset
   572
      HeapRegion* from = _g1h->heap_region_containing((HeapWord*)p);
aa2affc60a2f 8145442: Add the facility to verify remembered sets for G1
poonam
parents: 35461
diff changeset
   573
      HeapRegion* to = _g1h->heap_region_containing(obj);
aa2affc60a2f 8145442: Add the facility to verify remembered sets for G1
poonam
parents: 35461
diff changeset
   574
      if (from != NULL && to != NULL &&
aa2affc60a2f 8145442: Add the facility to verify remembered sets for G1
poonam
parents: 35461
diff changeset
   575
        from != to &&
49607
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49603
diff changeset
   576
        !to->is_pinned() &&
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49603
diff changeset
   577
        to->rem_set()->is_complete()) {
49164
7e958a8ebcd3 8195142: Refactor out card table from CardTableModRefBS to flatten the BarrierSet hierarchy
eosterlund
parents: 47885
diff changeset
   578
        jbyte cv_obj = *_ct->byte_for_const(_containing_obj);
7e958a8ebcd3 8195142: Refactor out card table from CardTableModRefBS to flatten the BarrierSet hierarchy
eosterlund
parents: 47885
diff changeset
   579
        jbyte cv_field = *_ct->byte_for_const(p);
7e958a8ebcd3 8195142: Refactor out card table from CardTableModRefBS to flatten the BarrierSet hierarchy
eosterlund
parents: 47885
diff changeset
   580
        const jbyte dirty = G1CardTable::dirty_card_val();
19339
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18999
diff changeset
   581
35507
aa2affc60a2f 8145442: Add the facility to verify remembered sets for G1
poonam
parents: 35461
diff changeset
   582
        bool is_bad = !(from->is_young()
aa2affc60a2f 8145442: Add the facility to verify remembered sets for G1
poonam
parents: 35461
diff changeset
   583
          || to->rem_set()->contains_reference(p)
46611
3b8b1f7ee3b4 8153360: G1HRRSFlushLogBuffersOnVerify with remembered set verification does not work
ehelin
parents: 46520
diff changeset
   584
          || (_containing_obj->is_objArray() ?
3b8b1f7ee3b4 8153360: G1HRRSFlushLogBuffersOnVerify with remembered set verification does not work
ehelin
parents: 46520
diff changeset
   585
                cv_field == dirty :
3b8b1f7ee3b4 8153360: G1HRRSFlushLogBuffersOnVerify with remembered set verification does not work
ehelin
parents: 46520
diff changeset
   586
                cv_obj == dirty || cv_field == dirty));
35507
aa2affc60a2f 8145442: Add the facility to verify remembered sets for G1
poonam
parents: 35461
diff changeset
   587
        if (is_bad) {
aa2affc60a2f 8145442: Add the facility to verify remembered sets for G1
poonam
parents: 35461
diff changeset
   588
          MutexLockerEx x(ParGCRareEvent_lock,
aa2affc60a2f 8145442: Add the facility to verify remembered sets for G1
poonam
parents: 35461
diff changeset
   589
            Mutex::_no_safepoint_check_flag);
aa2affc60a2f 8145442: Add the facility to verify remembered sets for G1
poonam
parents: 35461
diff changeset
   590
aa2affc60a2f 8145442: Add the facility to verify remembered sets for G1
poonam
parents: 35461
diff changeset
   591
          if (!_failures) {
36090
cffc1dd98258 8149541: Use log_error() instead of log_info() when verification reports a problem
brutisso
parents: 35908
diff changeset
   592
            log.error("----------");
19339
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18999
diff changeset
   593
          }
36090
cffc1dd98258 8149541: Use log_error() instead of log_info() when verification reports a problem
brutisso
parents: 35908
diff changeset
   594
          log.error("Missing rem set entry:");
cffc1dd98258 8149541: Use log_error() instead of log_info() when verification reports a problem
brutisso
parents: 35908
diff changeset
   595
          log.error("Field " PTR_FORMAT " of obj " PTR_FORMAT ", in region " HR_FORMAT,
35507
aa2affc60a2f 8145442: Add the facility to verify remembered sets for G1
poonam
parents: 35461
diff changeset
   596
            p2i(p), p2i(_containing_obj), HR_FORMAT_PARAMS(from));
aa2affc60a2f 8145442: Add the facility to verify remembered sets for G1
poonam
parents: 35461
diff changeset
   597
          ResourceMark rm;
46701
f559541c0daa 8181917: Refactor UL LogStreams to avoid using resource area
stuefe
parents: 46630
diff changeset
   598
          LogStream ls(log.error());
f559541c0daa 8181917: Refactor UL LogStreams to avoid using resource area
stuefe
parents: 46630
diff changeset
   599
          _containing_obj->print_on(&ls);
49607
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49603
diff changeset
   600
          log.error("points to obj " PTR_FORMAT " in region " HR_FORMAT " remset %s", p2i(obj), HR_FORMAT_PARAMS(to), to->rem_set()->get_state_str());
46968
9119841280f4 8160399: is_oop_or_null involves undefined behavior
coleenp
parents: 46810
diff changeset
   601
          if (oopDesc::is_oop(obj)) {
46701
f559541c0daa 8181917: Refactor UL LogStreams to avoid using resource area
stuefe
parents: 46630
diff changeset
   602
            obj->print_on(&ls);
36394
fe27b66d3519 8150002: Check for the validity of oop before printing it in verify_remembered_set
poonam
parents: 36098
diff changeset
   603
          }
36090
cffc1dd98258 8149541: Use log_error() instead of log_info() when verification reports a problem
brutisso
parents: 35908
diff changeset
   604
          log.error("Obj head CTE = %d, field CTE = %d.", cv_obj, cv_field);
cffc1dd98258 8149541: Use log_error() instead of log_info() when verification reports a problem
brutisso
parents: 35908
diff changeset
   605
          log.error("----------");
35507
aa2affc60a2f 8145442: Add the facility to verify remembered sets for G1
poonam
parents: 35461
diff changeset
   606
          _failures = true;
46258
d26ebd7e2f10 8142749: HeapRegion::_predicted_bytes_to_copy is unused and can be removed
fzhinkin
parents: 42650
diff changeset
   607
          _n_failures++;
19339
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18999
diff changeset
   608
        }
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18999
diff changeset
   609
      }
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18999
diff changeset
   610
    }
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18999
diff changeset
   611
  }
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18999
diff changeset
   612
};
3000
bbce6052b595 6850846: G1: extend G1 marking verification
tonyp
parents: 2883
diff changeset
   613
46307
686d50172bfd 8071278: Fix the closure mess in G1RemSet::refine_card()
tschatzl
parents: 46286
diff changeset
   614
// Closure that applies the given two closures in sequence.
686d50172bfd 8071278: Fix the closure mess in G1RemSet::refine_card()
tschatzl
parents: 46286
diff changeset
   615
class G1Mux2Closure : public OopClosure {
686d50172bfd 8071278: Fix the closure mess in G1RemSet::refine_card()
tschatzl
parents: 46286
diff changeset
   616
  OopClosure* _c1;
686d50172bfd 8071278: Fix the closure mess in G1RemSet::refine_card()
tschatzl
parents: 46286
diff changeset
   617
  OopClosure* _c2;
686d50172bfd 8071278: Fix the closure mess in G1RemSet::refine_card()
tschatzl
parents: 46286
diff changeset
   618
public:
686d50172bfd 8071278: Fix the closure mess in G1RemSet::refine_card()
tschatzl
parents: 46286
diff changeset
   619
  G1Mux2Closure(OopClosure *c1, OopClosure *c2) { _c1 = c1; _c2 = c2; }
686d50172bfd 8071278: Fix the closure mess in G1RemSet::refine_card()
tschatzl
parents: 46286
diff changeset
   620
  template <class T> inline void do_oop_work(T* p) {
686d50172bfd 8071278: Fix the closure mess in G1RemSet::refine_card()
tschatzl
parents: 46286
diff changeset
   621
    // Apply first closure; then apply the second.
686d50172bfd 8071278: Fix the closure mess in G1RemSet::refine_card()
tschatzl
parents: 46286
diff changeset
   622
    _c1->do_oop(p);
686d50172bfd 8071278: Fix the closure mess in G1RemSet::refine_card()
tschatzl
parents: 46286
diff changeset
   623
    _c2->do_oop(p);
686d50172bfd 8071278: Fix the closure mess in G1RemSet::refine_card()
tschatzl
parents: 46286
diff changeset
   624
  }
686d50172bfd 8071278: Fix the closure mess in G1RemSet::refine_card()
tschatzl
parents: 46286
diff changeset
   625
  virtual inline void do_oop(oop* p) { do_oop_work(p); }
686d50172bfd 8071278: Fix the closure mess in G1RemSet::refine_card()
tschatzl
parents: 46286
diff changeset
   626
  virtual inline void do_oop(narrowOop* p) { do_oop_work(p); }
686d50172bfd 8071278: Fix the closure mess in G1RemSet::refine_card()
tschatzl
parents: 46286
diff changeset
   627
};
686d50172bfd 8071278: Fix the closure mess in G1RemSet::refine_card()
tschatzl
parents: 46286
diff changeset
   628
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   629
// This really ought to be commoned up into OffsetTableContigSpace somehow.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   630
// We would need a mechanism to make that code skip dead objects.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   631
12379
2cf45b79ce3a 4988100: oop_verify_old_oop appears to be dead
brutisso
parents: 11756
diff changeset
   632
void HeapRegion::verify(VerifyOption vo,
4023
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 3697
diff changeset
   633
                        bool* failures) const {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   634
  G1CollectedHeap* g1 = G1CollectedHeap::heap();
4023
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 3697
diff changeset
   635
  *failures = false;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   636
  HeapWord* p = bottom();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   637
  HeapWord* prev_p = NULL;
9995
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
   638
  VerifyLiveClosure vl_cl(g1, vo);
35507
aa2affc60a2f 8145442: Add the facility to verify remembered sets for G1
poonam
parents: 35461
diff changeset
   639
  VerifyRemSetClosure vr_cl(g1, vo);
26846
7d4376f8560e 8058495: G1: normalize names for isHumongous() and friends
tonyp
parents: 26840
diff changeset
   640
  bool is_region_humongous = is_humongous();
6260
fba83fd3adc7 6974928: G1: sometimes humongous objects are allocated in young regions
tonyp
parents: 6247
diff changeset
   641
  size_t object_num = 0;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   642
  while (p < top()) {
7904
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   643
    oop obj = oop(p);
25481
1427aa24638c 8047818: G1 HeapRegions can no longer be ContiguousSpaces
mgerdin
parents: 25479
diff changeset
   644
    size_t obj_size = block_size(p);
7904
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   645
    object_num += 1;
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   646
9995
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
   647
    if (!g1->is_obj_dead_cond(obj, this, vo)) {
46968
9119841280f4 8160399: is_oop_or_null involves undefined behavior
coleenp
parents: 46810
diff changeset
   648
      if (oopDesc::is_oop(obj)) {
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13482
diff changeset
   649
        Klass* klass = obj->klass();
49603
6ce4db4460ca 8199007: ClassLoaderDataGraph::unload_list_contains() is wrong
coleenp
parents: 49592
diff changeset
   650
        bool is_metaspace_object = Metaspace::contains(klass);
25492
d27050bdfb04 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 25491
diff changeset
   651
        if (!is_metaspace_object) {
36090
cffc1dd98258 8149541: Use log_error() instead of log_info() when verification reports a problem
brutisso
parents: 35908
diff changeset
   652
          log_error(gc, verify)("klass " PTR_FORMAT " of object " PTR_FORMAT " "
cffc1dd98258 8149541: Use log_error() instead of log_info() when verification reports a problem
brutisso
parents: 35908
diff changeset
   653
                                "not metadata", p2i(klass), p2i(obj));
7904
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   654
          *failures = true;
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   655
          return;
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   656
        } else if (!klass->is_klass()) {
36090
cffc1dd98258 8149541: Use log_error() instead of log_info() when verification reports a problem
brutisso
parents: 35908
diff changeset
   657
          log_error(gc, verify)("klass " PTR_FORMAT " of object " PTR_FORMAT " "
cffc1dd98258 8149541: Use log_error() instead of log_info() when verification reports a problem
brutisso
parents: 35908
diff changeset
   658
                                "not a klass", p2i(klass), p2i(obj));
7904
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   659
          *failures = true;
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   660
          return;
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   661
        } else {
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   662
          vl_cl.set_containing_obj(obj);
35507
aa2affc60a2f 8145442: Add the facility to verify remembered sets for G1
poonam
parents: 35461
diff changeset
   663
          if (!g1->collector_state()->full_collection() || G1VerifyRSetsDuringFullGC) {
aa2affc60a2f 8145442: Add the facility to verify remembered sets for G1
poonam
parents: 35461
diff changeset
   664
            // verify liveness and rem_set
aa2affc60a2f 8145442: Add the facility to verify remembered sets for G1
poonam
parents: 35461
diff changeset
   665
            vr_cl.set_containing_obj(obj);
aa2affc60a2f 8145442: Add the facility to verify remembered sets for G1
poonam
parents: 35461
diff changeset
   666
            G1Mux2Closure mux(&vl_cl, &vr_cl);
aa2affc60a2f 8145442: Add the facility to verify remembered sets for G1
poonam
parents: 35461
diff changeset
   667
            obj->oop_iterate_no_header(&mux);
aa2affc60a2f 8145442: Add the facility to verify remembered sets for G1
poonam
parents: 35461
diff changeset
   668
aa2affc60a2f 8145442: Add the facility to verify remembered sets for G1
poonam
parents: 35461
diff changeset
   669
            if (vr_cl.failures()) {
aa2affc60a2f 8145442: Add the facility to verify remembered sets for G1
poonam
parents: 35461
diff changeset
   670
              *failures = true;
aa2affc60a2f 8145442: Add the facility to verify remembered sets for G1
poonam
parents: 35461
diff changeset
   671
            }
aa2affc60a2f 8145442: Add the facility to verify remembered sets for G1
poonam
parents: 35461
diff changeset
   672
            if (G1MaxVerifyFailures >= 0 &&
aa2affc60a2f 8145442: Add the facility to verify remembered sets for G1
poonam
parents: 35461
diff changeset
   673
              vr_cl.n_failures() >= G1MaxVerifyFailures) {
aa2affc60a2f 8145442: Add the facility to verify remembered sets for G1
poonam
parents: 35461
diff changeset
   674
              return;
aa2affc60a2f 8145442: Add the facility to verify remembered sets for G1
poonam
parents: 35461
diff changeset
   675
            }
aa2affc60a2f 8145442: Add the facility to verify remembered sets for G1
poonam
parents: 35461
diff changeset
   676
          } else {
aa2affc60a2f 8145442: Add the facility to verify remembered sets for G1
poonam
parents: 35461
diff changeset
   677
            // verify only liveness
aa2affc60a2f 8145442: Add the facility to verify remembered sets for G1
poonam
parents: 35461
diff changeset
   678
            obj->oop_iterate_no_header(&vl_cl);
aa2affc60a2f 8145442: Add the facility to verify remembered sets for G1
poonam
parents: 35461
diff changeset
   679
          }
7904
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   680
          if (vl_cl.failures()) {
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   681
            *failures = true;
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   682
          }
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   683
          if (G1MaxVerifyFailures >= 0 &&
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   684
              vl_cl.n_failures() >= G1MaxVerifyFailures) {
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   685
            return;
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   686
          }
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   687
        }
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   688
      } else {
36090
cffc1dd98258 8149541: Use log_error() instead of log_info() when verification reports a problem
brutisso
parents: 35908
diff changeset
   689
        log_error(gc, verify)(PTR_FORMAT " not an oop", p2i(obj));
4023
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 3697
diff changeset
   690
        *failures = true;
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 3697
diff changeset
   691
        return;
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 3697
diff changeset
   692
      }
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   693
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   694
    prev_p = p;
7904
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   695
    p += obj_size;
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   696
  }
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   697
26571
5fe42815e865 8025564: gc/memory/UniThread/Linear1 times out during heap verification
brutisso
parents: 26422
diff changeset
   698
  if (!is_young() && !is_empty()) {
35461
1068dcb8d315 8146399: Refactor the BlockOffsetTable classes.
david
parents: 35210
diff changeset
   699
    _bot_part.verify();
26571
5fe42815e865 8025564: gc/memory/UniThread/Linear1 times out during heap verification
brutisso
parents: 26422
diff changeset
   700
  }
5fe42815e865 8025564: gc/memory/UniThread/Linear1 times out during heap verification
brutisso
parents: 26422
diff changeset
   701
33786
ac8da6513351 8139867: Change how startsHumongous and continuesHumongous regions work in G1.
david
parents: 33602
diff changeset
   702
  if (is_region_humongous) {
ac8da6513351 8139867: Change how startsHumongous and continuesHumongous regions work in G1.
david
parents: 33602
diff changeset
   703
    oop obj = oop(this->humongous_start_region()->bottom());
ac8da6513351 8139867: Change how startsHumongous and continuesHumongous regions work in G1.
david
parents: 33602
diff changeset
   704
    if ((HeapWord*)obj > bottom() || (HeapWord*)obj + obj->size() < bottom()) {
36090
cffc1dd98258 8149541: Use log_error() instead of log_info() when verification reports a problem
brutisso
parents: 35908
diff changeset
   705
      log_error(gc, verify)("this humongous region is not part of its' humongous object " PTR_FORMAT, p2i(obj));
36091
fd10d4ee314a 8149542: Missing failure reporting in HeapRegion::verify
brutisso
parents: 36090
diff changeset
   706
      *failures = true;
fd10d4ee314a 8149542: Missing failure reporting in HeapRegion::verify
brutisso
parents: 36090
diff changeset
   707
      return;
33786
ac8da6513351 8139867: Change how startsHumongous and continuesHumongous regions work in G1.
david
parents: 33602
diff changeset
   708
    }
ac8da6513351 8139867: Change how startsHumongous and continuesHumongous regions work in G1.
david
parents: 33602
diff changeset
   709
  }
ac8da6513351 8139867: Change how startsHumongous and continuesHumongous regions work in G1.
david
parents: 33602
diff changeset
   710
ac8da6513351 8139867: Change how startsHumongous and continuesHumongous regions work in G1.
david
parents: 33602
diff changeset
   711
  if (!is_region_humongous && p != top()) {
36090
cffc1dd98258 8149541: Use log_error() instead of log_info() when verification reports a problem
brutisso
parents: 35908
diff changeset
   712
    log_error(gc, verify)("end of last object " PTR_FORMAT " "
cffc1dd98258 8149541: Use log_error() instead of log_info() when verification reports a problem
brutisso
parents: 35908
diff changeset
   713
                          "does not match top " PTR_FORMAT, p2i(p), p2i(top()));
7904
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   714
    *failures = true;
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   715
    return;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   716
  }
7904
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   717
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   718
  HeapWord* the_end = end();
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   719
  // Do some extra BOT consistency checking for addresses in the
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   720
  // range [top, end). BOT look-ups in this range should yield
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   721
  // top. No point in doing that if top == end (there's nothing there).
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   722
  if (p < the_end) {
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   723
    // Look up top
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   724
    HeapWord* addr_1 = p;
35461
1068dcb8d315 8146399: Refactor the BlockOffsetTable classes.
david
parents: 35210
diff changeset
   725
    HeapWord* b_start_1 = _bot_part.block_start_const(addr_1);
7904
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   726
    if (b_start_1 != p) {
36090
cffc1dd98258 8149541: Use log_error() instead of log_info() when verification reports a problem
brutisso
parents: 35908
diff changeset
   727
      log_error(gc, verify)("BOT look up for top: " PTR_FORMAT " "
cffc1dd98258 8149541: Use log_error() instead of log_info() when verification reports a problem
brutisso
parents: 35908
diff changeset
   728
                            " yielded " PTR_FORMAT ", expecting " PTR_FORMAT,
cffc1dd98258 8149541: Use log_error() instead of log_info() when verification reports a problem
brutisso
parents: 35908
diff changeset
   729
                            p2i(addr_1), p2i(b_start_1), p2i(p));
7904
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   730
      *failures = true;
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   731
      return;
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   732
    }
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   733
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   734
    // Look up top + 1
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   735
    HeapWord* addr_2 = p + 1;
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   736
    if (addr_2 < the_end) {
35461
1068dcb8d315 8146399: Refactor the BlockOffsetTable classes.
david
parents: 35210
diff changeset
   737
      HeapWord* b_start_2 = _bot_part.block_start_const(addr_2);
7904
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   738
      if (b_start_2 != p) {
36090
cffc1dd98258 8149541: Use log_error() instead of log_info() when verification reports a problem
brutisso
parents: 35908
diff changeset
   739
        log_error(gc, verify)("BOT look up for top + 1: " PTR_FORMAT " "
cffc1dd98258 8149541: Use log_error() instead of log_info() when verification reports a problem
brutisso
parents: 35908
diff changeset
   740
                              " yielded " PTR_FORMAT ", expecting " PTR_FORMAT,
cffc1dd98258 8149541: Use log_error() instead of log_info() when verification reports a problem
brutisso
parents: 35908
diff changeset
   741
                              p2i(addr_2), p2i(b_start_2), p2i(p));
4023
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 3697
diff changeset
   742
        *failures = true;
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 3697
diff changeset
   743
        return;
7904
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   744
      }
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   745
    }
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   746
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   747
    // Look up an address between top and end
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   748
    size_t diff = pointer_delta(the_end, p) / 2;
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   749
    HeapWord* addr_3 = p + diff;
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   750
    if (addr_3 < the_end) {
35461
1068dcb8d315 8146399: Refactor the BlockOffsetTable classes.
david
parents: 35210
diff changeset
   751
      HeapWord* b_start_3 = _bot_part.block_start_const(addr_3);
7904
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   752
      if (b_start_3 != p) {
36090
cffc1dd98258 8149541: Use log_error() instead of log_info() when verification reports a problem
brutisso
parents: 35908
diff changeset
   753
        log_error(gc, verify)("BOT look up for top + diff: " PTR_FORMAT " "
cffc1dd98258 8149541: Use log_error() instead of log_info() when verification reports a problem
brutisso
parents: 35908
diff changeset
   754
                              " yielded " PTR_FORMAT ", expecting " PTR_FORMAT,
cffc1dd98258 8149541: Use log_error() instead of log_info() when verification reports a problem
brutisso
parents: 35908
diff changeset
   755
                              p2i(addr_3), p2i(b_start_3), p2i(p));
7904
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   756
        *failures = true;
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   757
        return;
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   758
      }
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   759
    }
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   760
22551
9bf46d16dcc6 8025856: Fix typos in the GC code
jwilhelm
parents: 21563
diff changeset
   761
    // Look up end - 1
7904
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   762
    HeapWord* addr_4 = the_end - 1;
35461
1068dcb8d315 8146399: Refactor the BlockOffsetTable classes.
david
parents: 35210
diff changeset
   763
    HeapWord* b_start_4 = _bot_part.block_start_const(addr_4);
7904
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   764
    if (b_start_4 != p) {
36090
cffc1dd98258 8149541: Use log_error() instead of log_info() when verification reports a problem
brutisso
parents: 35908
diff changeset
   765
      log_error(gc, verify)("BOT look up for end - 1: " PTR_FORMAT " "
cffc1dd98258 8149541: Use log_error() instead of log_info() when verification reports a problem
brutisso
parents: 35908
diff changeset
   766
                            " yielded " PTR_FORMAT ", expecting " PTR_FORMAT,
cffc1dd98258 8149541: Use log_error() instead of log_info() when verification reports a problem
brutisso
parents: 35908
diff changeset
   767
                            p2i(addr_4), p2i(b_start_4), p2i(p));
7904
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   768
      *failures = true;
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7397
diff changeset
   769
      return;
4023
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 3697
diff changeset
   770
    }
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   771
  }
4023
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 3697
diff changeset
   772
19339
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18999
diff changeset
   773
  verify_strong_code_roots(vo, failures);
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18999
diff changeset
   774
}
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18999
diff changeset
   775
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18999
diff changeset
   776
void HeapRegion::verify() const {
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18999
diff changeset
   777
  bool dummy = false;
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18999
diff changeset
   778
  verify(VerifyOption_G1UsePrevMarking, /* failures */ &dummy);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   779
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   780
35507
aa2affc60a2f 8145442: Add the facility to verify remembered sets for G1
poonam
parents: 35461
diff changeset
   781
void HeapRegion::verify_rem_set(VerifyOption vo, bool* failures) const {
aa2affc60a2f 8145442: Add the facility to verify remembered sets for G1
poonam
parents: 35461
diff changeset
   782
  G1CollectedHeap* g1 = G1CollectedHeap::heap();
aa2affc60a2f 8145442: Add the facility to verify remembered sets for G1
poonam
parents: 35461
diff changeset
   783
  *failures = false;
aa2affc60a2f 8145442: Add the facility to verify remembered sets for G1
poonam
parents: 35461
diff changeset
   784
  HeapWord* p = bottom();
aa2affc60a2f 8145442: Add the facility to verify remembered sets for G1
poonam
parents: 35461
diff changeset
   785
  HeapWord* prev_p = NULL;
aa2affc60a2f 8145442: Add the facility to verify remembered sets for G1
poonam
parents: 35461
diff changeset
   786
  VerifyRemSetClosure vr_cl(g1, vo);
aa2affc60a2f 8145442: Add the facility to verify remembered sets for G1
poonam
parents: 35461
diff changeset
   787
  while (p < top()) {
aa2affc60a2f 8145442: Add the facility to verify remembered sets for G1
poonam
parents: 35461
diff changeset
   788
    oop obj = oop(p);
aa2affc60a2f 8145442: Add the facility to verify remembered sets for G1
poonam
parents: 35461
diff changeset
   789
    size_t obj_size = block_size(p);
aa2affc60a2f 8145442: Add the facility to verify remembered sets for G1
poonam
parents: 35461
diff changeset
   790
aa2affc60a2f 8145442: Add the facility to verify remembered sets for G1
poonam
parents: 35461
diff changeset
   791
    if (!g1->is_obj_dead_cond(obj, this, vo)) {
46968
9119841280f4 8160399: is_oop_or_null involves undefined behavior
coleenp
parents: 46810
diff changeset
   792
      if (oopDesc::is_oop(obj)) {
35507
aa2affc60a2f 8145442: Add the facility to verify remembered sets for G1
poonam
parents: 35461
diff changeset
   793
        vr_cl.set_containing_obj(obj);
aa2affc60a2f 8145442: Add the facility to verify remembered sets for G1
poonam
parents: 35461
diff changeset
   794
        obj->oop_iterate_no_header(&vr_cl);
aa2affc60a2f 8145442: Add the facility to verify remembered sets for G1
poonam
parents: 35461
diff changeset
   795
aa2affc60a2f 8145442: Add the facility to verify remembered sets for G1
poonam
parents: 35461
diff changeset
   796
        if (vr_cl.failures()) {
aa2affc60a2f 8145442: Add the facility to verify remembered sets for G1
poonam
parents: 35461
diff changeset
   797
          *failures = true;
aa2affc60a2f 8145442: Add the facility to verify remembered sets for G1
poonam
parents: 35461
diff changeset
   798
        }
aa2affc60a2f 8145442: Add the facility to verify remembered sets for G1
poonam
parents: 35461
diff changeset
   799
        if (G1MaxVerifyFailures >= 0 &&
aa2affc60a2f 8145442: Add the facility to verify remembered sets for G1
poonam
parents: 35461
diff changeset
   800
          vr_cl.n_failures() >= G1MaxVerifyFailures) {
aa2affc60a2f 8145442: Add the facility to verify remembered sets for G1
poonam
parents: 35461
diff changeset
   801
          return;
aa2affc60a2f 8145442: Add the facility to verify remembered sets for G1
poonam
parents: 35461
diff changeset
   802
        }
aa2affc60a2f 8145442: Add the facility to verify remembered sets for G1
poonam
parents: 35461
diff changeset
   803
      } else {
36090
cffc1dd98258 8149541: Use log_error() instead of log_info() when verification reports a problem
brutisso
parents: 35908
diff changeset
   804
        log_error(gc, verify)(PTR_FORMAT " not an oop", p2i(obj));
35507
aa2affc60a2f 8145442: Add the facility to verify remembered sets for G1
poonam
parents: 35461
diff changeset
   805
        *failures = true;
aa2affc60a2f 8145442: Add the facility to verify remembered sets for G1
poonam
parents: 35461
diff changeset
   806
        return;
aa2affc60a2f 8145442: Add the facility to verify remembered sets for G1
poonam
parents: 35461
diff changeset
   807
      }
aa2affc60a2f 8145442: Add the facility to verify remembered sets for G1
poonam
parents: 35461
diff changeset
   808
    }
aa2affc60a2f 8145442: Add the facility to verify remembered sets for G1
poonam
parents: 35461
diff changeset
   809
aa2affc60a2f 8145442: Add the facility to verify remembered sets for G1
poonam
parents: 35461
diff changeset
   810
    prev_p = p;
aa2affc60a2f 8145442: Add the facility to verify remembered sets for G1
poonam
parents: 35461
diff changeset
   811
    p += obj_size;
aa2affc60a2f 8145442: Add the facility to verify remembered sets for G1
poonam
parents: 35461
diff changeset
   812
  }
aa2affc60a2f 8145442: Add the facility to verify remembered sets for G1
poonam
parents: 35461
diff changeset
   813
}
aa2affc60a2f 8145442: Add the facility to verify remembered sets for G1
poonam
parents: 35461
diff changeset
   814
aa2affc60a2f 8145442: Add the facility to verify remembered sets for G1
poonam
parents: 35461
diff changeset
   815
void HeapRegion::verify_rem_set() const {
aa2affc60a2f 8145442: Add the facility to verify remembered sets for G1
poonam
parents: 35461
diff changeset
   816
  bool failures = false;
aa2affc60a2f 8145442: Add the facility to verify remembered sets for G1
poonam
parents: 35461
diff changeset
   817
  verify_rem_set(VerifyOption_G1UsePrevMarking, &failures);
aa2affc60a2f 8145442: Add the facility to verify remembered sets for G1
poonam
parents: 35461
diff changeset
   818
  guarantee(!failures, "HeapRegion RemSet verification failed");
aa2affc60a2f 8145442: Add the facility to verify remembered sets for G1
poonam
parents: 35461
diff changeset
   819
}
aa2affc60a2f 8145442: Add the facility to verify remembered sets for G1
poonam
parents: 35461
diff changeset
   820
27624
fe43edc5046d 8043243: convert SCAN_AND_FORWARD, SCAN_AND_ADJUST_POINTERS, SCAN_AND_COMPACT macros to methods
mlarsson
parents: 27009
diff changeset
   821
void HeapRegion::prepare_for_compaction(CompactPoint* cp) {
47885
5caa1d5f74c1 8186571: Implementation: JEP 307: Parallel Full GC for G1
sjohanss
parents: 47216
diff changeset
   822
  // Not used for G1 anymore, but pure virtual in Space.
5caa1d5f74c1 8186571: Implementation: JEP 307: Parallel Full GC for G1
sjohanss
parents: 47216
diff changeset
   823
  ShouldNotReachHere();
27624
fe43edc5046d 8043243: convert SCAN_AND_FORWARD, SCAN_AND_ADJUST_POINTERS, SCAN_AND_COMPACT macros to methods
mlarsson
parents: 27009
diff changeset
   824
}
fe43edc5046d 8043243: convert SCAN_AND_FORWARD, SCAN_AND_ADJUST_POINTERS, SCAN_AND_COMPACT macros to methods
mlarsson
parents: 27009
diff changeset
   825
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   826
// G1OffsetTableContigSpace code; copied from space.cpp.  Hope this can go
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   827
// away eventually.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   828
35461
1068dcb8d315 8146399: Refactor the BlockOffsetTable classes.
david
parents: 35210
diff changeset
   829
void G1ContiguousSpace::clear(bool mangle_space) {
25481
1427aa24638c 8047818: G1 HeapRegions can no longer be ContiguousSpaces
mgerdin
parents: 25479
diff changeset
   830
  set_top(bottom());
1427aa24638c 8047818: G1 HeapRegions can no longer be ContiguousSpaces
mgerdin
parents: 25479
diff changeset
   831
  CompactibleSpace::clear(mangle_space);
26157
70eddb655686 8054818: Refactor HeapRegionSeq to manage heap region and auxiliary data
tschatzl
parents: 25730
diff changeset
   832
  reset_bot();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   833
}
29681
e96b344b2c42 8073463: G1 does not mangle freed heap regions
david
parents: 29470
diff changeset
   834
#ifndef PRODUCT
35461
1068dcb8d315 8146399: Refactor the BlockOffsetTable classes.
david
parents: 35210
diff changeset
   835
void G1ContiguousSpace::mangle_unused_area() {
29681
e96b344b2c42 8073463: G1 does not mangle freed heap regions
david
parents: 29470
diff changeset
   836
  mangle_unused_area_complete();
e96b344b2c42 8073463: G1 does not mangle freed heap regions
david
parents: 29470
diff changeset
   837
}
e96b344b2c42 8073463: G1 does not mangle freed heap regions
david
parents: 29470
diff changeset
   838
35461
1068dcb8d315 8146399: Refactor the BlockOffsetTable classes.
david
parents: 35210
diff changeset
   839
void G1ContiguousSpace::mangle_unused_area_complete() {
29681
e96b344b2c42 8073463: G1 does not mangle freed heap regions
david
parents: 29470
diff changeset
   840
  SpaceMangler::mangle_region(MemRegion(top(), end()));
e96b344b2c42 8073463: G1 does not mangle freed heap regions
david
parents: 29470
diff changeset
   841
}
e96b344b2c42 8073463: G1 does not mangle freed heap regions
david
parents: 29470
diff changeset
   842
#endif
e96b344b2c42 8073463: G1 does not mangle freed heap regions
david
parents: 29470
diff changeset
   843
35461
1068dcb8d315 8146399: Refactor the BlockOffsetTable classes.
david
parents: 35210
diff changeset
   844
void G1ContiguousSpace::print() const {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   845
  print_short();
35061
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34671
diff changeset
   846
  tty->print_cr(" [" INTPTR_FORMAT ", " INTPTR_FORMAT ", "
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   847
                INTPTR_FORMAT ", " INTPTR_FORMAT ")",
35461
1068dcb8d315 8146399: Refactor the BlockOffsetTable classes.
david
parents: 35210
diff changeset
   848
                p2i(bottom()), p2i(top()), p2i(_bot_part.threshold()), p2i(end()));
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   849
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   850
35461
1068dcb8d315 8146399: Refactor the BlockOffsetTable classes.
david
parents: 35210
diff changeset
   851
HeapWord* G1ContiguousSpace::initialize_threshold() {
1068dcb8d315 8146399: Refactor the BlockOffsetTable classes.
david
parents: 35210
diff changeset
   852
  return _bot_part.initialize_threshold();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   853
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   854
35461
1068dcb8d315 8146399: Refactor the BlockOffsetTable classes.
david
parents: 35210
diff changeset
   855
HeapWord* G1ContiguousSpace::cross_threshold(HeapWord* start,
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   856
                                                    HeapWord* end) {
35461
1068dcb8d315 8146399: Refactor the BlockOffsetTable classes.
david
parents: 35210
diff changeset
   857
  _bot_part.alloc_block(start, end);
1068dcb8d315 8146399: Refactor the BlockOffsetTable classes.
david
parents: 35210
diff changeset
   858
  return _bot_part.threshold();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   859
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   860
35461
1068dcb8d315 8146399: Refactor the BlockOffsetTable classes.
david
parents: 35210
diff changeset
   861
void G1ContiguousSpace::record_timestamp() {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   862
  G1CollectedHeap* g1h = G1CollectedHeap::heap();
37989
e0a0f4de45c4 8153170: Card Live Data does not correctly handle eager reclaim
tschatzl
parents: 37985
diff changeset
   863
  uint curr_gc_time_stamp = g1h->get_gc_time_stamp();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   864
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   865
  if (_gc_time_stamp < curr_gc_time_stamp) {
1385
1751733b089b 6723570: G1: assertion failure: p == current_top or oop(p)->is_oop(),"p is not a block start" (revisited!)
iveresov
parents: 1374
diff changeset
   866
    _gc_time_stamp = curr_gc_time_stamp;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   867
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   868
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   869
35461
1068dcb8d315 8146399: Refactor the BlockOffsetTable classes.
david
parents: 35210
diff changeset
   870
void G1ContiguousSpace::safe_object_iterate(ObjectClosure* blk) {
25481
1427aa24638c 8047818: G1 HeapRegions can no longer be ContiguousSpaces
mgerdin
parents: 25479
diff changeset
   871
  object_iterate(blk);
1427aa24638c 8047818: G1 HeapRegions can no longer be ContiguousSpaces
mgerdin
parents: 25479
diff changeset
   872
}
1427aa24638c 8047818: G1 HeapRegions can no longer be ContiguousSpaces
mgerdin
parents: 25479
diff changeset
   873
35461
1068dcb8d315 8146399: Refactor the BlockOffsetTable classes.
david
parents: 35210
diff changeset
   874
void G1ContiguousSpace::object_iterate(ObjectClosure* blk) {
25481
1427aa24638c 8047818: G1 HeapRegions can no longer be ContiguousSpaces
mgerdin
parents: 25479
diff changeset
   875
  HeapWord* p = bottom();
1427aa24638c 8047818: G1 HeapRegions can no longer be ContiguousSpaces
mgerdin
parents: 25479
diff changeset
   876
  while (p < top()) {
1427aa24638c 8047818: G1 HeapRegions can no longer be ContiguousSpaces
mgerdin
parents: 25479
diff changeset
   877
    if (block_is_obj(p)) {
1427aa24638c 8047818: G1 HeapRegions can no longer be ContiguousSpaces
mgerdin
parents: 25479
diff changeset
   878
      blk->do_object(oop(p));
1427aa24638c 8047818: G1 HeapRegions can no longer be ContiguousSpaces
mgerdin
parents: 25479
diff changeset
   879
    }
1427aa24638c 8047818: G1 HeapRegions can no longer be ContiguousSpaces
mgerdin
parents: 25479
diff changeset
   880
    p += block_size(p);
1427aa24638c 8047818: G1 HeapRegions can no longer be ContiguousSpaces
mgerdin
parents: 25479
diff changeset
   881
  }
1427aa24638c 8047818: G1 HeapRegions can no longer be ContiguousSpaces
mgerdin
parents: 25479
diff changeset
   882
}
1427aa24638c 8047818: G1 HeapRegions can no longer be ContiguousSpaces
mgerdin
parents: 25479
diff changeset
   883
35461
1068dcb8d315 8146399: Refactor the BlockOffsetTable classes.
david
parents: 35210
diff changeset
   884
G1ContiguousSpace::G1ContiguousSpace(G1BlockOffsetTable* bot) :
1068dcb8d315 8146399: Refactor the BlockOffsetTable classes.
david
parents: 35210
diff changeset
   885
  _bot_part(bot, this),
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   886
  _par_alloc_lock(Mutex::leaf, "OffsetTableContigSpace par alloc lock", true),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   887
  _gc_time_stamp(0)
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   888
{
26157
70eddb655686 8054818: Refactor HeapRegionSeq to manage heap region and auxiliary data
tschatzl
parents: 25730
diff changeset
   889
}
70eddb655686 8054818: Refactor HeapRegionSeq to manage heap region and auxiliary data
tschatzl
parents: 25730
diff changeset
   890
35461
1068dcb8d315 8146399: Refactor the BlockOffsetTable classes.
david
parents: 35210
diff changeset
   891
void G1ContiguousSpace::initialize(MemRegion mr, bool clear_space, bool mangle_space) {
26157
70eddb655686 8054818: Refactor HeapRegionSeq to manage heap region and auxiliary data
tschatzl
parents: 25730
diff changeset
   892
  CompactibleSpace::initialize(mr, clear_space, mangle_space);
25481
1427aa24638c 8047818: G1 HeapRegions can no longer be ContiguousSpaces
mgerdin
parents: 25479
diff changeset
   893
  _top = bottom();
27889
7d50f95e0076 8065358: Refactor G1s usage of save_marks and reduce related races
mgerdin
parents: 27681
diff changeset
   894
  set_saved_mark_word(NULL);
26157
70eddb655686 8054818: Refactor HeapRegionSeq to manage heap region and auxiliary data
tschatzl
parents: 25730
diff changeset
   895
  reset_bot();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   896
}