annotate src/share/vm/gc_implementation/g1/heapRegion.cpp @ 1886:72a161e62cc4

6991377: G1: race between concurrent refinement and humongous object allocation Summary: There is a race between the concurrent refinement threads and the humongous object allocation that can cause the concurrent refinement threads to corrupt the part of the BOT that it is being initialized by the humongous object allocation operation. The solution is to do the humongous object allocation in careful steps to ensure that the concurrent refinement threads always have a consistent view over the BOT, region contents, and top. The fix includes some very minor tidying up in sparsePRT. Reviewed-by: jcoomes, johnc, ysr
author tonyp
date Sat, 16 Oct 2010 17:12:19 -0400
parents bb847e31b836
children 2d26b0046e0d f95d63e2154a
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1 /*
1552
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1550
diff changeset
2 * Copyright (c) 2001, 2010, Oracle and/or its affiliates. All rights reserved.
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
4 *
37f87013dfd8 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
37f87013dfd8 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
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
7 * published by the Free Software Foundation.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
8 *
37f87013dfd8 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
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
37f87013dfd8 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
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
13 * accompanied this code).
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
14 *
37f87013dfd8 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
37f87013dfd8 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,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
18 *
1552
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1550
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1550
diff changeset
20 * or visit www.oracle.com if you need additional information or have any
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1550
diff changeset
21 * questions.
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
22 *
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
23 */
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
24
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
25 #include "incls/_precompiled.incl"
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
26 #include "incls/_heapRegion.cpp.incl"
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
27
942
2c79770d1f6e 6819085: G1: use larger and/or user settable region size
tonyp
parents: 866
diff changeset
28 int HeapRegion::LogOfHRGrainBytes = 0;
2c79770d1f6e 6819085: G1: use larger and/or user settable region size
tonyp
parents: 866
diff changeset
29 int HeapRegion::LogOfHRGrainWords = 0;
2c79770d1f6e 6819085: G1: use larger and/or user settable region size
tonyp
parents: 866
diff changeset
30 int HeapRegion::GrainBytes = 0;
2c79770d1f6e 6819085: G1: use larger and/or user settable region size
tonyp
parents: 866
diff changeset
31 int HeapRegion::GrainWords = 0;
2c79770d1f6e 6819085: G1: use larger and/or user settable region size
tonyp
parents: 866
diff changeset
32 int HeapRegion::CardsPerRegion = 0;
2c79770d1f6e 6819085: G1: use larger and/or user settable region size
tonyp
parents: 866
diff changeset
33
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
34 HeapRegionDCTOC::HeapRegionDCTOC(G1CollectedHeap* g1,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
35 HeapRegion* hr, OopClosure* cl,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
36 CardTableModRefBS::PrecisionStyle precision,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
37 FilterKind fk) :
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
38 ContiguousSpaceDCTOC(hr, cl, precision, NULL),
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
39 _hr(hr), _fk(fk), _g1(g1)
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
40 {}
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
41
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
42 FilterOutOfRegionClosure::FilterOutOfRegionClosure(HeapRegion* r,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
43 OopClosure* oc) :
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
44 _r_bottom(r->bottom()), _r_end(r->end()),
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
45 _oc(oc), _out_of_region(0)
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
46 {}
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
47
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
48 class VerifyLiveClosure: public OopClosure {
811
830ca2573896 6850846: G1: extend G1 marking verification
tonyp
parents: 796
diff changeset
49 private:
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
50 G1CollectedHeap* _g1h;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
51 CardTableModRefBS* _bs;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
52 oop _containing_obj;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
53 bool _failures;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
54 int _n_failures;
811
830ca2573896 6850846: G1: extend G1 marking verification
tonyp
parents: 796
diff changeset
55 bool _use_prev_marking;
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
56 public:
811
830ca2573896 6850846: G1: extend G1 marking verification
tonyp
parents: 796
diff changeset
57 // use_prev_marking == true -> use "prev" marking information,
830ca2573896 6850846: G1: extend G1 marking verification
tonyp
parents: 796
diff changeset
58 // use_prev_marking == false -> use "next" marking information
830ca2573896 6850846: G1: extend G1 marking verification
tonyp
parents: 796
diff changeset
59 VerifyLiveClosure(G1CollectedHeap* g1h, bool use_prev_marking) :
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
60 _g1h(g1h), _bs(NULL), _containing_obj(NULL),
811
830ca2573896 6850846: G1: extend G1 marking verification
tonyp
parents: 796
diff changeset
61 _failures(false), _n_failures(0), _use_prev_marking(use_prev_marking)
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
62 {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
63 BarrierSet* bs = _g1h->barrier_set();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
64 if (bs->is_a(BarrierSet::CardTableModRef))
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
65 _bs = (CardTableModRefBS*)bs;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
66 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
67
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
68 void set_containing_obj(oop obj) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
69 _containing_obj = obj;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
70 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
71
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
72 bool failures() { return _failures; }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
73 int n_failures() { return _n_failures; }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
74
845
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
75 virtual void do_oop(narrowOop* p) { do_oop_work(p); }
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
76 virtual void do_oop( oop* p) { do_oop_work(p); }
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
77
1388
7666957bc44d 6937142: G1: improvements to debugging output (S-M)
tonyp
parents: 1020
diff changeset
78 void print_object(outputStream* out, oop obj) {
7666957bc44d 6937142: G1: improvements to debugging output (S-M)
tonyp
parents: 1020
diff changeset
79 #ifdef PRODUCT
7666957bc44d 6937142: G1: improvements to debugging output (S-M)
tonyp
parents: 1020
diff changeset
80 klassOop k = obj->klass();
7666957bc44d 6937142: G1: improvements to debugging output (S-M)
tonyp
parents: 1020
diff changeset
81 const char* class_name = instanceKlass::cast(k)->external_name();
7666957bc44d 6937142: G1: improvements to debugging output (S-M)
tonyp
parents: 1020
diff changeset
82 out->print_cr("class name %s", class_name);
7666957bc44d 6937142: G1: improvements to debugging output (S-M)
tonyp
parents: 1020
diff changeset
83 #else // PRODUCT
7666957bc44d 6937142: G1: improvements to debugging output (S-M)
tonyp
parents: 1020
diff changeset
84 obj->print_on(out);
7666957bc44d 6937142: G1: improvements to debugging output (S-M)
tonyp
parents: 1020
diff changeset
85 #endif // PRODUCT
7666957bc44d 6937142: G1: improvements to debugging output (S-M)
tonyp
parents: 1020
diff changeset
86 }
7666957bc44d 6937142: G1: improvements to debugging output (S-M)
tonyp
parents: 1020
diff changeset
87
845
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
88 template <class T> void do_oop_work(T* p) {
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
89 assert(_containing_obj != NULL, "Precondition");
811
830ca2573896 6850846: G1: extend G1 marking verification
tonyp
parents: 796
diff changeset
90 assert(!_g1h->is_obj_dead_cond(_containing_obj, _use_prev_marking),
830ca2573896 6850846: G1: extend G1 marking verification
tonyp
parents: 796
diff changeset
91 "Precondition");
845
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
92 T heap_oop = oopDesc::load_heap_oop(p);
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
93 if (!oopDesc::is_null(heap_oop)) {
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
94 oop obj = oopDesc::decode_heap_oop_not_null(heap_oop);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
95 bool failed = false;
811
830ca2573896 6850846: G1: extend G1 marking verification
tonyp
parents: 796
diff changeset
96 if (!_g1h->is_in_closed_subset(obj) ||
830ca2573896 6850846: G1: extend G1 marking verification
tonyp
parents: 796
diff changeset
97 _g1h->is_obj_dead_cond(obj, _use_prev_marking)) {
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
98 if (!_failures) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
99 gclog_or_tty->print_cr("");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
100 gclog_or_tty->print_cr("----------");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
101 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
102 if (!_g1h->is_in_closed_subset(obj)) {
1388
7666957bc44d 6937142: G1: improvements to debugging output (S-M)
tonyp
parents: 1020
diff changeset
103 HeapRegion* from = _g1h->heap_region_containing((HeapWord*)p);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
104 gclog_or_tty->print_cr("Field "PTR_FORMAT
1388
7666957bc44d 6937142: G1: improvements to debugging output (S-M)
tonyp
parents: 1020
diff changeset
105 " of live obj "PTR_FORMAT" in region "
7666957bc44d 6937142: G1: improvements to debugging output (S-M)
tonyp
parents: 1020
diff changeset
106 "["PTR_FORMAT", "PTR_FORMAT")",
7666957bc44d 6937142: G1: improvements to debugging output (S-M)
tonyp
parents: 1020
diff changeset
107 p, (void*) _containing_obj,
7666957bc44d 6937142: G1: improvements to debugging output (S-M)
tonyp
parents: 1020
diff changeset
108 from->bottom(), from->end());
7666957bc44d 6937142: G1: improvements to debugging output (S-M)
tonyp
parents: 1020
diff changeset
109 print_object(gclog_or_tty, _containing_obj);
7666957bc44d 6937142: G1: improvements to debugging output (S-M)
tonyp
parents: 1020
diff changeset
110 gclog_or_tty->print_cr("points to obj "PTR_FORMAT" not in the heap",
7666957bc44d 6937142: G1: improvements to debugging output (S-M)
tonyp
parents: 1020
diff changeset
111 (void*) obj);
7666957bc44d 6937142: G1: improvements to debugging output (S-M)
tonyp
parents: 1020
diff changeset
112 } else {
7666957bc44d 6937142: G1: improvements to debugging output (S-M)
tonyp
parents: 1020
diff changeset
113 HeapRegion* from = _g1h->heap_region_containing((HeapWord*)p);
7666957bc44d 6937142: G1: improvements to debugging output (S-M)
tonyp
parents: 1020
diff changeset
114 HeapRegion* to = _g1h->heap_region_containing((HeapWord*)obj);
7666957bc44d 6937142: G1: improvements to debugging output (S-M)
tonyp
parents: 1020
diff changeset
115 gclog_or_tty->print_cr("Field "PTR_FORMAT
7666957bc44d 6937142: G1: improvements to debugging output (S-M)
tonyp
parents: 1020
diff changeset
116 " of live obj "PTR_FORMAT" in region "
7666957bc44d 6937142: G1: improvements to debugging output (S-M)
tonyp
parents: 1020
diff changeset
117 "["PTR_FORMAT", "PTR_FORMAT")",
7666957bc44d 6937142: G1: improvements to debugging output (S-M)
tonyp
parents: 1020
diff changeset
118 p, (void*) _containing_obj,
7666957bc44d 6937142: G1: improvements to debugging output (S-M)
tonyp
parents: 1020
diff changeset
119 from->bottom(), from->end());
7666957bc44d 6937142: G1: improvements to debugging output (S-M)
tonyp
parents: 1020
diff changeset
120 print_object(gclog_or_tty, _containing_obj);
7666957bc44d 6937142: G1: improvements to debugging output (S-M)
tonyp
parents: 1020
diff changeset
121 gclog_or_tty->print_cr("points to dead obj "PTR_FORMAT" in region "
7666957bc44d 6937142: G1: improvements to debugging output (S-M)
tonyp
parents: 1020
diff changeset
122 "["PTR_FORMAT", "PTR_FORMAT")",
7666957bc44d 6937142: G1: improvements to debugging output (S-M)
tonyp
parents: 1020
diff changeset
123 (void*) obj, to->bottom(), to->end());
7666957bc44d 6937142: G1: improvements to debugging output (S-M)
tonyp
parents: 1020
diff changeset
124 print_object(gclog_or_tty, obj);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
125 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
126 gclog_or_tty->print_cr("----------");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
127 _failures = true;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
128 failed = true;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
129 _n_failures++;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
130 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
131
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
132 if (!_g1h->full_collection()) {
845
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
133 HeapRegion* from = _g1h->heap_region_containing((HeapWord*)p);
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
134 HeapRegion* to = _g1h->heap_region_containing(obj);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
135 if (from != NULL && to != NULL &&
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
136 from != to &&
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
137 !to->isHumongous()) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
138 jbyte cv_obj = *_bs->byte_for_const(_containing_obj);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
139 jbyte cv_field = *_bs->byte_for_const(p);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
140 const jbyte dirty = CardTableModRefBS::dirty_card_val();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
141
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
142 bool is_bad = !(from->is_young()
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
143 || to->rem_set()->contains_reference(p)
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
144 || !G1HRRSFlushLogBuffersOnVerify && // buffers were not flushed
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
145 (_containing_obj->is_objArray() ?
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
146 cv_field == dirty
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
147 : cv_obj == dirty || cv_field == dirty));
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
148 if (is_bad) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
149 if (!_failures) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
150 gclog_or_tty->print_cr("");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
151 gclog_or_tty->print_cr("----------");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
152 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
153 gclog_or_tty->print_cr("Missing rem set entry:");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
154 gclog_or_tty->print_cr("Field "PTR_FORMAT
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
155 " of obj "PTR_FORMAT
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
156 ", in region %d ["PTR_FORMAT
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
157 ", "PTR_FORMAT"),",
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
158 p, (void*) _containing_obj,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
159 from->hrs_index(),
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
160 from->bottom(),
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
161 from->end());
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
162 _containing_obj->print_on(gclog_or_tty);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
163 gclog_or_tty->print_cr("points to obj "PTR_FORMAT
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
164 " in region %d ["PTR_FORMAT
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
165 ", "PTR_FORMAT").",
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
166 (void*) obj, to->hrs_index(),
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
167 to->bottom(), to->end());
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
168 obj->print_on(gclog_or_tty);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
169 gclog_or_tty->print_cr("Obj head CTE = %d, field CTE = %d.",
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
170 cv_obj, cv_field);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
171 gclog_or_tty->print_cr("----------");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
172 _failures = true;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
173 if (!failed) _n_failures++;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
174 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
175 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
176 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
177 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
178 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
179 };
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
180
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
181 template<class ClosureType>
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
182 HeapWord* walk_mem_region_loop(ClosureType* cl, G1CollectedHeap* g1h,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
183 HeapRegion* hr,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
184 HeapWord* cur, HeapWord* top) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
185 oop cur_oop = oop(cur);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
186 int oop_size = cur_oop->size();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
187 HeapWord* next_obj = cur + oop_size;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
188 while (next_obj < top) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
189 // Keep filtering the remembered set.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
190 if (!g1h->is_obj_dead(cur_oop, hr)) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
191 // Bottom lies entirely below top, so we can call the
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
192 // non-memRegion version of oop_iterate below.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
193 cur_oop->oop_iterate(cl);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
194 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
195 cur = next_obj;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
196 cur_oop = oop(cur);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
197 oop_size = cur_oop->size();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
198 next_obj = cur + oop_size;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
199 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
200 return cur;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
201 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
202
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
203 void HeapRegionDCTOC::walk_mem_region_with_cl(MemRegion mr,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
204 HeapWord* bottom,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
205 HeapWord* top,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
206 OopClosure* cl) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
207 G1CollectedHeap* g1h = _g1;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
208
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
209 int oop_size;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
210
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
211 OopClosure* cl2 = cl;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
212 FilterIntoCSClosure intoCSFilt(this, g1h, cl);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
213 FilterOutOfRegionClosure outOfRegionFilt(_hr, cl);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
214 switch (_fk) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
215 case IntoCSFilterKind: cl2 = &intoCSFilt; break;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
216 case OutOfRegionFilterKind: cl2 = &outOfRegionFilt; break;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
217 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
218
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
219 // Start filtering what we add to the remembered set. If the object is
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
220 // not considered dead, either because it is marked (in the mark bitmap)
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
221 // or it was allocated after marking finished, then we add it. Otherwise
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
222 // we can safely ignore the object.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
223 if (!g1h->is_obj_dead(oop(bottom), _hr)) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
224 oop_size = oop(bottom)->oop_iterate(cl2, mr);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
225 } else {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
226 oop_size = oop(bottom)->size();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
227 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
228
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
229 bottom += oop_size;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
230
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
231 if (bottom < top) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
232 // We replicate the loop below for several kinds of possible filters.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
233 switch (_fk) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
234 case NoFilterKind:
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
235 bottom = walk_mem_region_loop(cl, g1h, _hr, bottom, top);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
236 break;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
237 case IntoCSFilterKind: {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
238 FilterIntoCSClosure filt(this, g1h, cl);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
239 bottom = walk_mem_region_loop(&filt, g1h, _hr, bottom, top);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
240 break;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
241 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
242 case OutOfRegionFilterKind: {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
243 FilterOutOfRegionClosure filt(_hr, cl);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
244 bottom = walk_mem_region_loop(&filt, g1h, _hr, bottom, top);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
245 break;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
246 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
247 default:
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
248 ShouldNotReachHere();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
249 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
250
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
251 // Last object. Need to do dead-obj filtering here too.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
252 if (!g1h->is_obj_dead(oop(bottom), _hr)) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
253 oop(bottom)->oop_iterate(cl2, mr);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
254 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
255 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
256 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
257
942
2c79770d1f6e 6819085: G1: use larger and/or user settable region size
tonyp
parents: 866
diff changeset
258 // Minimum region size; we won't go lower than that.
2c79770d1f6e 6819085: G1: use larger and/or user settable region size
tonyp
parents: 866
diff changeset
259 // We might want to decrease this in the future, to deal with small
2c79770d1f6e 6819085: G1: use larger and/or user settable region size
tonyp
parents: 866
diff changeset
260 // heaps a bit more efficiently.
2c79770d1f6e 6819085: G1: use larger and/or user settable region size
tonyp
parents: 866
diff changeset
261 #define MIN_REGION_SIZE ( 1024 * 1024 )
2c79770d1f6e 6819085: G1: use larger and/or user settable region size
tonyp
parents: 866
diff changeset
262
2c79770d1f6e 6819085: G1: use larger and/or user settable region size
tonyp
parents: 866
diff changeset
263 // Maximum region size; we don't go higher than that. There's a good
2c79770d1f6e 6819085: G1: use larger and/or user settable region size
tonyp
parents: 866
diff changeset
264 // reason for having an upper bound. We don't want regions to get too
2c79770d1f6e 6819085: G1: use larger and/or user settable region size
tonyp
parents: 866
diff changeset
265 // large, otherwise cleanup's effectiveness would decrease as there
2c79770d1f6e 6819085: G1: use larger and/or user settable region size
tonyp
parents: 866
diff changeset
266 // will be fewer opportunities to find totally empty regions after
2c79770d1f6e 6819085: G1: use larger and/or user settable region size
tonyp
parents: 866
diff changeset
267 // marking.
2c79770d1f6e 6819085: G1: use larger and/or user settable region size
tonyp
parents: 866
diff changeset
268 #define MAX_REGION_SIZE ( 32 * 1024 * 1024 )
2c79770d1f6e 6819085: G1: use larger and/or user settable region size
tonyp
parents: 866
diff changeset
269
2c79770d1f6e 6819085: G1: use larger and/or user settable region size
tonyp
parents: 866
diff changeset
270 // The automatic region size calculation will try to have around this
2c79770d1f6e 6819085: G1: use larger and/or user settable region size
tonyp
parents: 866
diff changeset
271 // many regions in the heap (based on the min heap size).
2c79770d1f6e 6819085: G1: use larger and/or user settable region size
tonyp
parents: 866
diff changeset
272 #define TARGET_REGION_NUMBER 2048
2c79770d1f6e 6819085: G1: use larger and/or user settable region size
tonyp
parents: 866
diff changeset
273
2c79770d1f6e 6819085: G1: use larger and/or user settable region size
tonyp
parents: 866
diff changeset
274 void HeapRegion::setup_heap_region_size(uintx min_heap_size) {
2c79770d1f6e 6819085: G1: use larger and/or user settable region size
tonyp
parents: 866
diff changeset
275 // region_size in bytes
2c79770d1f6e 6819085: G1: use larger and/or user settable region size
tonyp
parents: 866
diff changeset
276 uintx region_size = G1HeapRegionSize;
2c79770d1f6e 6819085: G1: use larger and/or user settable region size
tonyp
parents: 866
diff changeset
277 if (FLAG_IS_DEFAULT(G1HeapRegionSize)) {
2c79770d1f6e 6819085: G1: use larger and/or user settable region size
tonyp
parents: 866
diff changeset
278 // We base the automatic calculation on the min heap size. This
2c79770d1f6e 6819085: G1: use larger and/or user settable region size
tonyp
parents: 866
diff changeset
279 // can be problematic if the spread between min and max is quite
2c79770d1f6e 6819085: G1: use larger and/or user settable region size
tonyp
parents: 866
diff changeset
280 // wide, imagine -Xms128m -Xmx32g. But, if we decided it based on
2c79770d1f6e 6819085: G1: use larger and/or user settable region size
tonyp
parents: 866
diff changeset
281 // the max size, the region size might be way too large for the
2c79770d1f6e 6819085: G1: use larger and/or user settable region size
tonyp
parents: 866
diff changeset
282 // min size. Either way, some users might have to set the region
2c79770d1f6e 6819085: G1: use larger and/or user settable region size
tonyp
parents: 866
diff changeset
283 // size manually for some -Xms / -Xmx combos.
2c79770d1f6e 6819085: G1: use larger and/or user settable region size
tonyp
parents: 866
diff changeset
284
2c79770d1f6e 6819085: G1: use larger and/or user settable region size
tonyp
parents: 866
diff changeset
285 region_size = MAX2(min_heap_size / TARGET_REGION_NUMBER,
2c79770d1f6e 6819085: G1: use larger and/or user settable region size
tonyp
parents: 866
diff changeset
286 (uintx) MIN_REGION_SIZE);
2c79770d1f6e 6819085: G1: use larger and/or user settable region size
tonyp
parents: 866
diff changeset
287 }
2c79770d1f6e 6819085: G1: use larger and/or user settable region size
tonyp
parents: 866
diff changeset
288
2c79770d1f6e 6819085: G1: use larger and/or user settable region size
tonyp
parents: 866
diff changeset
289 int region_size_log = log2_long((jlong) region_size);
2c79770d1f6e 6819085: G1: use larger and/or user settable region size
tonyp
parents: 866
diff changeset
290 // Recalculate the region size to make sure it's a power of
2c79770d1f6e 6819085: G1: use larger and/or user settable region size
tonyp
parents: 866
diff changeset
291 // 2. This means that region_size is the largest power of 2 that's
2c79770d1f6e 6819085: G1: use larger and/or user settable region size
tonyp
parents: 866
diff changeset
292 // <= what we've calculated so far.
1485
fb57d4cf76c2 6931180: Migration to recent versions of MS Platform SDK
prr
parents: 1394
diff changeset
293 region_size = ((uintx)1 << region_size_log);
942
2c79770d1f6e 6819085: G1: use larger and/or user settable region size
tonyp
parents: 866
diff changeset
294
2c79770d1f6e 6819085: G1: use larger and/or user settable region size
tonyp
parents: 866
diff changeset
295 // Now make sure that we don't go over or under our limits.
2c79770d1f6e 6819085: G1: use larger and/or user settable region size
tonyp
parents: 866
diff changeset
296 if (region_size < MIN_REGION_SIZE) {
2c79770d1f6e 6819085: G1: use larger and/or user settable region size
tonyp
parents: 866
diff changeset
297 region_size = MIN_REGION_SIZE;
2c79770d1f6e 6819085: G1: use larger and/or user settable region size
tonyp
parents: 866
diff changeset
298 } else if (region_size > MAX_REGION_SIZE) {
2c79770d1f6e 6819085: G1: use larger and/or user settable region size
tonyp
parents: 866
diff changeset
299 region_size = MAX_REGION_SIZE;
2c79770d1f6e 6819085: G1: use larger and/or user settable region size
tonyp
parents: 866
diff changeset
300 }
2c79770d1f6e 6819085: G1: use larger and/or user settable region size
tonyp
parents: 866
diff changeset
301
2c79770d1f6e 6819085: G1: use larger and/or user settable region size
tonyp
parents: 866
diff changeset
302 // And recalculate the log.
2c79770d1f6e 6819085: G1: use larger and/or user settable region size
tonyp
parents: 866
diff changeset
303 region_size_log = log2_long((jlong) region_size);
2c79770d1f6e 6819085: G1: use larger and/or user settable region size
tonyp
parents: 866
diff changeset
304
2c79770d1f6e 6819085: G1: use larger and/or user settable region size
tonyp
parents: 866
diff changeset
305 // Now, set up the globals.
2c79770d1f6e 6819085: G1: use larger and/or user settable region size
tonyp
parents: 866
diff changeset
306 guarantee(LogOfHRGrainBytes == 0, "we should only set it once");
2c79770d1f6e 6819085: G1: use larger and/or user settable region size
tonyp
parents: 866
diff changeset
307 LogOfHRGrainBytes = region_size_log;
2c79770d1f6e 6819085: G1: use larger and/or user settable region size
tonyp
parents: 866
diff changeset
308
2c79770d1f6e 6819085: G1: use larger and/or user settable region size
tonyp
parents: 866
diff changeset
309 guarantee(LogOfHRGrainWords == 0, "we should only set it once");
2c79770d1f6e 6819085: G1: use larger and/or user settable region size
tonyp
parents: 866
diff changeset
310 LogOfHRGrainWords = LogOfHRGrainBytes - LogHeapWordSize;
2c79770d1f6e 6819085: G1: use larger and/or user settable region size
tonyp
parents: 866
diff changeset
311
2c79770d1f6e 6819085: G1: use larger and/or user settable region size
tonyp
parents: 866
diff changeset
312 guarantee(GrainBytes == 0, "we should only set it once");
2c79770d1f6e 6819085: G1: use larger and/or user settable region size
tonyp
parents: 866
diff changeset
313 // The cast to int is safe, given that we've bounded region_size by
2c79770d1f6e 6819085: G1: use larger and/or user settable region size
tonyp
parents: 866
diff changeset
314 // MIN_REGION_SIZE and MAX_REGION_SIZE.
2c79770d1f6e 6819085: G1: use larger and/or user settable region size
tonyp
parents: 866
diff changeset
315 GrainBytes = (int) region_size;
2c79770d1f6e 6819085: G1: use larger and/or user settable region size
tonyp
parents: 866
diff changeset
316
2c79770d1f6e 6819085: G1: use larger and/or user settable region size
tonyp
parents: 866
diff changeset
317 guarantee(GrainWords == 0, "we should only set it once");
2c79770d1f6e 6819085: G1: use larger and/or user settable region size
tonyp
parents: 866
diff changeset
318 GrainWords = GrainBytes >> LogHeapWordSize;
2c79770d1f6e 6819085: G1: use larger and/or user settable region size
tonyp
parents: 866
diff changeset
319 guarantee(1 << LogOfHRGrainWords == GrainWords, "sanity");
2c79770d1f6e 6819085: G1: use larger and/or user settable region size
tonyp
parents: 866
diff changeset
320
2c79770d1f6e 6819085: G1: use larger and/or user settable region size
tonyp
parents: 866
diff changeset
321 guarantee(CardsPerRegion == 0, "we should only set it once");
2c79770d1f6e 6819085: G1: use larger and/or user settable region size
tonyp
parents: 866
diff changeset
322 CardsPerRegion = GrainBytes >> CardTableModRefBS::card_shift;
2c79770d1f6e 6819085: G1: use larger and/or user settable region size
tonyp
parents: 866
diff changeset
323 }
2c79770d1f6e 6819085: G1: use larger and/or user settable region size
tonyp
parents: 866
diff changeset
324
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
325 void HeapRegion::reset_after_compaction() {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
326 G1OffsetTableContigSpace::reset_after_compaction();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
327 // After a compaction the mark bitmap is invalid, so we must
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
328 // treat all objects as being inside the unmarked area.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
329 zero_marked_bytes();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
330 init_top_at_mark_start();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
331 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
332
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
333 DirtyCardToOopClosure*
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
334 HeapRegion::new_dcto_closure(OopClosure* cl,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
335 CardTableModRefBS::PrecisionStyle precision,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
336 HeapRegionDCTOC::FilterKind fk) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
337 return new HeapRegionDCTOC(G1CollectedHeap::heap(),
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
338 this, cl, precision, fk);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
339 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
340
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
341 void HeapRegion::hr_clear(bool par, bool clear_space) {
355
0edda524b58c 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 353
diff changeset
342 _humongous_type = NotHumongous;
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
343 _humongous_start_region = NULL;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
344 _in_collection_set = false;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
345 _is_gc_alloc_region = false;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
346
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
347 // Age stuff (if parallel, this will be done separately, since it needs
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
348 // to be sequential).
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
349 G1CollectedHeap* g1h = G1CollectedHeap::heap();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
350
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
351 set_young_index_in_cset(-1);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
352 uninstall_surv_rate_group();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
353 set_young_type(NotYoung);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
354
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
355 // In case it had been the start of a humongous sequence, reset its end.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
356 set_end(_orig_end);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
357
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
358 if (!par) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
359 // If this is parallel, this will be done later.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
360 HeapRegionRemSet* hrrs = rem_set();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
361 if (hrrs != NULL) hrrs->clear();
355
0edda524b58c 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 353
diff changeset
362 _claimed = InitialClaimValue;
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
363 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
364 zero_marked_bytes();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
365 set_sort_index(-1);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
366
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
367 _offsets.resize(HeapRegion::GrainWords);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
368 init_top_at_mark_start();
356
tonyp
parents: 355
diff changeset
369 if (clear_space) clear(SpaceDecorator::Mangle);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
370 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
371
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
372 // <PREDICTION>
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
373 void HeapRegion::calc_gc_efficiency() {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
374 G1CollectedHeap* g1h = G1CollectedHeap::heap();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
375 _gc_efficiency = (double) garbage_bytes() /
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
376 g1h->predict_region_elapsed_time_ms(this, false);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
377 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
378 // </PREDICTION>
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
379
1886
72a161e62cc4 6991377: G1: race between concurrent refinement and humongous object allocation
tonyp
parents: 1718
diff changeset
380 void HeapRegion::set_startsHumongous(HeapWord* new_end) {
72a161e62cc4 6991377: G1: race between concurrent refinement and humongous object allocation
tonyp
parents: 1718
diff changeset
381 assert(end() == _orig_end,
72a161e62cc4 6991377: G1: race between concurrent refinement and humongous object allocation
tonyp
parents: 1718
diff changeset
382 "Should be normal before the humongous object allocation");
72a161e62cc4 6991377: G1: race between concurrent refinement and humongous object allocation
tonyp
parents: 1718
diff changeset
383 assert(top() == bottom(), "should be empty");
72a161e62cc4 6991377: G1: race between concurrent refinement and humongous object allocation
tonyp
parents: 1718
diff changeset
384
355
0edda524b58c 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 353
diff changeset
385 _humongous_type = StartsHumongous;
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
386 _humongous_start_region = this;
1886
72a161e62cc4 6991377: G1: race between concurrent refinement and humongous object allocation
tonyp
parents: 1718
diff changeset
387
72a161e62cc4 6991377: G1: race between concurrent refinement and humongous object allocation
tonyp
parents: 1718
diff changeset
388 set_end(new_end);
72a161e62cc4 6991377: G1: race between concurrent refinement and humongous object allocation
tonyp
parents: 1718
diff changeset
389 _offsets.set_for_starts_humongous(new_end);
72a161e62cc4 6991377: G1: race between concurrent refinement and humongous object allocation
tonyp
parents: 1718
diff changeset
390 }
72a161e62cc4 6991377: G1: race between concurrent refinement and humongous object allocation
tonyp
parents: 1718
diff changeset
391
72a161e62cc4 6991377: G1: race between concurrent refinement and humongous object allocation
tonyp
parents: 1718
diff changeset
392 void HeapRegion::set_continuesHumongous(HeapRegion* start) {
72a161e62cc4 6991377: G1: race between concurrent refinement and humongous object allocation
tonyp
parents: 1718
diff changeset
393 assert(end() == _orig_end,
72a161e62cc4 6991377: G1: race between concurrent refinement and humongous object allocation
tonyp
parents: 1718
diff changeset
394 "Should be normal before the humongous object allocation");
72a161e62cc4 6991377: G1: race between concurrent refinement and humongous object allocation
tonyp
parents: 1718
diff changeset
395 assert(top() == bottom(), "should be empty");
72a161e62cc4 6991377: G1: race between concurrent refinement and humongous object allocation
tonyp
parents: 1718
diff changeset
396 assert(start->startsHumongous(), "pre-condition");
72a161e62cc4 6991377: G1: race between concurrent refinement and humongous object allocation
tonyp
parents: 1718
diff changeset
397
72a161e62cc4 6991377: G1: race between concurrent refinement and humongous object allocation
tonyp
parents: 1718
diff changeset
398 _humongous_type = ContinuesHumongous;
72a161e62cc4 6991377: G1: race between concurrent refinement and humongous object allocation
tonyp
parents: 1718
diff changeset
399 _humongous_start_region = start;
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
400 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
401
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
402 bool HeapRegion::claimHeapRegion(jint claimValue) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
403 jint current = _claimed;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
404 if (current != claimValue) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
405 jint res = Atomic::cmpxchg(claimValue, &_claimed, current);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
406 if (res == current) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
407 return true;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
408 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
409 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
410 return false;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
411 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
412
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
413 HeapWord* HeapRegion::next_block_start_careful(HeapWord* addr) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
414 HeapWord* low = addr;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
415 HeapWord* high = end();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
416 while (low < high) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
417 size_t diff = pointer_delta(high, low);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
418 // Must add one below to bias toward the high amount. Otherwise, if
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
419 // "high" were at the desired value, and "low" were one less, we
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
420 // would not converge on "high". This is not symmetric, because
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
421 // we set "high" to a block start, which might be the right one,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
422 // which we don't do for "low".
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
423 HeapWord* middle = low + (diff+1)/2;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
424 if (middle == high) return high;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
425 HeapWord* mid_bs = block_start_careful(middle);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
426 if (mid_bs < addr) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
427 low = middle;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
428 } else {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
429 high = mid_bs;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
430 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
431 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
432 assert(low == high && low >= addr, "Didn't work.");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
433 return low;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
434 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
435
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
436 void HeapRegion::set_next_on_unclean_list(HeapRegion* r) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
437 assert(r == NULL || r->is_on_unclean_list(), "Malformed unclean list.");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
438 _next_in_special_set = r;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
439 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
440
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
441 void HeapRegion::set_on_unclean_list(bool b) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
442 _is_on_unclean_list = b;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
443 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
444
356
tonyp
parents: 355
diff changeset
445 void HeapRegion::initialize(MemRegion mr, bool clear_space, bool mangle_space) {
tonyp
parents: 355
diff changeset
446 G1OffsetTableContigSpace::initialize(mr, false, mangle_space);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
447 hr_clear(false/*par*/, clear_space);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
448 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
449 #ifdef _MSC_VER // the use of 'this' below gets a warning, make it go away
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
450 #pragma warning( disable:4355 ) // 'this' : used in base member initializer list
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
451 #endif // _MSC_VER
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
452
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
453
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
454 HeapRegion::
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
455 HeapRegion(G1BlockOffsetSharedArray* sharedOffsetArray,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
456 MemRegion mr, bool is_zeroed)
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
457 : G1OffsetTableContigSpace(sharedOffsetArray, mr, is_zeroed),
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
458 _next_fk(HeapRegionDCTOC::NoFilterKind),
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
459 _hrs_index(-1),
355
0edda524b58c 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 353
diff changeset
460 _humongous_type(NotHumongous), _humongous_start_region(NULL),
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
461 _in_collection_set(false), _is_gc_alloc_region(false),
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
462 _is_on_free_list(false), _is_on_unclean_list(false),
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
463 _next_in_special_set(NULL), _orig_end(NULL),
355
0edda524b58c 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 353
diff changeset
464 _claimed(InitialClaimValue), _evacuation_failed(false),
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
465 _prev_marked_bytes(0), _next_marked_bytes(0), _sort_index(-1),
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
466 _young_type(NotYoung), _next_young_region(NULL),
796
29e7d79232b9 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 751
diff changeset
467 _next_dirty_cards_region(NULL),
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
468 _young_index_in_cset(-1), _surv_rate_group(NULL), _age_index(-1),
1394
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1388
diff changeset
469 _rem_set(NULL), _zfs(NotZeroFilled),
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1388
diff changeset
470 _recorded_rs_length(0), _predicted_elapsed_time_ms(0),
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1388
diff changeset
471 _predicted_bytes_to_copy(0)
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
472 {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
473 _orig_end = mr.end();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
474 // Note that initialize() will set the start of the unmarked area of the
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
475 // region.
356
tonyp
parents: 355
diff changeset
476 this->initialize(mr, !is_zeroed, SpaceDecorator::Mangle);
tonyp
parents: 355
diff changeset
477 set_top(bottom());
tonyp
parents: 355
diff changeset
478 set_saved_mark();
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
479
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
480 _rem_set = new HeapRegionRemSet(sharedOffsetArray, this);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
481
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
482 assert(HeapRegionRemSet::num_par_rem_sets() > 0, "Invariant.");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
483 // In case the region is allocated during a pause, note the top.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
484 // We haven't done any counting on a brand new region.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
485 _top_at_conc_mark_count = bottom();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
486 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
487
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
488 class NextCompactionHeapRegionClosure: public HeapRegionClosure {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
489 const HeapRegion* _target;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
490 bool _target_seen;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
491 HeapRegion* _last;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
492 CompactibleSpace* _res;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
493 public:
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
494 NextCompactionHeapRegionClosure(const HeapRegion* target) :
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
495 _target(target), _target_seen(false), _res(NULL) {}
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
496 bool doHeapRegion(HeapRegion* cur) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
497 if (_target_seen) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
498 if (!cur->isHumongous()) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
499 _res = cur;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
500 return true;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
501 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
502 } else if (cur == _target) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
503 _target_seen = true;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
504 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
505 return false;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
506 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
507 CompactibleSpace* result() { return _res; }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
508 };
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
509
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
510 CompactibleSpace* HeapRegion::next_compaction_space() const {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
511 G1CollectedHeap* g1h = G1CollectedHeap::heap();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
512 // cast away const-ness
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
513 HeapRegion* r = (HeapRegion*) this;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
514 NextCompactionHeapRegionClosure blk(r);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
515 g1h->heap_region_iterate_from(r, &blk);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
516 return blk.result();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
517 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
518
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
519 void HeapRegion::save_marks() {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
520 set_saved_mark();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
521 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
522
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
523 void HeapRegion::oops_in_mr_iterate(MemRegion mr, OopClosure* cl) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
524 HeapWord* p = mr.start();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
525 HeapWord* e = mr.end();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
526 oop obj;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
527 while (p < e) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
528 obj = oop(p);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
529 p += obj->oop_iterate(cl);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
530 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
531 assert(p == e, "bad memregion: doesn't end on obj boundary");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
532 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
533
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
534 #define HeapRegion_OOP_SINCE_SAVE_MARKS_DEFN(OopClosureType, nv_suffix) \
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
535 void HeapRegion::oop_since_save_marks_iterate##nv_suffix(OopClosureType* cl) { \
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
536 ContiguousSpace::oop_since_save_marks_iterate##nv_suffix(cl); \
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
537 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
538 SPECIALIZED_SINCE_SAVE_MARKS_CLOSURES(HeapRegion_OOP_SINCE_SAVE_MARKS_DEFN)
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
539
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
540
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
541 void HeapRegion::oop_before_save_marks_iterate(OopClosure* cl) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
542 oops_in_mr_iterate(MemRegion(bottom(), saved_mark_word()), cl);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
543 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
544
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
545 #ifdef DEBUG
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
546 HeapWord* HeapRegion::allocate(size_t size) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
547 jint state = zero_fill_state();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
548 assert(!G1CollectedHeap::heap()->allocs_are_zero_filled() ||
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
549 zero_fill_is_allocated(),
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
550 "When ZF is on, only alloc in ZF'd regions");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
551 return G1OffsetTableContigSpace::allocate(size);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
552 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
553 #endif
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
554
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
555 void HeapRegion::set_zero_fill_state_work(ZeroFillState zfs) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
556 assert(ZF_mon->owned_by_self() ||
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
557 Universe::heap()->is_gc_active(),
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
558 "Must hold the lock or be a full GC to modify.");
1545
cc387008223e 6921317: (partial) G1: assert(top() == bottom() || zfs == Allocated,"Region must be empty, or we must be setting it to
apetrusenko
parents: 1394
diff changeset
559 #ifdef ASSERT
cc387008223e 6921317: (partial) G1: assert(top() == bottom() || zfs == Allocated,"Region must be empty, or we must be setting it to
apetrusenko
parents: 1394
diff changeset
560 if (top() != bottom() && zfs != Allocated) {
cc387008223e 6921317: (partial) G1: assert(top() == bottom() || zfs == Allocated,"Region must be empty, or we must be setting it to
apetrusenko
parents: 1394
diff changeset
561 ResourceMark rm;
cc387008223e 6921317: (partial) G1: assert(top() == bottom() || zfs == Allocated,"Region must be empty, or we must be setting it to
apetrusenko
parents: 1394
diff changeset
562 stringStream region_str;
cc387008223e 6921317: (partial) G1: assert(top() == bottom() || zfs == Allocated,"Region must be empty, or we must be setting it to
apetrusenko
parents: 1394
diff changeset
563 print_on(&region_str);
cc387008223e 6921317: (partial) G1: assert(top() == bottom() || zfs == Allocated,"Region must be empty, or we must be setting it to
apetrusenko
parents: 1394
diff changeset
564 assert(top() == bottom() || zfs == Allocated,
cc387008223e 6921317: (partial) G1: assert(top() == bottom() || zfs == Allocated,"Region must be empty, or we must be setting it to
apetrusenko
parents: 1394
diff changeset
565 err_msg("Region must be empty, or we must be setting it to allocated. "
cc387008223e 6921317: (partial) G1: assert(top() == bottom() || zfs == Allocated,"Region must be empty, or we must be setting it to
apetrusenko
parents: 1394
diff changeset
566 "_zfs=%d, zfs=%d, region: %s", _zfs, zfs, region_str.as_string()));
cc387008223e 6921317: (partial) G1: assert(top() == bottom() || zfs == Allocated,"Region must be empty, or we must be setting it to
apetrusenko
parents: 1394
diff changeset
567 }
cc387008223e 6921317: (partial) G1: assert(top() == bottom() || zfs == Allocated,"Region must be empty, or we must be setting it to
apetrusenko
parents: 1394
diff changeset
568 #endif
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
569 _zfs = zfs;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
570 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
571
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
572 void HeapRegion::set_zero_fill_complete() {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
573 set_zero_fill_state_work(ZeroFilled);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
574 if (ZF_mon->owned_by_self()) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
575 ZF_mon->notify_all();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
576 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
577 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
578
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
579
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
580 void HeapRegion::ensure_zero_filled() {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
581 MutexLockerEx x(ZF_mon, Mutex::_no_safepoint_check_flag);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
582 ensure_zero_filled_locked();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
583 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
584
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
585 void HeapRegion::ensure_zero_filled_locked() {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
586 assert(ZF_mon->owned_by_self(), "Precondition");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
587 bool should_ignore_zf = SafepointSynchronize::is_at_safepoint();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
588 assert(should_ignore_zf || Heap_lock->is_locked(),
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
589 "Either we're in a GC or we're allocating a region.");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
590 switch (zero_fill_state()) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
591 case HeapRegion::NotZeroFilled:
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
592 set_zero_fill_in_progress(Thread::current());
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
593 {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
594 ZF_mon->unlock();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
595 Copy::fill_to_words(bottom(), capacity()/HeapWordSize);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
596 ZF_mon->lock_without_safepoint_check();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
597 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
598 // A trap.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
599 guarantee(zero_fill_state() == HeapRegion::ZeroFilling
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
600 && zero_filler() == Thread::current(),
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
601 "AHA! Tell Dave D if you see this...");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
602 set_zero_fill_complete();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
603 // gclog_or_tty->print_cr("Did sync ZF.");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
604 ConcurrentZFThread::note_sync_zfs();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
605 break;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
606 case HeapRegion::ZeroFilling:
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
607 if (should_ignore_zf) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
608 // We can "break" the lock and take over the work.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
609 Copy::fill_to_words(bottom(), capacity()/HeapWordSize);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
610 set_zero_fill_complete();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
611 ConcurrentZFThread::note_sync_zfs();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
612 break;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
613 } else {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
614 ConcurrentZFThread::wait_for_ZF_completed(this);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
615 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
616 case HeapRegion::ZeroFilled:
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
617 // Nothing to do.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
618 break;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
619 case HeapRegion::Allocated:
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
620 guarantee(false, "Should not call on allocated regions.");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
621 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
622 assert(zero_fill_state() == HeapRegion::ZeroFilled, "Post");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
623 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
624
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
625 HeapWord*
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
626 HeapRegion::object_iterate_mem_careful(MemRegion mr,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
627 ObjectClosure* cl) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
628 G1CollectedHeap* g1h = G1CollectedHeap::heap();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
629 // We used to use "block_start_careful" here. But we're actually happy
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
630 // to update the BOT while we do this...
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
631 HeapWord* cur = block_start(mr.start());
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
632 mr = mr.intersection(used_region());
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
633 if (mr.is_empty()) return NULL;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
634 // Otherwise, find the obj that extends onto mr.start().
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
635
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
636 assert(cur <= mr.start()
845
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
637 && (oop(cur)->klass_or_null() == NULL ||
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
638 cur + oop(cur)->size() > mr.start()),
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
639 "postcondition of block_start");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
640 oop obj;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
641 while (cur < mr.end()) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
642 obj = oop(cur);
845
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
643 if (obj->klass_or_null() == NULL) {
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
644 // Ran into an unparseable point.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
645 return cur;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
646 } else if (!g1h->is_obj_dead(obj)) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
647 cl->do_object(obj);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
648 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
649 if (cl->abort()) return cur;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
650 // The check above must occur before the operation below, since an
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
651 // abort might invalidate the "size" operation.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
652 cur += obj->size();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
653 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
654 return NULL;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
655 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
656
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
657 HeapWord*
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
658 HeapRegion::
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
659 oops_on_card_seq_iterate_careful(MemRegion mr,
1666
5cbac8938c4c 6956639: G1: assert(cached_ptr != card_ptr) failed: shouldn't be, concurrentG1Refine.cpp:307
johnc
parents: 1552
diff changeset
660 FilterOutOfRegionClosure* cl,
5cbac8938c4c 6956639: G1: assert(cached_ptr != card_ptr) failed: shouldn't be, concurrentG1Refine.cpp:307
johnc
parents: 1552
diff changeset
661 bool filter_young) {
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
662 G1CollectedHeap* g1h = G1CollectedHeap::heap();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
663
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
664 // If we're within a stop-world GC, then we might look at a card in a
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
665 // GC alloc region that extends onto a GC LAB, which may not be
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
666 // parseable. Stop such at the "saved_mark" of the region.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
667 if (G1CollectedHeap::heap()->is_gc_active()) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
668 mr = mr.intersection(used_region_at_save_marks());
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
669 } else {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
670 mr = mr.intersection(used_region());
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
671 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
672 if (mr.is_empty()) return NULL;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
673 // Otherwise, find the obj that extends onto mr.start().
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
674
1666
5cbac8938c4c 6956639: G1: assert(cached_ptr != card_ptr) failed: shouldn't be, concurrentG1Refine.cpp:307
johnc
parents: 1552
diff changeset
675 // The intersection of the incoming mr (for the card) and the
5cbac8938c4c 6956639: G1: assert(cached_ptr != card_ptr) failed: shouldn't be, concurrentG1Refine.cpp:307
johnc
parents: 1552
diff changeset
676 // allocated part of the region is non-empty. This implies that
5cbac8938c4c 6956639: G1: assert(cached_ptr != card_ptr) failed: shouldn't be, concurrentG1Refine.cpp:307
johnc
parents: 1552
diff changeset
677 // we have actually allocated into this region. The code in
5cbac8938c4c 6956639: G1: assert(cached_ptr != card_ptr) failed: shouldn't be, concurrentG1Refine.cpp:307
johnc
parents: 1552
diff changeset
678 // G1CollectedHeap.cpp that allocates a new region sets the
5cbac8938c4c 6956639: G1: assert(cached_ptr != card_ptr) failed: shouldn't be, concurrentG1Refine.cpp:307
johnc
parents: 1552
diff changeset
679 // is_young tag on the region before allocating. Thus we
5cbac8938c4c 6956639: G1: assert(cached_ptr != card_ptr) failed: shouldn't be, concurrentG1Refine.cpp:307
johnc
parents: 1552
diff changeset
680 // safely know if this region is young.
5cbac8938c4c 6956639: G1: assert(cached_ptr != card_ptr) failed: shouldn't be, concurrentG1Refine.cpp:307
johnc
parents: 1552
diff changeset
681 if (is_young() && filter_young) {
5cbac8938c4c 6956639: G1: assert(cached_ptr != card_ptr) failed: shouldn't be, concurrentG1Refine.cpp:307
johnc
parents: 1552
diff changeset
682 return NULL;
5cbac8938c4c 6956639: G1: assert(cached_ptr != card_ptr) failed: shouldn't be, concurrentG1Refine.cpp:307
johnc
parents: 1552
diff changeset
683 }
5cbac8938c4c 6956639: G1: assert(cached_ptr != card_ptr) failed: shouldn't be, concurrentG1Refine.cpp:307
johnc
parents: 1552
diff changeset
684
1705
2d160770d2e5 6814437: G1: remove the _new_refs array
johnc
parents: 1666
diff changeset
685 assert(!is_young(), "check value of filter_young");
2d160770d2e5 6814437: G1: remove the _new_refs array
johnc
parents: 1666
diff changeset
686
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
687 // We used to use "block_start_careful" here. But we're actually happy
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
688 // to update the BOT while we do this...
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
689 HeapWord* cur = block_start(mr.start());
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
690 assert(cur <= mr.start(), "Postcondition");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
691
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
692 while (cur <= mr.start()) {
845
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
693 if (oop(cur)->klass_or_null() == NULL) {
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
694 // Ran into an unparseable point.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
695 return cur;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
696 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
697 // Otherwise...
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
698 int sz = oop(cur)->size();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
699 if (cur + sz > mr.start()) break;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
700 // Otherwise, go on.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
701 cur = cur + sz;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
702 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
703 oop obj;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
704 obj = oop(cur);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
705 // If we finish this loop...
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
706 assert(cur <= mr.start()
845
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
707 && obj->klass_or_null() != NULL
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
708 && cur + obj->size() > mr.start(),
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
709 "Loop postcondition");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
710 if (!g1h->is_obj_dead(obj)) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
711 obj->oop_iterate(cl, mr);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
712 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
713
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
714 HeapWord* next;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
715 while (cur < mr.end()) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
716 obj = oop(cur);
845
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
717 if (obj->klass_or_null() == NULL) {
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
718 // Ran into an unparseable point.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
719 return cur;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
720 };
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
721 // Otherwise:
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
722 next = (cur + obj->size());
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
723 if (!g1h->is_obj_dead(obj)) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
724 if (next < mr.end()) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
725 obj->oop_iterate(cl);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
726 } else {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
727 // this obj spans the boundary. If it's an array, stop at the
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
728 // boundary.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
729 if (obj->is_objArray()) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
730 obj->oop_iterate(cl, mr);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
731 } else {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
732 obj->oop_iterate(cl);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
733 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
734 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
735 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
736 cur = next;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
737 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
738 return NULL;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
739 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
740
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
741 void HeapRegion::print() const { print_on(gclog_or_tty); }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
742 void HeapRegion::print_on(outputStream* st) const {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
743 if (isHumongous()) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
744 if (startsHumongous())
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
745 st->print(" HS");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
746 else
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
747 st->print(" HC");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
748 } else {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
749 st->print(" ");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
750 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
751 if (in_collection_set())
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
752 st->print(" CS");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
753 else if (is_gc_alloc_region())
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
754 st->print(" A ");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
755 else
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
756 st->print(" ");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
757 if (is_young())
1394
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1388
diff changeset
758 st->print(is_survivor() ? " SU" : " Y ");
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
759 else
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
760 st->print(" ");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
761 if (is_empty())
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
762 st->print(" F");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
763 else
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
764 st->print(" ");
1020
ff2402f6a50b 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 942
diff changeset
765 st->print(" %5d", _gc_time_stamp);
1388
7666957bc44d 6937142: G1: improvements to debugging output (S-M)
tonyp
parents: 1020
diff changeset
766 st->print(" PTAMS "PTR_FORMAT" NTAMS "PTR_FORMAT,
7666957bc44d 6937142: G1: improvements to debugging output (S-M)
tonyp
parents: 1020
diff changeset
767 prev_top_at_mark_start(), next_top_at_mark_start());
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
768 G1OffsetTableContigSpace::print_on(st);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
769 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
770
811
830ca2573896 6850846: G1: extend G1 marking verification
tonyp
parents: 796
diff changeset
771 void HeapRegion::verify(bool allow_dirty) const {
1020
ff2402f6a50b 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 942
diff changeset
772 bool dummy = false;
ff2402f6a50b 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 942
diff changeset
773 verify(allow_dirty, /* use_prev_marking */ true, /* failures */ &dummy);
811
830ca2573896 6850846: G1: extend G1 marking verification
tonyp
parents: 796
diff changeset
774 }
830ca2573896 6850846: G1: extend G1 marking verification
tonyp
parents: 796
diff changeset
775
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
776 #define OBJ_SAMPLE_INTERVAL 0
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
777 #define BLOCK_SAMPLE_INTERVAL 100
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
778
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
779 // This really ought to be commoned up into OffsetTableContigSpace somehow.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
780 // We would need a mechanism to make that code skip dead objects.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
781
1020
ff2402f6a50b 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 942
diff changeset
782 void HeapRegion::verify(bool allow_dirty,
ff2402f6a50b 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 942
diff changeset
783 bool use_prev_marking,
ff2402f6a50b 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 942
diff changeset
784 bool* failures) const {
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
785 G1CollectedHeap* g1 = G1CollectedHeap::heap();
1020
ff2402f6a50b 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 942
diff changeset
786 *failures = false;
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
787 HeapWord* p = bottom();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
788 HeapWord* prev_p = NULL;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
789 int objs = 0;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
790 int blocks = 0;
811
830ca2573896 6850846: G1: extend G1 marking verification
tonyp
parents: 796
diff changeset
791 VerifyLiveClosure vl_cl(g1, use_prev_marking);
1718
bb847e31b836 6974928: G1: sometimes humongous objects are allocated in young regions
tonyp
parents: 1705
diff changeset
792 bool is_humongous = isHumongous();
bb847e31b836 6974928: G1: sometimes humongous objects are allocated in young regions
tonyp
parents: 1705
diff changeset
793 size_t object_num = 0;
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
794 while (p < top()) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
795 size_t size = oop(p)->size();
1718
bb847e31b836 6974928: G1: sometimes humongous objects are allocated in young regions
tonyp
parents: 1705
diff changeset
796 if (is_humongous != g1->isHumongous(size)) {
bb847e31b836 6974928: G1: sometimes humongous objects are allocated in young regions
tonyp
parents: 1705
diff changeset
797 gclog_or_tty->print_cr("obj "PTR_FORMAT" is of %shumongous size ("
bb847e31b836 6974928: G1: sometimes humongous objects are allocated in young regions
tonyp
parents: 1705
diff changeset
798 SIZE_FORMAT" words) in a %shumongous region",
bb847e31b836 6974928: G1: sometimes humongous objects are allocated in young regions
tonyp
parents: 1705
diff changeset
799 p, g1->isHumongous(size) ? "" : "non-",
bb847e31b836 6974928: G1: sometimes humongous objects are allocated in young regions
tonyp
parents: 1705
diff changeset
800 size, is_humongous ? "" : "non-");
bb847e31b836 6974928: G1: sometimes humongous objects are allocated in young regions
tonyp
parents: 1705
diff changeset
801 *failures = true;
bb847e31b836 6974928: G1: sometimes humongous objects are allocated in young regions
tonyp
parents: 1705
diff changeset
802 }
bb847e31b836 6974928: G1: sometimes humongous objects are allocated in young regions
tonyp
parents: 1705
diff changeset
803 object_num += 1;
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
804 if (blocks == BLOCK_SAMPLE_INTERVAL) {
1020
ff2402f6a50b 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 942
diff changeset
805 HeapWord* res = block_start_const(p + (size/2));
ff2402f6a50b 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 942
diff changeset
806 if (p != res) {
ff2402f6a50b 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 942
diff changeset
807 gclog_or_tty->print_cr("offset computation 1 for "PTR_FORMAT" and "
ff2402f6a50b 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 942
diff changeset
808 SIZE_FORMAT" returned "PTR_FORMAT,
ff2402f6a50b 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 942
diff changeset
809 p, size, res);
ff2402f6a50b 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 942
diff changeset
810 *failures = true;
ff2402f6a50b 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 942
diff changeset
811 return;
ff2402f6a50b 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 942
diff changeset
812 }
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
813 blocks = 0;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
814 } else {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
815 blocks++;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
816 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
817 if (objs == OBJ_SAMPLE_INTERVAL) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
818 oop obj = oop(p);
811
830ca2573896 6850846: G1: extend G1 marking verification
tonyp
parents: 796
diff changeset
819 if (!g1->is_obj_dead_cond(obj, this, use_prev_marking)) {
1020
ff2402f6a50b 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 942
diff changeset
820 if (obj->is_oop()) {
ff2402f6a50b 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 942
diff changeset
821 klassOop klass = obj->klass();
ff2402f6a50b 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 942
diff changeset
822 if (!klass->is_perm()) {
ff2402f6a50b 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 942
diff changeset
823 gclog_or_tty->print_cr("klass "PTR_FORMAT" of object "PTR_FORMAT" "
ff2402f6a50b 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 942
diff changeset
824 "not in perm", klass, obj);
ff2402f6a50b 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 942
diff changeset
825 *failures = true;
ff2402f6a50b 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 942
diff changeset
826 return;
ff2402f6a50b 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 942
diff changeset
827 } else if (!klass->is_klass()) {
ff2402f6a50b 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 942
diff changeset
828 gclog_or_tty->print_cr("klass "PTR_FORMAT" of object "PTR_FORMAT" "
ff2402f6a50b 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 942
diff changeset
829 "not a klass", klass, obj);
ff2402f6a50b 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 942
diff changeset
830 *failures = true;
ff2402f6a50b 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 942
diff changeset
831 return;
ff2402f6a50b 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 942
diff changeset
832 } else {
ff2402f6a50b 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 942
diff changeset
833 vl_cl.set_containing_obj(obj);
ff2402f6a50b 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 942
diff changeset
834 obj->oop_iterate(&vl_cl);
ff2402f6a50b 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 942
diff changeset
835 if (vl_cl.failures()) {
ff2402f6a50b 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 942
diff changeset
836 *failures = true;
ff2402f6a50b 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 942
diff changeset
837 }
ff2402f6a50b 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 942
diff changeset
838 if (G1MaxVerifyFailures >= 0 &&
ff2402f6a50b 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 942
diff changeset
839 vl_cl.n_failures() >= G1MaxVerifyFailures) {
ff2402f6a50b 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 942
diff changeset
840 return;
ff2402f6a50b 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 942
diff changeset
841 }
ff2402f6a50b 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 942
diff changeset
842 }
ff2402f6a50b 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 942
diff changeset
843 } else {
ff2402f6a50b 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 942
diff changeset
844 gclog_or_tty->print_cr(PTR_FORMAT" no an oop", obj);
ff2402f6a50b 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 942
diff changeset
845 *failures = true;
ff2402f6a50b 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 942
diff changeset
846 return;
ff2402f6a50b 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 942
diff changeset
847 }
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
848 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
849 objs = 0;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
850 } else {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
851 objs++;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
852 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
853 prev_p = p;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
854 p += size;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
855 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
856 HeapWord* rend = end();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
857 HeapWord* rtop = top();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
858 if (rtop < rend) {
1020
ff2402f6a50b 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 942
diff changeset
859 HeapWord* res = block_start_const(rtop + (rend - rtop) / 2);
ff2402f6a50b 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 942
diff changeset
860 if (res != rtop) {
ff2402f6a50b 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 942
diff changeset
861 gclog_or_tty->print_cr("offset computation 2 for "PTR_FORMAT" and "
ff2402f6a50b 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 942
diff changeset
862 PTR_FORMAT" returned "PTR_FORMAT,
ff2402f6a50b 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 942
diff changeset
863 rtop, rend, res);
ff2402f6a50b 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 942
diff changeset
864 *failures = true;
ff2402f6a50b 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 942
diff changeset
865 return;
ff2402f6a50b 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 942
diff changeset
866 }
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
867 }
1020
ff2402f6a50b 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 942
diff changeset
868
1718
bb847e31b836 6974928: G1: sometimes humongous objects are allocated in young regions
tonyp
parents: 1705
diff changeset
869 if (is_humongous && object_num > 1) {
bb847e31b836 6974928: G1: sometimes humongous objects are allocated in young regions
tonyp
parents: 1705
diff changeset
870 gclog_or_tty->print_cr("region ["PTR_FORMAT","PTR_FORMAT"] is humongous "
bb847e31b836 6974928: G1: sometimes humongous objects are allocated in young regions
tonyp
parents: 1705
diff changeset
871 "but has "SIZE_FORMAT", objects",
bb847e31b836 6974928: G1: sometimes humongous objects are allocated in young regions
tonyp
parents: 1705
diff changeset
872 bottom(), end(), object_num);
bb847e31b836 6974928: G1: sometimes humongous objects are allocated in young regions
tonyp
parents: 1705
diff changeset
873 *failures = true;
bb847e31b836 6974928: G1: sometimes humongous objects are allocated in young regions
tonyp
parents: 1705
diff changeset
874 }
bb847e31b836 6974928: G1: sometimes humongous objects are allocated in young regions
tonyp
parents: 1705
diff changeset
875
1020
ff2402f6a50b 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 942
diff changeset
876 if (p != top()) {
ff2402f6a50b 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 942
diff changeset
877 gclog_or_tty->print_cr("end of last object "PTR_FORMAT" "
ff2402f6a50b 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 942
diff changeset
878 "does not match top "PTR_FORMAT, p, top());
ff2402f6a50b 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 942
diff changeset
879 *failures = true;
ff2402f6a50b 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 942
diff changeset
880 return;
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
881 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
882 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
883
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
884 // G1OffsetTableContigSpace code; copied from space.cpp. Hope this can go
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
885 // away eventually.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
886
356
tonyp
parents: 355
diff changeset
887 void G1OffsetTableContigSpace::initialize(MemRegion mr, bool clear_space, bool mangle_space) {
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
888 // false ==> we'll do the clearing if there's clearing to be done.
356
tonyp
parents: 355
diff changeset
889 ContiguousSpace::initialize(mr, false, mangle_space);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
890 _offsets.zero_bottom_entry();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
891 _offsets.initialize_threshold();
356
tonyp
parents: 355
diff changeset
892 if (clear_space) clear(mangle_space);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
893 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
894
356
tonyp
parents: 355
diff changeset
895 void G1OffsetTableContigSpace::clear(bool mangle_space) {
tonyp
parents: 355
diff changeset
896 ContiguousSpace::clear(mangle_space);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
897 _offsets.zero_bottom_entry();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
898 _offsets.initialize_threshold();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
899 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
900
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
901 void G1OffsetTableContigSpace::set_bottom(HeapWord* new_bottom) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
902 Space::set_bottom(new_bottom);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
903 _offsets.set_bottom(new_bottom);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
904 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
905
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
906 void G1OffsetTableContigSpace::set_end(HeapWord* new_end) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
907 Space::set_end(new_end);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
908 _offsets.resize(new_end - bottom());
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
909 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
910
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
911 void G1OffsetTableContigSpace::print() const {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
912 print_short();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
913 gclog_or_tty->print_cr(" [" INTPTR_FORMAT ", " INTPTR_FORMAT ", "
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
914 INTPTR_FORMAT ", " INTPTR_FORMAT ")",
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
915 bottom(), top(), _offsets.threshold(), end());
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
916 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
917
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
918 HeapWord* G1OffsetTableContigSpace::initialize_threshold() {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
919 return _offsets.initialize_threshold();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
920 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
921
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
922 HeapWord* G1OffsetTableContigSpace::cross_threshold(HeapWord* start,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
923 HeapWord* end) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
924 _offsets.alloc_block(start, end);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
925 return _offsets.threshold();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
926 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
927
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
928 HeapWord* G1OffsetTableContigSpace::saved_mark_word() const {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
929 G1CollectedHeap* g1h = G1CollectedHeap::heap();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
930 assert( _gc_time_stamp <= g1h->get_gc_time_stamp(), "invariant" );
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
931 if (_gc_time_stamp < g1h->get_gc_time_stamp())
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
932 return top();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
933 else
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
934 return ContiguousSpace::saved_mark_word();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
935 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
936
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
937 void G1OffsetTableContigSpace::set_saved_mark() {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
938 G1CollectedHeap* g1h = G1CollectedHeap::heap();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
939 unsigned curr_gc_time_stamp = g1h->get_gc_time_stamp();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
940
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
941 if (_gc_time_stamp < curr_gc_time_stamp) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
942 // The order of these is important, as another thread might be
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
943 // about to start scanning this region. If it does so after
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
944 // set_saved_mark and before _gc_time_stamp = ..., then the latter
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
945 // will be false, and it will pick up top() as the high water mark
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
946 // of region. If it does so after _gc_time_stamp = ..., then it
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
947 // will pick up the right saved_mark_word() as the high water mark
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
948 // of the region. Either way, the behaviour will be correct.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
949 ContiguousSpace::set_saved_mark();
845
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
950 OrderAccess::storestore();
353
9bb2c10ac07b 6723570: G1: assertion failure: p == current_top or oop(p)->is_oop(),"p is not a block start" (revisited!)
iveresov
parents: 342
diff changeset
951 _gc_time_stamp = curr_gc_time_stamp;
845
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
952 // The following fence is to force a flush of the writes above, but
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
953 // is strictly not needed because when an allocating worker thread
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
954 // calls set_saved_mark() it does so under the ParGCRareEvent_lock;
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
955 // when the lock is released, the write will be flushed.
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
956 // OrderAccess::fence();
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
957 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
958 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
959
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
960 G1OffsetTableContigSpace::
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
961 G1OffsetTableContigSpace(G1BlockOffsetSharedArray* sharedOffsetArray,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
962 MemRegion mr, bool is_zeroed) :
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
963 _offsets(sharedOffsetArray, mr),
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
964 _par_alloc_lock(Mutex::leaf, "OffsetTableContigSpace par alloc lock", true),
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
965 _gc_time_stamp(0)
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
966 {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
967 _offsets.set_space(this);
356
tonyp
parents: 355
diff changeset
968 initialize(mr, !is_zeroed, SpaceDecorator::Mangle);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
969 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
970
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
971 size_t RegionList::length() {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
972 size_t len = 0;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
973 HeapRegion* cur = hd();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
974 DEBUG_ONLY(HeapRegion* last = NULL);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
975 while (cur != NULL) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
976 len++;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
977 DEBUG_ONLY(last = cur);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
978 cur = get_next(cur);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
979 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
980 assert(last == tl(), "Invariant");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
981 return len;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
982 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
983
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
984 void RegionList::insert_before_head(HeapRegion* r) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
985 assert(well_formed(), "Inv");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
986 set_next(r, hd());
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
987 _hd = r;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
988 _sz++;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
989 if (tl() == NULL) _tl = r;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
990 assert(well_formed(), "Inv");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
991 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
992
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
993 void RegionList::prepend_list(RegionList* new_list) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
994 assert(well_formed(), "Precondition");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
995 assert(new_list->well_formed(), "Precondition");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
996 HeapRegion* new_tl = new_list->tl();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
997 if (new_tl != NULL) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
998 set_next(new_tl, hd());
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
999 _hd = new_list->hd();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1000 _sz += new_list->sz();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1001 if (tl() == NULL) _tl = new_list->tl();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1002 } else {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1003 assert(new_list->hd() == NULL && new_list->sz() == 0, "Inv");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1004 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1005 assert(well_formed(), "Inv");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1006 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1007
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1008 void RegionList::delete_after(HeapRegion* r) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1009 assert(well_formed(), "Precondition");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1010 HeapRegion* next = get_next(r);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1011 assert(r != NULL, "Precondition");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1012 HeapRegion* next_tl = get_next(next);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1013 set_next(r, next_tl);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1014 dec_sz();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1015 if (next == tl()) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1016 assert(next_tl == NULL, "Inv");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1017 _tl = r;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1018 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1019 assert(well_formed(), "Inv");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1020 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1021
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1022 HeapRegion* RegionList::pop() {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1023 assert(well_formed(), "Inv");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1024 HeapRegion* res = hd();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1025 if (res != NULL) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1026 _hd = get_next(res);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1027 _sz--;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1028 set_next(res, NULL);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1029 if (sz() == 0) _tl = NULL;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1030 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1031 assert(well_formed(), "Inv");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1032 return res;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1033 }