Mercurial > hg > graal-jvmci-8
annotate src/share/vm/gc_implementation/g1/g1RemSet.inline.hpp @ 1708:a03ae377b2e8
6930581: G1: assert(ParallelGCThreads > 1 || n_yielded() == _hrrs->occupied(),"Should have yielded all the ..
Summary: During RSet updating, when ParallelGCThreads is zero, references that point into the collection set are added directly the referenced region's RSet. This can cause the sparse table in the RSet to expand. RSet scanning and the "occupied" routine will then operate on different instances of the sparse table causing the assert to trip. This may also cause some cards added post expansion to be missed during RSet scanning. When ParallelGCThreads is non-zero such references are recorded on the "references to be scanned" queue and the card containing the reference is recorded in a dirty card queue for use in the event of an evacuation failure. Employ the parallel code in the serial case to avoid expanding the RSets of regions in the collection set.
Reviewed-by: iveresov, ysr, tonyp
author | johnc |
---|---|
date | Fri, 06 Aug 2010 10:17:21 -0700 |
parents | 2d160770d2e5 |
children | c32059ef4dc0 |
rev | line source |
---|---|
342 | 1 /* |
1705 | 2 * Copyright (c) 2001, 2010, Oracle and/or its affiliates. All rights reserved. |
342 | 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
4 * | |
5 * This code is free software; you can redistribute it and/or modify it | |
6 * under the terms of the GNU General Public License version 2 only, as | |
7 * published by the Free Software Foundation. | |
8 * | |
9 * This code is distributed in the hope that it will be useful, but WITHOUT | |
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
12 * version 2 for more details (a copy is included in the LICENSE file that | |
13 * accompanied this code). | |
14 * | |
15 * You should have received a copy of the GNU General Public License version | |
16 * 2 along with this work; if not, write to the Free Software Foundation, | |
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. | |
18 * | |
1552
c18cbe5936b8
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
866
diff
changeset
|
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
c18cbe5936b8
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
866
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:
866
diff
changeset
|
21 * questions. |
342 | 22 * |
23 */ | |
24 | |
25 inline size_t G1RemSet::n_workers() { | |
26 if (_g1->workers() != NULL) { | |
27 return _g1->workers()->total_workers(); | |
28 } else { | |
29 return 1; | |
30 } | |
31 } | |
32 | |
845
df6caf649ff7
6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents:
677
diff
changeset
|
33 template <class T> inline void HRInto_G1RemSet::write_ref_nv(HeapRegion* from, T* p) { |
df6caf649ff7
6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents:
677
diff
changeset
|
34 par_write_ref_nv(from, p, 0); |
342 | 35 } |
36 | |
37 inline bool HRInto_G1RemSet::self_forwarded(oop obj) { | |
38 bool result = (obj->is_forwarded() && (obj->forwardee()== obj)); | |
39 return result; | |
40 } | |
41 | |
845
df6caf649ff7
6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents:
677
diff
changeset
|
42 template <class T> inline void HRInto_G1RemSet::par_write_ref_nv(HeapRegion* from, T* p, int tid) { |
df6caf649ff7
6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents:
677
diff
changeset
|
43 oop obj = oopDesc::load_decode_heap_oop(p); |
342 | 44 #ifdef ASSERT |
45 // can't do because of races | |
46 // assert(obj == NULL || obj->is_oop(), "expected an oop"); | |
47 | |
48 // Do the safe subset of is_oop | |
49 if (obj != NULL) { | |
50 #ifdef CHECK_UNHANDLED_OOPS | |
51 oopDesc* o = obj.obj(); | |
52 #else | |
53 oopDesc* o = obj; | |
54 #endif // CHECK_UNHANDLED_OOPS | |
55 assert((intptr_t)o % MinObjAlignmentInBytes == 0, "not oop aligned"); | |
56 assert(Universe::heap()->is_in_reserved(obj), "must be in heap"); | |
57 } | |
58 #endif // ASSERT | |
1705 | 59 |
60 assert(from == NULL || from->is_in_reserved(p), "p is not in from"); | |
61 | |
342 | 62 HeapRegion* to = _g1->heap_region_containing(obj); |
63 // The test below could be optimized by applying a bit op to to and from. | |
64 if (to != NULL && from != NULL && from != to) { | |
1708
a03ae377b2e8
6930581: G1: assert(ParallelGCThreads > 1 || n_yielded() == _hrrs->occupied(),"Should have yielded all the ..
johnc
parents:
1705
diff
changeset
|
65 // The _traversal_in_progress flag is true during the collection pause, |
a03ae377b2e8
6930581: G1: assert(ParallelGCThreads > 1 || n_yielded() == _hrrs->occupied(),"Should have yielded all the ..
johnc
parents:
1705
diff
changeset
|
66 // false during the evacuation failure handling. This should avoid a |
1705 | 67 // potential loop if we were to add the card containing 'p' to the DCQS |
68 // that's used to regenerate the remembered sets for the collection set, | |
69 // in the event of an evacuation failure, here. The UpdateRSImmediate | |
70 // closure will eventally call this routine. | |
1708
a03ae377b2e8
6930581: G1: assert(ParallelGCThreads > 1 || n_yielded() == _hrrs->occupied(),"Should have yielded all the ..
johnc
parents:
1705
diff
changeset
|
71 if (_traversal_in_progress && |
616
4f360ec815ba
6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents:
342
diff
changeset
|
72 to->in_collection_set() && !self_forwarded(obj)) { |
1705 | 73 |
74 assert(_cset_rs_update_cl[tid] != NULL, "should have been set already"); | |
75 _cset_rs_update_cl[tid]->do_oop(p); | |
76 | |
77 // Deferred updates to the CSet are either discarded (in the normal case), | |
616
4f360ec815ba
6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents:
342
diff
changeset
|
78 // or processed (if an evacuation failure occurs) at the end |
4f360ec815ba
6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents:
342
diff
changeset
|
79 // of the collection. |
4f360ec815ba
6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents:
342
diff
changeset
|
80 // See HRInto_G1RemSet::cleanup_after_oops_into_collection_set_do(). |
677 | 81 } else { |
342 | 82 #if G1_REM_SET_LOGGING |
83 gclog_or_tty->print_cr("Adding " PTR_FORMAT " (" PTR_FORMAT ") to RS" | |
84 " for region [" PTR_FORMAT ", " PTR_FORMAT ")", | |
85 p, obj, | |
86 to->bottom(), to->end()); | |
87 #endif | |
88 assert(to->rem_set() != NULL, "Need per-region 'into' remsets."); | |
677 | 89 to->rem_set()->add_reference(p, tid); |
342 | 90 } |
91 } | |
92 } | |
626
87fa6e083d82
6760309: G1: update remembered sets during Full GCs
apetrusenko
parents:
616
diff
changeset
|
93 |
845
df6caf649ff7
6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents:
677
diff
changeset
|
94 template <class T> inline void UpdateRSOopClosure::do_oop_work(T* p) { |
626
87fa6e083d82
6760309: G1: update remembered sets during Full GCs
apetrusenko
parents:
616
diff
changeset
|
95 assert(_from != NULL, "from region must be non-NULL"); |
87fa6e083d82
6760309: G1: update remembered sets during Full GCs
apetrusenko
parents:
616
diff
changeset
|
96 _rs->par_write_ref(_from, p, _worker_i); |
87fa6e083d82
6760309: G1: update remembered sets during Full GCs
apetrusenko
parents:
616
diff
changeset
|
97 } |
1705 | 98 |
99 template <class T> inline void UpdateRSetImmediate::do_oop_work(T* p) { | |
100 assert(_from->is_in_reserved(p), "paranoia"); | |
101 T heap_oop = oopDesc::load_heap_oop(p); | |
102 if (!oopDesc::is_null(heap_oop) && !_from->is_survivor()) { | |
103 _g1_rem_set->par_write_ref(_from, p, 0); | |
104 } | |
105 } | |
106 |