Mercurial > hg > truffle
annotate src/share/vm/oops/instanceRefKlass.cpp @ 4710:41406797186b
7113012: G1: rename not-fully-young GCs as "mixed"
Summary: Renamed partially-young GCs as mixed and fully-young GCs as young. Change all external output that includes those terms (GC log and GC ergo log) as well as any comments, fields, methods, etc. The changeset also includes very minor code tidying up (added some curly brackets).
Reviewed-by: johnc, brutisso
author | tonyp |
---|---|
date | Fri, 16 Dec 2011 02:14:27 -0500 |
parents | f94227b6117b |
children | b632e80fc9dc |
rev | line source |
---|---|
0 | 1 /* |
2227 | 2 * Copyright (c) 1997, 2011, 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:
1144
diff
changeset
|
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
c18cbe5936b8
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
1144
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:
1144
diff
changeset
|
21 * questions. |
0 | 22 * |
23 */ | |
24 | |
1972 | 25 #include "precompiled.hpp" |
26 #include "classfile/javaClasses.hpp" | |
27 #include "classfile/systemDictionary.hpp" | |
28 #include "gc_implementation/shared/markSweep.inline.hpp" | |
29 #include "gc_interface/collectedHeap.hpp" | |
30 #include "gc_interface/collectedHeap.inline.hpp" | |
31 #include "memory/genCollectedHeap.hpp" | |
32 #include "memory/genOopClosures.inline.hpp" | |
33 #include "oops/instanceRefKlass.hpp" | |
34 #include "oops/oop.inline.hpp" | |
35 #include "utilities/preserveException.hpp" | |
36 #ifndef SERIALGC | |
37 #include "gc_implementation/g1/g1CollectedHeap.inline.hpp" | |
38 #include "gc_implementation/g1/g1OopClosures.inline.hpp" | |
39 #include "gc_implementation/g1/g1RemSet.inline.hpp" | |
40 #include "gc_implementation/g1/heapRegionSeq.inline.hpp" | |
41 #include "gc_implementation/parNew/parOopClosures.inline.hpp" | |
42 #include "gc_implementation/parallelScavenge/psPromotionManager.inline.hpp" | |
43 #include "gc_implementation/parallelScavenge/psScavenge.inline.hpp" | |
44 #include "oops/oop.pcgc.inline.hpp" | |
45 #endif | |
0 | 46 |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
47 template <class T> |
3929
f94227b6117b
7090259: Fix hotspot sources to build with old compilers
kvn
parents:
3917
diff
changeset
|
48 void specialized_oop_follow_contents(instanceRefKlass* ref, oop obj) { |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
49 T* referent_addr = (T*)java_lang_ref_Reference::referent_addr(obj); |
845
df6caf649ff7
6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents:
356
diff
changeset
|
50 T heap_oop = oopDesc::load_heap_oop(referent_addr); |
0 | 51 debug_only( |
52 if(TraceReferenceGC && PrintGCDetails) { | |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
53 gclog_or_tty->print_cr("instanceRefKlass::oop_follow_contents " INTPTR_FORMAT, obj); |
0 | 54 } |
55 ) | |
845
df6caf649ff7
6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents:
356
diff
changeset
|
56 if (!oopDesc::is_null(heap_oop)) { |
df6caf649ff7
6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents:
356
diff
changeset
|
57 oop referent = oopDesc::decode_heap_oop_not_null(heap_oop); |
0 | 58 if (!referent->is_gc_marked() && |
3917
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
59 MarkSweep::ref_processor()->discover_reference(obj, ref->reference_type())) { |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
60 // reference was discovered, referent will be traversed later |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
61 ref->instanceKlass::oop_follow_contents(obj); |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
62 debug_only( |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
63 if(TraceReferenceGC && PrintGCDetails) { |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
64 gclog_or_tty->print_cr(" Non NULL enqueued " INTPTR_FORMAT, obj); |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
65 } |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
66 ) |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
67 return; |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
68 } else { |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
69 // treat referent as normal oop |
0 | 70 debug_only( |
71 if(TraceReferenceGC && PrintGCDetails) { | |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
72 gclog_or_tty->print_cr(" Non NULL normal " INTPTR_FORMAT, obj); |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
73 } |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
74 ) |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
75 MarkSweep::mark_and_push(referent_addr); |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
76 } |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
77 } |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
78 T* next_addr = (T*)java_lang_ref_Reference::next_addr(obj); |
3917
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
79 if (ReferenceProcessor::pending_list_uses_discovered_field()) { |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
80 // Treat discovered as normal oop, if ref is not "active", |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
81 // i.e. if next is non-NULL. |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
82 T next_oop = oopDesc::load_heap_oop(next_addr); |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
83 if (!oopDesc::is_null(next_oop)) { // i.e. ref is not "active" |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
84 T* discovered_addr = (T*)java_lang_ref_Reference::discovered_addr(obj); |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
85 debug_only( |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
86 if(TraceReferenceGC && PrintGCDetails) { |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
87 gclog_or_tty->print_cr(" Process discovered as normal " |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
88 INTPTR_FORMAT, discovered_addr); |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
89 } |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
90 ) |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
91 MarkSweep::mark_and_push(discovered_addr); |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
92 } |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
93 } else { |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
94 #ifdef ASSERT |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
95 // In the case of older JDKs which do not use the discovered |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
96 // field for the pending list, an inactive ref (next != NULL) |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
97 // must always have a NULL discovered field. |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
98 oop next = oopDesc::load_decode_heap_oop(next_addr); |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
99 oop discovered = java_lang_ref_Reference::discovered(obj); |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
100 assert(oopDesc::is_null(next) || oopDesc::is_null(discovered), |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
101 err_msg("Found an inactive reference " PTR_FORMAT " with a non-NULL discovered field", |
3929
f94227b6117b
7090259: Fix hotspot sources to build with old compilers
kvn
parents:
3917
diff
changeset
|
102 (oopDesc*)obj)); |
3917
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
103 #endif |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
104 } |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
105 // treat next as normal oop. next is a link in the reference queue. |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
106 debug_only( |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
107 if(TraceReferenceGC && PrintGCDetails) { |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
108 gclog_or_tty->print_cr(" Process next as normal " INTPTR_FORMAT, next_addr); |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
109 } |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
110 ) |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
111 MarkSweep::mark_and_push(next_addr); |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
112 ref->instanceKlass::oop_follow_contents(obj); |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
113 } |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
114 |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
115 void instanceRefKlass::oop_follow_contents(oop obj) { |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
116 if (UseCompressedOops) { |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
117 specialized_oop_follow_contents<narrowOop>(this, obj); |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
118 } else { |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
119 specialized_oop_follow_contents<oop>(this, obj); |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
120 } |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
121 } |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
122 |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
123 #ifndef SERIALGC |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
124 template <class T> |
1123
167c2986d91b
6843629: Make current hotspot build part of jdk5 control build
phh
parents:
948
diff
changeset
|
125 void specialized_oop_follow_contents(instanceRefKlass* ref, |
167c2986d91b
6843629: Make current hotspot build part of jdk5 control build
phh
parents:
948
diff
changeset
|
126 ParCompactionManager* cm, |
167c2986d91b
6843629: Make current hotspot build part of jdk5 control build
phh
parents:
948
diff
changeset
|
127 oop obj) { |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
128 T* referent_addr = (T*)java_lang_ref_Reference::referent_addr(obj); |
845
df6caf649ff7
6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents:
356
diff
changeset
|
129 T heap_oop = oopDesc::load_heap_oop(referent_addr); |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
130 debug_only( |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
131 if(TraceReferenceGC && PrintGCDetails) { |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
132 gclog_or_tty->print_cr("instanceRefKlass::oop_follow_contents " INTPTR_FORMAT, obj); |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
133 } |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
134 ) |
845
df6caf649ff7
6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents:
356
diff
changeset
|
135 if (!oopDesc::is_null(heap_oop)) { |
df6caf649ff7
6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents:
356
diff
changeset
|
136 oop referent = oopDesc::decode_heap_oop_not_null(heap_oop); |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
137 if (PSParallelCompact::mark_bitmap()->is_unmarked(referent) && |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
138 PSParallelCompact::ref_processor()-> |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
139 discover_reference(obj, ref->reference_type())) { |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
140 // reference already enqueued, referent will be traversed later |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
141 ref->instanceKlass::oop_follow_contents(cm, obj); |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
142 debug_only( |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
143 if(TraceReferenceGC && PrintGCDetails) { |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
144 gclog_or_tty->print_cr(" Non NULL enqueued " INTPTR_FORMAT, obj); |
0 | 145 } |
146 ) | |
147 return; | |
148 } else { | |
149 // treat referent as normal oop | |
150 debug_only( | |
151 if(TraceReferenceGC && PrintGCDetails) { | |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
152 gclog_or_tty->print_cr(" Non NULL normal " INTPTR_FORMAT, obj); |
0 | 153 } |
154 ) | |
155 PSParallelCompact::mark_and_push(cm, referent_addr); | |
156 } | |
157 } | |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
158 T* next_addr = (T*)java_lang_ref_Reference::next_addr(obj); |
3917
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
159 if (ReferenceProcessor::pending_list_uses_discovered_field()) { |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
160 // Treat discovered as normal oop, if ref is not "active", |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
161 // i.e. if next is non-NULL. |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
162 T next_oop = oopDesc::load_heap_oop(next_addr); |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
163 if (!oopDesc::is_null(next_oop)) { // i.e. ref is not "active" |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
164 T* discovered_addr = (T*)java_lang_ref_Reference::discovered_addr(obj); |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
165 debug_only( |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
166 if(TraceReferenceGC && PrintGCDetails) { |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
167 gclog_or_tty->print_cr(" Process discovered as normal " |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
168 INTPTR_FORMAT, discovered_addr); |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
169 } |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
170 ) |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
171 PSParallelCompact::mark_and_push(cm, discovered_addr); |
0 | 172 } |
3917
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
173 } else { |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
174 #ifdef ASSERT |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
175 // In the case of older JDKs which do not use the discovered |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
176 // field for the pending list, an inactive ref (next != NULL) |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
177 // must always have a NULL discovered field. |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
178 T next = oopDesc::load_heap_oop(next_addr); |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
179 oop discovered = java_lang_ref_Reference::discovered(obj); |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
180 assert(oopDesc::is_null(next) || oopDesc::is_null(discovered), |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
181 err_msg("Found an inactive reference " PTR_FORMAT " with a non-NULL discovered field", |
3929
f94227b6117b
7090259: Fix hotspot sources to build with old compilers
kvn
parents:
3917
diff
changeset
|
182 (oopDesc*)obj)); |
3917
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
183 #endif |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
184 } |
0 | 185 PSParallelCompact::mark_and_push(cm, next_addr); |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
186 ref->instanceKlass::oop_follow_contents(cm, obj); |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
187 } |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
188 |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
189 void instanceRefKlass::oop_follow_contents(ParCompactionManager* cm, |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
190 oop obj) { |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
191 if (UseCompressedOops) { |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
192 specialized_oop_follow_contents<narrowOop>(this, cm, obj); |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
193 } else { |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
194 specialized_oop_follow_contents<oop>(this, cm, obj); |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
195 } |
0 | 196 } |
197 #endif // SERIALGC | |
198 | |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
199 #ifdef ASSERT |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
200 template <class T> void trace_reference_gc(const char *s, oop obj, |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
201 T* referent_addr, |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
202 T* next_addr, |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
203 T* discovered_addr) { |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
204 if(TraceReferenceGC && PrintGCDetails) { |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
205 gclog_or_tty->print_cr("%s obj " INTPTR_FORMAT, s, (address)obj); |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
206 gclog_or_tty->print_cr(" referent_addr/* " INTPTR_FORMAT " / " |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
207 INTPTR_FORMAT, referent_addr, |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
208 referent_addr ? |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
209 (address)oopDesc::load_decode_heap_oop(referent_addr) : NULL); |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
210 gclog_or_tty->print_cr(" next_addr/* " INTPTR_FORMAT " / " |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
211 INTPTR_FORMAT, next_addr, |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
212 next_addr ? (address)oopDesc::load_decode_heap_oop(next_addr) : NULL); |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
213 gclog_or_tty->print_cr(" discovered_addr/* " INTPTR_FORMAT " / " |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
214 INTPTR_FORMAT, discovered_addr, |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
215 discovered_addr ? |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
216 (address)oopDesc::load_decode_heap_oop(discovered_addr) : NULL); |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
217 } |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
218 } |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
219 #endif |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
220 |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
221 template <class T> void specialized_oop_adjust_pointers(instanceRefKlass *ref, oop obj) { |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
222 T* referent_addr = (T*)java_lang_ref_Reference::referent_addr(obj); |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
223 MarkSweep::adjust_pointer(referent_addr); |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
224 T* next_addr = (T*)java_lang_ref_Reference::next_addr(obj); |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
225 MarkSweep::adjust_pointer(next_addr); |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
226 T* discovered_addr = (T*)java_lang_ref_Reference::discovered_addr(obj); |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
227 MarkSweep::adjust_pointer(discovered_addr); |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
228 debug_only(trace_reference_gc("instanceRefKlass::oop_adjust_pointers", obj, |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
229 referent_addr, next_addr, discovered_addr);) |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
230 } |
0 | 231 |
232 int instanceRefKlass::oop_adjust_pointers(oop obj) { | |
233 int size = size_helper(); | |
234 instanceKlass::oop_adjust_pointers(obj); | |
235 | |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
236 if (UseCompressedOops) { |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
237 specialized_oop_adjust_pointers<narrowOop>(this, obj); |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
238 } else { |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
239 specialized_oop_adjust_pointers<oop>(this, obj); |
0 | 240 } |
241 return size; | |
242 } | |
243 | |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
244 #define InstanceRefKlass_SPECIALIZED_OOP_ITERATE(T, nv_suffix, contains) \ |
3917
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
245 T* disc_addr = (T*)java_lang_ref_Reference::discovered_addr(obj); \ |
342
37f87013dfd8
6711316: Open source the Garbage-First garbage collector
ysr
parents:
113
diff
changeset
|
246 if (closure->apply_to_weak_ref_discovered_field()) { \ |
37f87013dfd8
6711316: Open source the Garbage-First garbage collector
ysr
parents:
113
diff
changeset
|
247 closure->do_oop##nv_suffix(disc_addr); \ |
37f87013dfd8
6711316: Open source the Garbage-First garbage collector
ysr
parents:
113
diff
changeset
|
248 } \ |
37f87013dfd8
6711316: Open source the Garbage-First garbage collector
ysr
parents:
113
diff
changeset
|
249 \ |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
250 T* referent_addr = (T*)java_lang_ref_Reference::referent_addr(obj); \ |
845
df6caf649ff7
6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents:
356
diff
changeset
|
251 T heap_oop = oopDesc::load_heap_oop(referent_addr); \ |
3917
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
252 ReferenceProcessor* rp = closure->_ref_processor; \ |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
253 if (!oopDesc::is_null(heap_oop)) { \ |
845
df6caf649ff7
6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents:
356
diff
changeset
|
254 oop referent = oopDesc::decode_heap_oop_not_null(heap_oop); \ |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
255 if (!referent->is_gc_marked() && (rp != NULL) && \ |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
256 rp->discover_reference(obj, reference_type())) { \ |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
257 return size; \ |
3917
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
258 } else if (contains(referent_addr)) { \ |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
259 /* treat referent as normal oop */ \ |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
260 SpecializationStats::record_do_oop_call##nv_suffix(SpecializationStats::irk);\ |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
261 closure->do_oop##nv_suffix(referent_addr); \ |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
262 } \ |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
263 } \ |
3917
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
264 T* next_addr = (T*)java_lang_ref_Reference::next_addr(obj); \ |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
265 if (ReferenceProcessor::pending_list_uses_discovered_field()) { \ |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
266 T next_oop = oopDesc::load_heap_oop(next_addr); \ |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
267 /* Treat discovered as normal oop, if ref is not "active" (next non-NULL) */\ |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
268 if (!oopDesc::is_null(next_oop) && contains(disc_addr)) { \ |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
269 /* i.e. ref is not "active" */ \ |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
270 debug_only( \ |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
271 if(TraceReferenceGC && PrintGCDetails) { \ |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
272 gclog_or_tty->print_cr(" Process discovered as normal " \ |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
273 INTPTR_FORMAT, disc_addr); \ |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
274 } \ |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
275 ) \ |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
276 SpecializationStats::record_do_oop_call##nv_suffix(SpecializationStats::irk);\ |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
277 closure->do_oop##nv_suffix(disc_addr); \ |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
278 } \ |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
279 } else { \ |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
280 /* In the case of older JDKs which do not use the discovered field for */ \ |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
281 /* the pending list, an inactive ref (next != NULL) must always have a */ \ |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
282 /* NULL discovered field. */ \ |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
283 debug_only( \ |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
284 T next_oop = oopDesc::load_heap_oop(next_addr); \ |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
285 T disc_oop = oopDesc::load_heap_oop(disc_addr); \ |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
286 assert(oopDesc::is_null(next_oop) || oopDesc::is_null(disc_oop), \ |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
287 err_msg("Found an inactive reference " PTR_FORMAT " with a non-NULL" \ |
3929
f94227b6117b
7090259: Fix hotspot sources to build with old compilers
kvn
parents:
3917
diff
changeset
|
288 "discovered field", (oopDesc*)obj)); \ |
3917
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
289 ) \ |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
290 } \ |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
291 /* treat next as normal oop */ \ |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
292 if (contains(next_addr)) { \ |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
293 SpecializationStats::record_do_oop_call##nv_suffix(SpecializationStats::irk); \ |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
294 closure->do_oop##nv_suffix(next_addr); \ |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
295 } \ |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
296 return size; \ |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
297 |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
298 |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
299 template <class T> bool contains(T *t) { return true; } |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
300 |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
301 // Macro to define instanceRefKlass::oop_oop_iterate for virtual/nonvirtual for |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
302 // all closures. Macros calling macros above for each oop size. |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
303 |
0 | 304 #define InstanceRefKlass_OOP_OOP_ITERATE_DEFN(OopClosureType, nv_suffix) \ |
305 \ | |
306 int instanceRefKlass:: \ | |
307 oop_oop_iterate##nv_suffix(oop obj, OopClosureType* closure) { \ | |
308 /* Get size before changing pointers */ \ | |
309 SpecializationStats::record_iterate_call##nv_suffix(SpecializationStats::irk);\ | |
310 \ | |
311 int size = instanceKlass::oop_oop_iterate##nv_suffix(obj, closure); \ | |
312 \ | |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
313 if (UseCompressedOops) { \ |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
314 InstanceRefKlass_SPECIALIZED_OOP_ITERATE(narrowOop, nv_suffix, contains); \ |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
315 } else { \ |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
316 InstanceRefKlass_SPECIALIZED_OOP_ITERATE(oop, nv_suffix, contains); \ |
0 | 317 } \ |
318 } | |
319 | |
342
37f87013dfd8
6711316: Open source the Garbage-First garbage collector
ysr
parents:
113
diff
changeset
|
320 #ifndef SERIALGC |
37f87013dfd8
6711316: Open source the Garbage-First garbage collector
ysr
parents:
113
diff
changeset
|
321 #define InstanceRefKlass_OOP_OOP_ITERATE_BACKWARDS_DEFN(OopClosureType, nv_suffix) \ |
37f87013dfd8
6711316: Open source the Garbage-First garbage collector
ysr
parents:
113
diff
changeset
|
322 \ |
37f87013dfd8
6711316: Open source the Garbage-First garbage collector
ysr
parents:
113
diff
changeset
|
323 int instanceRefKlass:: \ |
37f87013dfd8
6711316: Open source the Garbage-First garbage collector
ysr
parents:
113
diff
changeset
|
324 oop_oop_iterate_backwards##nv_suffix(oop obj, OopClosureType* closure) { \ |
37f87013dfd8
6711316: Open source the Garbage-First garbage collector
ysr
parents:
113
diff
changeset
|
325 /* Get size before changing pointers */ \ |
37f87013dfd8
6711316: Open source the Garbage-First garbage collector
ysr
parents:
113
diff
changeset
|
326 SpecializationStats::record_iterate_call##nv_suffix(SpecializationStats::irk);\ |
37f87013dfd8
6711316: Open source the Garbage-First garbage collector
ysr
parents:
113
diff
changeset
|
327 \ |
37f87013dfd8
6711316: Open source the Garbage-First garbage collector
ysr
parents:
113
diff
changeset
|
328 int size = instanceKlass::oop_oop_iterate_backwards##nv_suffix(obj, closure); \ |
37f87013dfd8
6711316: Open source the Garbage-First garbage collector
ysr
parents:
113
diff
changeset
|
329 \ |
37f87013dfd8
6711316: Open source the Garbage-First garbage collector
ysr
parents:
113
diff
changeset
|
330 if (UseCompressedOops) { \ |
37f87013dfd8
6711316: Open source the Garbage-First garbage collector
ysr
parents:
113
diff
changeset
|
331 InstanceRefKlass_SPECIALIZED_OOP_ITERATE(narrowOop, nv_suffix, contains); \ |
37f87013dfd8
6711316: Open source the Garbage-First garbage collector
ysr
parents:
113
diff
changeset
|
332 } else { \ |
37f87013dfd8
6711316: Open source the Garbage-First garbage collector
ysr
parents:
113
diff
changeset
|
333 InstanceRefKlass_SPECIALIZED_OOP_ITERATE(oop, nv_suffix, contains); \ |
37f87013dfd8
6711316: Open source the Garbage-First garbage collector
ysr
parents:
113
diff
changeset
|
334 } \ |
37f87013dfd8
6711316: Open source the Garbage-First garbage collector
ysr
parents:
113
diff
changeset
|
335 } |
37f87013dfd8
6711316: Open source the Garbage-First garbage collector
ysr
parents:
113
diff
changeset
|
336 #endif // !SERIALGC |
37f87013dfd8
6711316: Open source the Garbage-First garbage collector
ysr
parents:
113
diff
changeset
|
337 |
37f87013dfd8
6711316: Open source the Garbage-First garbage collector
ysr
parents:
113
diff
changeset
|
338 |
0 | 339 #define InstanceRefKlass_OOP_OOP_ITERATE_DEFN_m(OopClosureType, nv_suffix) \ |
340 \ | |
341 int instanceRefKlass:: \ | |
342 oop_oop_iterate##nv_suffix##_m(oop obj, \ | |
343 OopClosureType* closure, \ | |
344 MemRegion mr) { \ | |
345 SpecializationStats::record_iterate_call##nv_suffix(SpecializationStats::irk);\ | |
346 \ | |
347 int size = instanceKlass::oop_oop_iterate##nv_suffix##_m(obj, closure, mr); \ | |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
348 if (UseCompressedOops) { \ |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
349 InstanceRefKlass_SPECIALIZED_OOP_ITERATE(narrowOop, nv_suffix, mr.contains); \ |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
350 } else { \ |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
351 InstanceRefKlass_SPECIALIZED_OOP_ITERATE(oop, nv_suffix, mr.contains); \ |
0 | 352 } \ |
353 } | |
354 | |
355 ALL_OOP_OOP_ITERATE_CLOSURES_1(InstanceRefKlass_OOP_OOP_ITERATE_DEFN) | |
342
37f87013dfd8
6711316: Open source the Garbage-First garbage collector
ysr
parents:
113
diff
changeset
|
356 ALL_OOP_OOP_ITERATE_CLOSURES_2(InstanceRefKlass_OOP_OOP_ITERATE_DEFN) |
37f87013dfd8
6711316: Open source the Garbage-First garbage collector
ysr
parents:
113
diff
changeset
|
357 #ifndef SERIALGC |
37f87013dfd8
6711316: Open source the Garbage-First garbage collector
ysr
parents:
113
diff
changeset
|
358 ALL_OOP_OOP_ITERATE_CLOSURES_1(InstanceRefKlass_OOP_OOP_ITERATE_BACKWARDS_DEFN) |
37f87013dfd8
6711316: Open source the Garbage-First garbage collector
ysr
parents:
113
diff
changeset
|
359 ALL_OOP_OOP_ITERATE_CLOSURES_2(InstanceRefKlass_OOP_OOP_ITERATE_BACKWARDS_DEFN) |
37f87013dfd8
6711316: Open source the Garbage-First garbage collector
ysr
parents:
113
diff
changeset
|
360 #endif // SERIALGC |
0 | 361 ALL_OOP_OOP_ITERATE_CLOSURES_1(InstanceRefKlass_OOP_OOP_ITERATE_DEFN_m) |
342
37f87013dfd8
6711316: Open source the Garbage-First garbage collector
ysr
parents:
113
diff
changeset
|
362 ALL_OOP_OOP_ITERATE_CLOSURES_2(InstanceRefKlass_OOP_OOP_ITERATE_DEFN_m) |
0 | 363 |
364 #ifndef SERIALGC | |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
365 template <class T> |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
366 void specialized_oop_push_contents(instanceRefKlass *ref, |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
367 PSPromotionManager* pm, oop obj) { |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
368 T* referent_addr = (T*)java_lang_ref_Reference::referent_addr(obj); |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
369 if (PSScavenge::should_scavenge(referent_addr)) { |
0 | 370 ReferenceProcessor* rp = PSScavenge::reference_processor(); |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
371 if (rp->discover_reference(obj, ref->reference_type())) { |
0 | 372 // reference already enqueued, referent and next will be traversed later |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
373 ref->instanceKlass::oop_push_contents(pm, obj); |
0 | 374 return; |
375 } else { | |
376 // treat referent as normal oop | |
377 pm->claim_or_forward_depth(referent_addr); | |
378 } | |
379 } | |
3917
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
380 // Treat discovered as normal oop, if ref is not "active", |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
381 // i.e. if next is non-NULL. |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
382 T* next_addr = (T*)java_lang_ref_Reference::next_addr(obj); |
3917
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
383 if (ReferenceProcessor::pending_list_uses_discovered_field()) { |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
384 T next_oop = oopDesc::load_heap_oop(next_addr); |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
385 if (!oopDesc::is_null(next_oop)) { // i.e. ref is not "active" |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
386 T* discovered_addr = (T*)java_lang_ref_Reference::discovered_addr(obj); |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
387 debug_only( |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
388 if(TraceReferenceGC && PrintGCDetails) { |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
389 gclog_or_tty->print_cr(" Process discovered as normal " |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
390 INTPTR_FORMAT, discovered_addr); |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
391 } |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
392 ) |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
393 if (PSScavenge::should_scavenge(discovered_addr)) { |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
394 pm->claim_or_forward_depth(discovered_addr); |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
395 } |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
396 } |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
397 } else { |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
398 #ifdef ASSERT |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
399 // In the case of older JDKs which do not use the discovered |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
400 // field for the pending list, an inactive ref (next != NULL) |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
401 // must always have a NULL discovered field. |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
402 oop next = oopDesc::load_decode_heap_oop(next_addr); |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
403 oop discovered = java_lang_ref_Reference::discovered(obj); |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
404 assert(oopDesc::is_null(next) || oopDesc::is_null(discovered), |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
405 err_msg("Found an inactive reference " PTR_FORMAT " with a non-NULL discovered field", |
3929
f94227b6117b
7090259: Fix hotspot sources to build with old compilers
kvn
parents:
3917
diff
changeset
|
406 (oopDesc*)obj)); |
3917
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
407 #endif |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
408 } |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
409 |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
410 // Treat next as normal oop; next is a link in the reference queue. |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
411 if (PSScavenge::should_scavenge(next_addr)) { |
0 | 412 pm->claim_or_forward_depth(next_addr); |
413 } | |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
414 ref->instanceKlass::oop_push_contents(pm, obj); |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
415 } |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
416 |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
417 void instanceRefKlass::oop_push_contents(PSPromotionManager* pm, oop obj) { |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
418 if (UseCompressedOops) { |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
419 specialized_oop_push_contents<narrowOop>(this, pm, obj); |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
420 } else { |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
421 specialized_oop_push_contents<oop>(this, pm, obj); |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
422 } |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
423 } |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
424 |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
425 template <class T> |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
426 void specialized_oop_update_pointers(instanceRefKlass *ref, |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
427 ParCompactionManager* cm, oop obj) { |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
428 T* referent_addr = (T*)java_lang_ref_Reference::referent_addr(obj); |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
429 PSParallelCompact::adjust_pointer(referent_addr); |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
430 T* next_addr = (T*)java_lang_ref_Reference::next_addr(obj); |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
431 PSParallelCompact::adjust_pointer(next_addr); |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
432 T* discovered_addr = (T*)java_lang_ref_Reference::discovered_addr(obj); |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
433 PSParallelCompact::adjust_pointer(discovered_addr); |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
434 debug_only(trace_reference_gc("instanceRefKlass::oop_update_ptrs", obj, |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
435 referent_addr, next_addr, discovered_addr);) |
0 | 436 } |
437 | |
438 int instanceRefKlass::oop_update_pointers(ParCompactionManager* cm, oop obj) { | |
439 instanceKlass::oop_update_pointers(cm, obj); | |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
440 if (UseCompressedOops) { |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
441 specialized_oop_update_pointers<narrowOop>(this, cm, obj); |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
442 } else { |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
443 specialized_oop_update_pointers<oop>(this, cm, obj); |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
444 } |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
445 return size_helper(); |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
446 } |
0 | 447 #endif // SERIALGC |
448 | |
449 void instanceRefKlass::update_nonstatic_oop_maps(klassOop k) { | |
450 // Clear the nonstatic oop-map entries corresponding to referent | |
451 // and nextPending field. They are treated specially by the | |
452 // garbage collector. | |
453 // The discovered field is used only by the garbage collector | |
454 // and is also treated specially. | |
455 instanceKlass* ik = instanceKlass::cast(k); | |
456 | |
457 // Check that we have the right class | |
458 debug_only(static bool first_time = true); | |
1142 | 459 assert(k == SystemDictionary::Reference_klass() && first_time, |
0 | 460 "Invalid update of maps"); |
461 debug_only(first_time = false); | |
938 | 462 assert(ik->nonstatic_oop_map_count() == 1, "just checking"); |
0 | 463 |
464 OopMapBlock* map = ik->start_of_nonstatic_oop_maps(); | |
465 | |
466 // Check that the current map is (2,4) - currently points at field with | |
467 // offset 2 (words) and has 4 map entries. | |
468 debug_only(int offset = java_lang_ref_Reference::referent_offset); | |
939
9eebd3ac74cf
6845368: large objects cause a crash or unexpected exception
jcoomes
parents:
938
diff
changeset
|
469 debug_only(unsigned int count = ((java_lang_ref_Reference::discovered_offset - |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
470 java_lang_ref_Reference::referent_offset)/heapOopSize) + 1); |
0 | 471 |
472 if (UseSharedSpaces) { | |
473 assert(map->offset() == java_lang_ref_Reference::queue_offset && | |
938 | 474 map->count() == 1, "just checking"); |
0 | 475 } else { |
938 | 476 assert(map->offset() == offset && map->count() == count, |
0 | 477 "just checking"); |
478 | |
479 // Update map to (3,1) - point to offset of 3 (words) with 1 map entry. | |
480 map->set_offset(java_lang_ref_Reference::queue_offset); | |
938 | 481 map->set_count(1); |
0 | 482 } |
483 } | |
484 | |
485 | |
486 // Verification | |
487 | |
488 void instanceRefKlass::oop_verify_on(oop obj, outputStream* st) { | |
489 instanceKlass::oop_verify_on(obj, st); | |
490 // Verify referent field | |
491 oop referent = java_lang_ref_Reference::referent(obj); | |
492 | |
493 // We should make this general to all heaps | |
494 GenCollectedHeap* gch = NULL; | |
495 if (Universe::heap()->kind() == CollectedHeap::GenCollectedHeap) | |
496 gch = GenCollectedHeap::heap(); | |
497 | |
498 if (referent != NULL) { | |
499 guarantee(referent->is_oop(), "referent field heap failed"); | |
3377
2aa9ddbb9e60
7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents:
2227
diff
changeset
|
500 if (gch != NULL && !gch->is_in_young(obj)) { |
0 | 501 // We do a specific remembered set check here since the referent |
502 // field is not part of the oop mask and therefore skipped by the | |
503 // regular verify code. | |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
504 if (UseCompressedOops) { |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
505 narrowOop* referent_addr = (narrowOop*)java_lang_ref_Reference::referent_addr(obj); |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
506 obj->verify_old_oop(referent_addr, true); |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
507 } else { |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
508 oop* referent_addr = (oop*)java_lang_ref_Reference::referent_addr(obj); |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
509 obj->verify_old_oop(referent_addr, true); |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
510 } |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
511 } |
0 | 512 } |
513 // Verify next field | |
514 oop next = java_lang_ref_Reference::next(obj); | |
515 if (next != NULL) { | |
342
37f87013dfd8
6711316: Open source the Garbage-First garbage collector
ysr
parents:
113
diff
changeset
|
516 guarantee(next->is_oop(), "next field verify failed"); |
0 | 517 guarantee(next->is_instanceRef(), "next field verify failed"); |
3377
2aa9ddbb9e60
7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents:
2227
diff
changeset
|
518 if (gch != NULL && !gch->is_in_young(obj)) { |
0 | 519 // We do a specific remembered set check here since the next field is |
520 // not part of the oop mask and therefore skipped by the regular | |
521 // verify code. | |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
522 if (UseCompressedOops) { |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
523 narrowOop* next_addr = (narrowOop*)java_lang_ref_Reference::next_addr(obj); |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
524 obj->verify_old_oop(next_addr, true); |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
525 } else { |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
526 oop* next_addr = (oop*)java_lang_ref_Reference::next_addr(obj); |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
527 obj->verify_old_oop(next_addr, true); |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
528 } |
0 | 529 } |
530 } | |
531 } | |
532 | |
2021
7cf1a74771e8
6988439: Parallel Class Loading test deadlock involving MethodData_lock and Pending List Lock
coleenp
parents:
1972
diff
changeset
|
533 bool instanceRefKlass::owns_pending_list_lock(JavaThread* thread) { |
2025
b03e6b4c7c75
7006471: fix for 6988439 crashes when pending list lock is null
coleenp
parents:
2021
diff
changeset
|
534 if (java_lang_ref_Reference::pending_list_lock() == NULL) return false; |
2021
7cf1a74771e8
6988439: Parallel Class Loading test deadlock involving MethodData_lock and Pending List Lock
coleenp
parents:
1972
diff
changeset
|
535 Handle h_lock(thread, java_lang_ref_Reference::pending_list_lock()); |
7cf1a74771e8
6988439: Parallel Class Loading test deadlock involving MethodData_lock and Pending List Lock
coleenp
parents:
1972
diff
changeset
|
536 return ObjectSynchronizer::current_thread_holds_lock(thread, h_lock); |
7cf1a74771e8
6988439: Parallel Class Loading test deadlock involving MethodData_lock and Pending List Lock
coleenp
parents:
1972
diff
changeset
|
537 } |
7cf1a74771e8
6988439: Parallel Class Loading test deadlock involving MethodData_lock and Pending List Lock
coleenp
parents:
1972
diff
changeset
|
538 |
0 | 539 void instanceRefKlass::acquire_pending_list_lock(BasicLock *pending_list_basic_lock) { |
540 // we may enter this with pending exception set | |
541 PRESERVE_EXCEPTION_MARK; // exceptions are never thrown, needed for TRAPS argument | |
542 Handle h_lock(THREAD, java_lang_ref_Reference::pending_list_lock()); | |
543 ObjectSynchronizer::fast_enter(h_lock, pending_list_basic_lock, false, THREAD); | |
544 assert(ObjectSynchronizer::current_thread_holds_lock( | |
545 JavaThread::current(), h_lock), | |
546 "Locking should have succeeded"); | |
547 if (HAS_PENDING_EXCEPTION) CLEAR_PENDING_EXCEPTION; | |
548 } | |
549 | |
550 void instanceRefKlass::release_and_notify_pending_list_lock( | |
551 BasicLock *pending_list_basic_lock) { | |
552 // we may enter this with pending exception set | |
553 PRESERVE_EXCEPTION_MARK; // exceptions are never thrown, needed for TRAPS argument | |
554 // | |
555 Handle h_lock(THREAD, java_lang_ref_Reference::pending_list_lock()); | |
556 assert(ObjectSynchronizer::current_thread_holds_lock( | |
557 JavaThread::current(), h_lock), | |
558 "Lock should be held"); | |
559 // Notify waiters on pending lists lock if there is any reference. | |
560 if (java_lang_ref_Reference::pending_list() != NULL) { | |
561 ObjectSynchronizer::notifyall(h_lock, THREAD); | |
562 } | |
563 ObjectSynchronizer::fast_exit(h_lock(), pending_list_basic_lock, THREAD); | |
564 if (HAS_PENDING_EXCEPTION) CLEAR_PENDING_EXCEPTION; | |
565 } |