annotate src/share/vm/gc_implementation/g1/heapRegion.cpp @ 1705:2d160770d2e5

6814437: G1: remove the _new_refs array Summary: The per-worker _new_refs array is used to hold references that point into the collection set. It is populated during RSet updating and subsequently processed. In the event of an evacuation failure it processed again to recreate the RSets of regions in the collection set. Remove the per-worker _new_refs array by processing the references directly. Use a DirtyCardQueue to hold the cards containing the references so that the RSets of regions in the collection set can be recreated when handling an evacuation failure. Reviewed-by: iveresov, jmasa, tonyp
author johnc
date Mon, 02 Aug 2010 12:51:43 -0700
parents 5cbac8938c4c
children bb847e31b836
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
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
380 void HeapRegion::set_startsHumongous() {
355
0edda524b58c 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 353
diff changeset
381 _humongous_type = StartsHumongous;
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
382 _humongous_start_region = this;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
383 assert(end() == _orig_end, "Should be normal before alloc.");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
384 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
385
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
386 bool HeapRegion::claimHeapRegion(jint claimValue) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
387 jint current = _claimed;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
388 if (current != claimValue) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
389 jint res = Atomic::cmpxchg(claimValue, &_claimed, current);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
390 if (res == current) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
391 return true;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
392 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
393 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
394 return false;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
395 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
396
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
397 HeapWord* HeapRegion::next_block_start_careful(HeapWord* addr) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
398 HeapWord* low = addr;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
399 HeapWord* high = end();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
400 while (low < high) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
401 size_t diff = pointer_delta(high, low);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
402 // 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
403 // "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
404 // would not converge on "high". This is not symmetric, because
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
405 // 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
406 // which we don't do for "low".
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
407 HeapWord* middle = low + (diff+1)/2;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
408 if (middle == high) return high;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
409 HeapWord* mid_bs = block_start_careful(middle);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
410 if (mid_bs < addr) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
411 low = middle;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
412 } else {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
413 high = mid_bs;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
414 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
415 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
416 assert(low == high && low >= addr, "Didn't work.");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
417 return low;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
418 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
419
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
420 void HeapRegion::set_next_on_unclean_list(HeapRegion* r) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
421 assert(r == NULL || r->is_on_unclean_list(), "Malformed unclean list.");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
422 _next_in_special_set = r;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
423 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
424
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
425 void HeapRegion::set_on_unclean_list(bool b) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
426 _is_on_unclean_list = b;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
427 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
428
356
tonyp
parents: 355
diff changeset
429 void HeapRegion::initialize(MemRegion mr, bool clear_space, bool mangle_space) {
tonyp
parents: 355
diff changeset
430 G1OffsetTableContigSpace::initialize(mr, false, mangle_space);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
431 hr_clear(false/*par*/, clear_space);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
432 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
433 #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
434 #pragma warning( disable:4355 ) // 'this' : used in base member initializer list
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
435 #endif // _MSC_VER
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
436
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
437
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
438 HeapRegion::
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
439 HeapRegion(G1BlockOffsetSharedArray* sharedOffsetArray,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
440 MemRegion mr, bool is_zeroed)
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
441 : G1OffsetTableContigSpace(sharedOffsetArray, mr, is_zeroed),
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
442 _next_fk(HeapRegionDCTOC::NoFilterKind),
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
443 _hrs_index(-1),
355
0edda524b58c 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 353
diff changeset
444 _humongous_type(NotHumongous), _humongous_start_region(NULL),
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
445 _in_collection_set(false), _is_gc_alloc_region(false),
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
446 _is_on_free_list(false), _is_on_unclean_list(false),
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
447 _next_in_special_set(NULL), _orig_end(NULL),
355
0edda524b58c 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 353
diff changeset
448 _claimed(InitialClaimValue), _evacuation_failed(false),
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
449 _prev_marked_bytes(0), _next_marked_bytes(0), _sort_index(-1),
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
450 _young_type(NotYoung), _next_young_region(NULL),
796
29e7d79232b9 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 751
diff changeset
451 _next_dirty_cards_region(NULL),
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
452 _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
453 _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
454 _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
455 _predicted_bytes_to_copy(0)
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
456 {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
457 _orig_end = mr.end();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
458 // 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
459 // region.
356
tonyp
parents: 355
diff changeset
460 this->initialize(mr, !is_zeroed, SpaceDecorator::Mangle);
tonyp
parents: 355
diff changeset
461 set_top(bottom());
tonyp
parents: 355
diff changeset
462 set_saved_mark();
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
463
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
464 _rem_set = new HeapRegionRemSet(sharedOffsetArray, this);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
465
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
466 assert(HeapRegionRemSet::num_par_rem_sets() > 0, "Invariant.");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
467 // 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
468 // We haven't done any counting on a brand new region.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
469 _top_at_conc_mark_count = bottom();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
470 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
471
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
472 class NextCompactionHeapRegionClosure: public HeapRegionClosure {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
473 const HeapRegion* _target;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
474 bool _target_seen;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
475 HeapRegion* _last;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
476 CompactibleSpace* _res;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
477 public:
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
478 NextCompactionHeapRegionClosure(const HeapRegion* target) :
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
479 _target(target), _target_seen(false), _res(NULL) {}
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
480 bool doHeapRegion(HeapRegion* cur) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
481 if (_target_seen) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
482 if (!cur->isHumongous()) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
483 _res = cur;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
484 return true;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
485 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
486 } else if (cur == _target) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
487 _target_seen = true;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
488 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
489 return false;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
490 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
491 CompactibleSpace* result() { return _res; }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
492 };
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
493
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
494 CompactibleSpace* HeapRegion::next_compaction_space() const {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
495 G1CollectedHeap* g1h = G1CollectedHeap::heap();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
496 // cast away const-ness
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
497 HeapRegion* r = (HeapRegion*) this;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
498 NextCompactionHeapRegionClosure blk(r);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
499 g1h->heap_region_iterate_from(r, &blk);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
500 return blk.result();
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
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
503 void HeapRegion::set_continuesHumongous(HeapRegion* start) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
504 // The order is important here.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
505 start->add_continuingHumongousRegion(this);
355
0edda524b58c 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 353
diff changeset
506 _humongous_type = ContinuesHumongous;
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
507 _humongous_start_region = start;
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 void HeapRegion::add_continuingHumongousRegion(HeapRegion* cont) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
511 // Must join the blocks of the current H region seq with the block of the
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
512 // added region.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
513 offsets()->join_blocks(bottom(), cont->bottom());
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
514 arrayOop obj = (arrayOop)(bottom());
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
515 obj->set_length((int) (obj->length() + cont->capacity()/jintSize));
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
516 set_end(cont->end());
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
517 set_top(cont->end());
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
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
520 void HeapRegion::save_marks() {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
521 set_saved_mark();
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
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
524 void HeapRegion::oops_in_mr_iterate(MemRegion mr, OopClosure* cl) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
525 HeapWord* p = mr.start();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
526 HeapWord* e = mr.end();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
527 oop obj;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
528 while (p < e) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
529 obj = oop(p);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
530 p += obj->oop_iterate(cl);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
531 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
532 assert(p == e, "bad memregion: doesn't end on obj boundary");
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
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
535 #define HeapRegion_OOP_SINCE_SAVE_MARKS_DEFN(OopClosureType, nv_suffix) \
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
536 void HeapRegion::oop_since_save_marks_iterate##nv_suffix(OopClosureType* cl) { \
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
537 ContiguousSpace::oop_since_save_marks_iterate##nv_suffix(cl); \
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
538 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
539 SPECIALIZED_SINCE_SAVE_MARKS_CLOSURES(HeapRegion_OOP_SINCE_SAVE_MARKS_DEFN)
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
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
542 void HeapRegion::oop_before_save_marks_iterate(OopClosure* cl) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
543 oops_in_mr_iterate(MemRegion(bottom(), saved_mark_word()), cl);
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
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
546 #ifdef DEBUG
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
547 HeapWord* HeapRegion::allocate(size_t size) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
548 jint state = zero_fill_state();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
549 assert(!G1CollectedHeap::heap()->allocs_are_zero_filled() ||
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
550 zero_fill_is_allocated(),
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
551 "When ZF is on, only alloc in ZF'd regions");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
552 return G1OffsetTableContigSpace::allocate(size);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
553 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
554 #endif
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
555
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
556 void HeapRegion::set_zero_fill_state_work(ZeroFillState zfs) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
557 assert(ZF_mon->owned_by_self() ||
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
558 Universe::heap()->is_gc_active(),
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
559 "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
560 #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
561 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
562 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
563 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
564 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
565 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
566 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
567 "_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
568 }
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
569 #endif
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
570 _zfs = zfs;
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
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
573 void HeapRegion::set_zero_fill_complete() {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
574 set_zero_fill_state_work(ZeroFilled);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
575 if (ZF_mon->owned_by_self()) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
576 ZF_mon->notify_all();
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
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
581 void HeapRegion::ensure_zero_filled() {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
582 MutexLockerEx x(ZF_mon, Mutex::_no_safepoint_check_flag);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
583 ensure_zero_filled_locked();
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
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
586 void HeapRegion::ensure_zero_filled_locked() {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
587 assert(ZF_mon->owned_by_self(), "Precondition");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
588 bool should_ignore_zf = SafepointSynchronize::is_at_safepoint();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
589 assert(should_ignore_zf || Heap_lock->is_locked(),
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
590 "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
591 switch (zero_fill_state()) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
592 case HeapRegion::NotZeroFilled:
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
593 set_zero_fill_in_progress(Thread::current());
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
594 {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
595 ZF_mon->unlock();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
596 Copy::fill_to_words(bottom(), capacity()/HeapWordSize);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
597 ZF_mon->lock_without_safepoint_check();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
598 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
599 // A trap.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
600 guarantee(zero_fill_state() == HeapRegion::ZeroFilling
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
601 && zero_filler() == Thread::current(),
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
602 "AHA! Tell Dave D if you see this...");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
603 set_zero_fill_complete();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
604 // gclog_or_tty->print_cr("Did sync ZF.");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
605 ConcurrentZFThread::note_sync_zfs();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
606 break;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
607 case HeapRegion::ZeroFilling:
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
608 if (should_ignore_zf) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
609 // We can "break" the lock and take over the work.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
610 Copy::fill_to_words(bottom(), capacity()/HeapWordSize);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
611 set_zero_fill_complete();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
612 ConcurrentZFThread::note_sync_zfs();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
613 break;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
614 } else {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
615 ConcurrentZFThread::wait_for_ZF_completed(this);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
616 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
617 case HeapRegion::ZeroFilled:
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
618 // Nothing to do.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
619 break;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
620 case HeapRegion::Allocated:
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
621 guarantee(false, "Should not call on allocated regions.");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
622 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
623 assert(zero_fill_state() == HeapRegion::ZeroFilled, "Post");
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
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
626 HeapWord*
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
627 HeapRegion::object_iterate_mem_careful(MemRegion mr,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
628 ObjectClosure* cl) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
629 G1CollectedHeap* g1h = G1CollectedHeap::heap();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
630 // 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
631 // to update the BOT while we do this...
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
632 HeapWord* cur = block_start(mr.start());
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
633 mr = mr.intersection(used_region());
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
634 if (mr.is_empty()) return NULL;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
635 // Otherwise, find the obj that extends onto mr.start().
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
636
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
637 assert(cur <= mr.start()
845
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
638 && (oop(cur)->klass_or_null() == NULL ||
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
639 cur + oop(cur)->size() > mr.start()),
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
640 "postcondition of block_start");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
641 oop obj;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
642 while (cur < mr.end()) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
643 obj = oop(cur);
845
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
644 if (obj->klass_or_null() == NULL) {
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
645 // Ran into an unparseable point.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
646 return cur;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
647 } else if (!g1h->is_obj_dead(obj)) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
648 cl->do_object(obj);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
649 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
650 if (cl->abort()) return cur;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
651 // The check above must occur before the operation below, since an
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
652 // abort might invalidate the "size" operation.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
653 cur += obj->size();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
654 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
655 return NULL;
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
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
658 HeapWord*
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
659 HeapRegion::
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
660 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
661 FilterOutOfRegionClosure* cl,
5cbac8938c4c 6956639: G1: assert(cached_ptr != card_ptr) failed: shouldn't be, concurrentG1Refine.cpp:307
johnc
parents: 1552
diff changeset
662 bool filter_young) {
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
663 G1CollectedHeap* g1h = G1CollectedHeap::heap();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
664
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
665 // 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
666 // 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
667 // parseable. Stop such at the "saved_mark" of the region.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
668 if (G1CollectedHeap::heap()->is_gc_active()) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
669 mr = mr.intersection(used_region_at_save_marks());
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
670 } else {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
671 mr = mr.intersection(used_region());
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
672 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
673 if (mr.is_empty()) return NULL;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
674 // Otherwise, find the obj that extends onto mr.start().
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
675
1666
5cbac8938c4c 6956639: G1: assert(cached_ptr != card_ptr) failed: shouldn't be, concurrentG1Refine.cpp:307
johnc
parents: 1552
diff changeset
676 // 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
677 // 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
678 // 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
679 // 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
680 // 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
681 // 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
682 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
683 return NULL;
5cbac8938c4c 6956639: G1: assert(cached_ptr != card_ptr) failed: shouldn't be, concurrentG1Refine.cpp:307
johnc
parents: 1552
diff changeset
684 }
5cbac8938c4c 6956639: G1: assert(cached_ptr != card_ptr) failed: shouldn't be, concurrentG1Refine.cpp:307
johnc
parents: 1552
diff changeset
685
1705
2d160770d2e5 6814437: G1: remove the _new_refs array
johnc
parents: 1666
diff changeset
686 assert(!is_young(), "check value of filter_young");
2d160770d2e5 6814437: G1: remove the _new_refs array
johnc
parents: 1666
diff changeset
687
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
688 // 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
689 // to update the BOT while we do this...
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
690 HeapWord* cur = block_start(mr.start());
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
691 assert(cur <= mr.start(), "Postcondition");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
692
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
693 while (cur <= mr.start()) {
845
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
694 if (oop(cur)->klass_or_null() == NULL) {
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
695 // Ran into an unparseable point.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
696 return cur;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
697 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
698 // Otherwise...
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
699 int sz = oop(cur)->size();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
700 if (cur + sz > mr.start()) break;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
701 // Otherwise, go on.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
702 cur = cur + sz;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
703 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
704 oop obj;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
705 obj = oop(cur);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
706 // If we finish this loop...
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
707 assert(cur <= mr.start()
845
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
708 && obj->klass_or_null() != NULL
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
709 && cur + obj->size() > mr.start(),
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
710 "Loop postcondition");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
711 if (!g1h->is_obj_dead(obj)) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
712 obj->oop_iterate(cl, mr);
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
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
715 HeapWord* next;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
716 while (cur < mr.end()) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
717 obj = oop(cur);
845
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
718 if (obj->klass_or_null() == NULL) {
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
719 // Ran into an unparseable point.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
720 return cur;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
721 };
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
722 // Otherwise:
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
723 next = (cur + obj->size());
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
724 if (!g1h->is_obj_dead(obj)) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
725 if (next < mr.end()) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
726 obj->oop_iterate(cl);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
727 } else {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
728 // 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
729 // boundary.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
730 if (obj->is_objArray()) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
731 obj->oop_iterate(cl, mr);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
732 } else {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
733 obj->oop_iterate(cl);
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 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
737 cur = next;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
738 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
739 return NULL;
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
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
742 void HeapRegion::print() const { print_on(gclog_or_tty); }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
743 void HeapRegion::print_on(outputStream* st) const {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
744 if (isHumongous()) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
745 if (startsHumongous())
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
746 st->print(" HS");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
747 else
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
748 st->print(" HC");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
749 } else {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
750 st->print(" ");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
751 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
752 if (in_collection_set())
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
753 st->print(" CS");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
754 else if (is_gc_alloc_region())
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
755 st->print(" A ");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
756 else
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
757 st->print(" ");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
758 if (is_young())
1394
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1388
diff changeset
759 st->print(is_survivor() ? " SU" : " Y ");
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
760 else
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
761 st->print(" ");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
762 if (is_empty())
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
763 st->print(" F");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
764 else
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
765 st->print(" ");
1020
ff2402f6a50b 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 942
diff changeset
766 st->print(" %5d", _gc_time_stamp);
1388
7666957bc44d 6937142: G1: improvements to debugging output (S-M)
tonyp
parents: 1020
diff changeset
767 st->print(" PTAMS "PTR_FORMAT" NTAMS "PTR_FORMAT,
7666957bc44d 6937142: G1: improvements to debugging output (S-M)
tonyp
parents: 1020
diff changeset
768 prev_top_at_mark_start(), next_top_at_mark_start());
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
769 G1OffsetTableContigSpace::print_on(st);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
770 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
771
811
830ca2573896 6850846: G1: extend G1 marking verification
tonyp
parents: 796
diff changeset
772 void HeapRegion::verify(bool allow_dirty) const {
1020
ff2402f6a50b 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 942
diff changeset
773 bool dummy = false;
ff2402f6a50b 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 942
diff changeset
774 verify(allow_dirty, /* use_prev_marking */ true, /* failures */ &dummy);
811
830ca2573896 6850846: G1: extend G1 marking verification
tonyp
parents: 796
diff changeset
775 }
830ca2573896 6850846: G1: extend G1 marking verification
tonyp
parents: 796
diff changeset
776
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
777 #define OBJ_SAMPLE_INTERVAL 0
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
778 #define BLOCK_SAMPLE_INTERVAL 100
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
779
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
780 // This really ought to be commoned up into OffsetTableContigSpace somehow.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
781 // 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
782
1020
ff2402f6a50b 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 942
diff changeset
783 void HeapRegion::verify(bool allow_dirty,
ff2402f6a50b 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 942
diff changeset
784 bool use_prev_marking,
ff2402f6a50b 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 942
diff changeset
785 bool* failures) const {
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
786 G1CollectedHeap* g1 = G1CollectedHeap::heap();
1020
ff2402f6a50b 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 942
diff changeset
787 *failures = false;
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
788 HeapWord* p = bottom();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
789 HeapWord* prev_p = NULL;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
790 int objs = 0;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
791 int blocks = 0;
811
830ca2573896 6850846: G1: extend G1 marking verification
tonyp
parents: 796
diff changeset
792 VerifyLiveClosure vl_cl(g1, use_prev_marking);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
793 while (p < top()) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
794 size_t size = oop(p)->size();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
795 if (blocks == BLOCK_SAMPLE_INTERVAL) {
1020
ff2402f6a50b 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 942
diff changeset
796 HeapWord* res = block_start_const(p + (size/2));
ff2402f6a50b 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 942
diff changeset
797 if (p != res) {
ff2402f6a50b 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 942
diff changeset
798 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
799 SIZE_FORMAT" returned "PTR_FORMAT,
ff2402f6a50b 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 942
diff changeset
800 p, size, res);
ff2402f6a50b 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 942
diff changeset
801 *failures = true;
ff2402f6a50b 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 942
diff changeset
802 return;
ff2402f6a50b 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 942
diff changeset
803 }
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
804 blocks = 0;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
805 } else {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
806 blocks++;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
807 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
808 if (objs == OBJ_SAMPLE_INTERVAL) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
809 oop obj = oop(p);
811
830ca2573896 6850846: G1: extend G1 marking verification
tonyp
parents: 796
diff changeset
810 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
811 if (obj->is_oop()) {
ff2402f6a50b 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 942
diff changeset
812 klassOop klass = obj->klass();
ff2402f6a50b 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 942
diff changeset
813 if (!klass->is_perm()) {
ff2402f6a50b 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 942
diff changeset
814 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
815 "not in perm", klass, obj);
ff2402f6a50b 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 942
diff changeset
816 *failures = true;
ff2402f6a50b 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 942
diff changeset
817 return;
ff2402f6a50b 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 942
diff changeset
818 } else if (!klass->is_klass()) {
ff2402f6a50b 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 942
diff changeset
819 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
820 "not a klass", klass, obj);
ff2402f6a50b 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 942
diff changeset
821 *failures = true;
ff2402f6a50b 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 942
diff changeset
822 return;
ff2402f6a50b 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 942
diff changeset
823 } else {
ff2402f6a50b 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 942
diff changeset
824 vl_cl.set_containing_obj(obj);
ff2402f6a50b 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 942
diff changeset
825 obj->oop_iterate(&vl_cl);
ff2402f6a50b 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 942
diff changeset
826 if (vl_cl.failures()) {
ff2402f6a50b 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 942
diff changeset
827 *failures = true;
ff2402f6a50b 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 942
diff changeset
828 }
ff2402f6a50b 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 942
diff changeset
829 if (G1MaxVerifyFailures >= 0 &&
ff2402f6a50b 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 942
diff changeset
830 vl_cl.n_failures() >= G1MaxVerifyFailures) {
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 }
ff2402f6a50b 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 942
diff changeset
833 }
ff2402f6a50b 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 942
diff changeset
834 } else {
ff2402f6a50b 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 942
diff changeset
835 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
836 *failures = true;
ff2402f6a50b 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 942
diff changeset
837 return;
ff2402f6a50b 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 942
diff changeset
838 }
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
839 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
840 objs = 0;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
841 } else {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
842 objs++;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
843 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
844 prev_p = p;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
845 p += size;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
846 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
847 HeapWord* rend = end();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
848 HeapWord* rtop = top();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
849 if (rtop < rend) {
1020
ff2402f6a50b 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 942
diff changeset
850 HeapWord* res = block_start_const(rtop + (rend - rtop) / 2);
ff2402f6a50b 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 942
diff changeset
851 if (res != rtop) {
ff2402f6a50b 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 942
diff changeset
852 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
853 PTR_FORMAT" returned "PTR_FORMAT,
ff2402f6a50b 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 942
diff changeset
854 rtop, rend, res);
ff2402f6a50b 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 942
diff changeset
855 *failures = true;
ff2402f6a50b 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 942
diff changeset
856 return;
ff2402f6a50b 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 942
diff changeset
857 }
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
858 }
1020
ff2402f6a50b 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 942
diff changeset
859
ff2402f6a50b 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 942
diff changeset
860 if (p != top()) {
ff2402f6a50b 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 942
diff changeset
861 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
862 "does not match top "PTR_FORMAT, p, top());
ff2402f6a50b 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 942
diff changeset
863 *failures = true;
ff2402f6a50b 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 942
diff changeset
864 return;
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
865 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
866 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
867
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
868 // G1OffsetTableContigSpace code; copied from space.cpp. Hope this can go
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
869 // away eventually.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
870
356
tonyp
parents: 355
diff changeset
871 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
872 // false ==> we'll do the clearing if there's clearing to be done.
356
tonyp
parents: 355
diff changeset
873 ContiguousSpace::initialize(mr, false, mangle_space);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
874 _offsets.zero_bottom_entry();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
875 _offsets.initialize_threshold();
356
tonyp
parents: 355
diff changeset
876 if (clear_space) clear(mangle_space);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
877 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
878
356
tonyp
parents: 355
diff changeset
879 void G1OffsetTableContigSpace::clear(bool mangle_space) {
tonyp
parents: 355
diff changeset
880 ContiguousSpace::clear(mangle_space);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
881 _offsets.zero_bottom_entry();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
882 _offsets.initialize_threshold();
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
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
885 void G1OffsetTableContigSpace::set_bottom(HeapWord* new_bottom) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
886 Space::set_bottom(new_bottom);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
887 _offsets.set_bottom(new_bottom);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
888 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
889
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
890 void G1OffsetTableContigSpace::set_end(HeapWord* new_end) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
891 Space::set_end(new_end);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
892 _offsets.resize(new_end - bottom());
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
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
895 void G1OffsetTableContigSpace::print() const {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
896 print_short();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
897 gclog_or_tty->print_cr(" [" INTPTR_FORMAT ", " INTPTR_FORMAT ", "
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
898 INTPTR_FORMAT ", " INTPTR_FORMAT ")",
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
899 bottom(), top(), _offsets.threshold(), end());
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
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
902 HeapWord* G1OffsetTableContigSpace::initialize_threshold() {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
903 return _offsets.initialize_threshold();
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 HeapWord* G1OffsetTableContigSpace::cross_threshold(HeapWord* start,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
907 HeapWord* end) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
908 _offsets.alloc_block(start, end);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
909 return _offsets.threshold();
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
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
912 HeapWord* G1OffsetTableContigSpace::saved_mark_word() const {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
913 G1CollectedHeap* g1h = G1CollectedHeap::heap();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
914 assert( _gc_time_stamp <= g1h->get_gc_time_stamp(), "invariant" );
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
915 if (_gc_time_stamp < g1h->get_gc_time_stamp())
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
916 return top();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
917 else
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
918 return ContiguousSpace::saved_mark_word();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
919 }
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 void G1OffsetTableContigSpace::set_saved_mark() {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
922 G1CollectedHeap* g1h = G1CollectedHeap::heap();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
923 unsigned curr_gc_time_stamp = g1h->get_gc_time_stamp();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
924
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
925 if (_gc_time_stamp < curr_gc_time_stamp) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
926 // The order of these is important, as another thread might be
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
927 // about to start scanning this region. If it does so after
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
928 // set_saved_mark and before _gc_time_stamp = ..., then the latter
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
929 // 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
930 // 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
931 // 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
932 // of the region. Either way, the behaviour will be correct.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
933 ContiguousSpace::set_saved_mark();
845
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
934 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
935 _gc_time_stamp = curr_gc_time_stamp;
845
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
936 // 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
937 // 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
938 // 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
939 // 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
940 // OrderAccess::fence();
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
941 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
942 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
943
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
944 G1OffsetTableContigSpace::
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
945 G1OffsetTableContigSpace(G1BlockOffsetSharedArray* sharedOffsetArray,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
946 MemRegion mr, bool is_zeroed) :
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
947 _offsets(sharedOffsetArray, mr),
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
948 _par_alloc_lock(Mutex::leaf, "OffsetTableContigSpace par alloc lock", true),
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
949 _gc_time_stamp(0)
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
950 {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
951 _offsets.set_space(this);
356
tonyp
parents: 355
diff changeset
952 initialize(mr, !is_zeroed, SpaceDecorator::Mangle);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
953 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
954
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
955 size_t RegionList::length() {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
956 size_t len = 0;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
957 HeapRegion* cur = hd();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
958 DEBUG_ONLY(HeapRegion* last = NULL);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
959 while (cur != NULL) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
960 len++;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
961 DEBUG_ONLY(last = cur);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
962 cur = get_next(cur);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
963 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
964 assert(last == tl(), "Invariant");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
965 return len;
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
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
968 void RegionList::insert_before_head(HeapRegion* r) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
969 assert(well_formed(), "Inv");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
970 set_next(r, hd());
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
971 _hd = r;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
972 _sz++;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
973 if (tl() == NULL) _tl = r;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
974 assert(well_formed(), "Inv");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
975 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
976
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
977 void RegionList::prepend_list(RegionList* new_list) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
978 assert(well_formed(), "Precondition");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
979 assert(new_list->well_formed(), "Precondition");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
980 HeapRegion* new_tl = new_list->tl();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
981 if (new_tl != NULL) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
982 set_next(new_tl, hd());
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
983 _hd = new_list->hd();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
984 _sz += new_list->sz();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
985 if (tl() == NULL) _tl = new_list->tl();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
986 } else {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
987 assert(new_list->hd() == NULL && new_list->sz() == 0, "Inv");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
988 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
989 assert(well_formed(), "Inv");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
990 }
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 void RegionList::delete_after(HeapRegion* r) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
993 assert(well_formed(), "Precondition");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
994 HeapRegion* next = get_next(r);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
995 assert(r != NULL, "Precondition");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
996 HeapRegion* next_tl = get_next(next);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
997 set_next(r, next_tl);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
998 dec_sz();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
999 if (next == tl()) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1000 assert(next_tl == NULL, "Inv");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1001 _tl = r;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1002 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1003 assert(well_formed(), "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
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1006 HeapRegion* RegionList::pop() {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1007 assert(well_formed(), "Inv");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1008 HeapRegion* res = hd();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1009 if (res != NULL) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1010 _hd = get_next(res);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1011 _sz--;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1012 set_next(res, NULL);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1013 if (sz() == 0) _tl = NULL;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1014 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1015 assert(well_formed(), "Inv");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1016 return res;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1017 }