Mercurial > hg > truffle
annotate src/share/vm/gc_implementation/parNew/parOopClosures.inline.hpp @ 1951:899bbbdcb6ea
6997298: fatal error: must own lock CMS_markBitMap_lock during heap dump
Summary: Since we are at a stop-world pause, the existing CMS-phase checks are sufficient for safety, and the locking check can be safely elided. Elaborated documentation comment to the case where class unloading and verification are disabled, and the query happens when we aren't in the sweeping phase, where the answer "false" would be (almost everywhere) too pessimistic.
Reviewed-by: jmasa, johnc, tonyp
author | ysr |
---|---|
date | Fri, 05 Nov 2010 13:20:37 -0700 |
parents | c18cbe5936b8 |
children | f95d63e2154a |
rev | line source |
---|---|
0 | 1 /* |
1552
c18cbe5936b8
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
113
diff
changeset
|
2 * Copyright (c) 2007, Oracle and/or its affiliates. All rights reserved. |
0 | 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:
113
diff
changeset
|
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
c18cbe5936b8
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
113
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:
113
diff
changeset
|
21 * questions. |
0 | 22 * |
23 */ | |
24 | |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
25 template <class T> inline void ParScanWeakRefClosure::do_oop_work(T* p) { |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
26 assert (!oopDesc::is_null(*p), "null weak reference?"); |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
27 oop obj = oopDesc::load_decode_heap_oop_not_null(p); |
0 | 28 // weak references are sometimes scanned twice; must check |
29 // that to-space doesn't already contain this object | |
30 if ((HeapWord*)obj < _boundary && !_g->to()->is_in_reserved(obj)) { | |
31 // we need to ensure that it is copied (see comment in | |
32 // ParScanClosure::do_oop_work). | |
33 klassOop objK = obj->klass(); | |
34 markOop m = obj->mark(); | |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
35 oop new_obj; |
0 | 36 if (m->is_marked()) { // Contains forwarding pointer. |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
37 new_obj = ParNewGeneration::real_forwardee(obj); |
0 | 38 } else { |
39 size_t obj_sz = obj->size_given_klass(objK->klass_part()); | |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
40 new_obj = ((ParNewGeneration*)_g)->copy_to_survivor_space(_par_scan_state, |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
41 obj, obj_sz, m); |
0 | 42 } |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
43 oopDesc::encode_store_heap_oop_not_null(p, new_obj); |
0 | 44 } |
45 } | |
46 | |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
47 inline void ParScanWeakRefClosure::do_oop_nv(oop* p) { ParScanWeakRefClosure::do_oop_work(p); } |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
48 inline void ParScanWeakRefClosure::do_oop_nv(narrowOop* p) { ParScanWeakRefClosure::do_oop_work(p); } |
0 | 49 |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
50 template <class T> inline void ParScanClosure::par_do_barrier(T* p) { |
0 | 51 assert(generation()->is_in_reserved(p), "expected ref in generation"); |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
52 assert(!oopDesc::is_null(*p), "expected non-null object"); |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
53 oop obj = oopDesc::load_decode_heap_oop_not_null(p); |
0 | 54 // If p points to a younger generation, mark the card. |
55 if ((HeapWord*)obj < gen_boundary()) { | |
56 rs()->write_ref_field_gc_par(p, obj); | |
57 } | |
58 } | |
59 | |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
60 template <class T> |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
61 inline void ParScanClosure::do_oop_work(T* p, |
0 | 62 bool gc_barrier, |
63 bool root_scan) { | |
64 assert((!Universe::heap()->is_in_reserved(p) || | |
65 generation()->is_in_reserved(p)) | |
66 && (generation()->level() == 0 || gc_barrier), | |
67 "The gen must be right, and we must be doing the barrier " | |
68 "in older generations."); | |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
69 T heap_oop = oopDesc::load_heap_oop(p); |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
70 if (!oopDesc::is_null(heap_oop)) { |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
71 oop obj = oopDesc::decode_heap_oop_not_null(heap_oop); |
0 | 72 if ((HeapWord*)obj < _boundary) { |
73 assert(!_g->to()->is_in_reserved(obj), "Scanning field twice?"); | |
74 // OK, we need to ensure that it is copied. | |
75 // We read the klass and mark in this order, so that we can reliably | |
76 // get the size of the object: if the mark we read is not a | |
77 // forwarding pointer, then the klass is valid: the klass is only | |
78 // overwritten with an overflow next pointer after the object is | |
79 // forwarded. | |
80 klassOop objK = obj->klass(); | |
81 markOop m = obj->mark(); | |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
82 oop new_obj; |
0 | 83 if (m->is_marked()) { // Contains forwarding pointer. |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
84 new_obj = ParNewGeneration::real_forwardee(obj); |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
85 oopDesc::encode_store_heap_oop_not_null(p, new_obj); |
0 | 86 } else { |
87 size_t obj_sz = obj->size_given_klass(objK->klass_part()); | |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
88 new_obj = _g->copy_to_survivor_space(_par_scan_state, obj, obj_sz, m); |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
89 oopDesc::encode_store_heap_oop_not_null(p, new_obj); |
0 | 90 if (root_scan) { |
91 // This may have pushed an object. If we have a root | |
92 // category with a lot of roots, can't let the queue get too | |
93 // full: | |
94 (void)_par_scan_state->trim_queues(10 * ParallelGCThreads); | |
95 } | |
96 } | |
97 if (gc_barrier) { | |
98 // Now call parent closure | |
99 par_do_barrier(p); | |
100 } | |
101 } | |
102 } | |
103 } | |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
104 |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
105 inline void ParScanWithBarrierClosure::do_oop_nv(oop* p) { ParScanClosure::do_oop_work(p, true, false); } |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
106 inline void ParScanWithBarrierClosure::do_oop_nv(narrowOop* p) { ParScanClosure::do_oop_work(p, true, false); } |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
107 |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
108 inline void ParScanWithoutBarrierClosure::do_oop_nv(oop* p) { ParScanClosure::do_oop_work(p, false, false); } |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
109 inline void ParScanWithoutBarrierClosure::do_oop_nv(narrowOop* p) { ParScanClosure::do_oop_work(p, false, false); } |