Mercurial > hg > truffle
annotate src/share/vm/memory/referenceProcessor.cpp @ 3992:d1bdeef3e3e2
7098282: G1: assert(interval >= 0) failed: Sanity check, referencePolicy.cpp: 76
Summary: There is a race between one thread successfully forwarding and copying the klass mirror for the SoftReference class (including the static master clock) and another thread attempting to use the master clock while attempting to discover a soft reference object. Maintain a shadow copy of the soft reference master clock and use the shadow during reference discovery and reference processing.
Reviewed-by: tonyp, brutisso, ysr
author | johnc |
---|---|
date | Wed, 12 Oct 2011 10:25:51 -0700 |
parents | 4dfb2df418f2 |
children | bf2d2b8b1726 |
rev | line source |
---|---|
0 | 1 /* |
2369
92da084fefc9
6668573: CMS: reference processing crash if ParallelCMSThreads > ParallelGCThreads
ysr
parents:
1995
diff
changeset
|
2 * Copyright (c) 2001, 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:
1190
diff
changeset
|
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
c18cbe5936b8
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
1190
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:
1190
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_interface/collectedHeap.hpp" | |
29 #include "gc_interface/collectedHeap.inline.hpp" | |
30 #include "memory/referencePolicy.hpp" | |
31 #include "memory/referenceProcessor.hpp" | |
32 #include "oops/oop.inline.hpp" | |
33 #include "runtime/java.hpp" | |
34 #include "runtime/jniHandles.hpp" | |
0 | 35 |
453
c96030fff130
6684579: SoftReference processing can be made more efficient
ysr
parents:
452
diff
changeset
|
36 ReferencePolicy* ReferenceProcessor::_always_clear_soft_ref_policy = NULL; |
c96030fff130
6684579: SoftReference processing can be made more efficient
ysr
parents:
452
diff
changeset
|
37 ReferencePolicy* ReferenceProcessor::_default_soft_ref_policy = NULL; |
3917
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3915
diff
changeset
|
38 bool ReferenceProcessor::_pending_list_uses_discovered_field = false; |
3992
d1bdeef3e3e2
7098282: G1: assert(interval >= 0) failed: Sanity check, referencePolicy.cpp: 76
johnc
parents:
3979
diff
changeset
|
39 jlong ReferenceProcessor::_soft_ref_timestamp_clock = 0; |
453
c96030fff130
6684579: SoftReference processing can be made more efficient
ysr
parents:
452
diff
changeset
|
40 |
0 | 41 void referenceProcessor_init() { |
42 ReferenceProcessor::init_statics(); | |
43 } | |
44 | |
45 void ReferenceProcessor::init_statics() { | |
3992
d1bdeef3e3e2
7098282: G1: assert(interval >= 0) failed: Sanity check, referencePolicy.cpp: 76
johnc
parents:
3979
diff
changeset
|
46 jlong now = os::javaTimeMillis(); |
d1bdeef3e3e2
7098282: G1: assert(interval >= 0) failed: Sanity check, referencePolicy.cpp: 76
johnc
parents:
3979
diff
changeset
|
47 |
d1bdeef3e3e2
7098282: G1: assert(interval >= 0) failed: Sanity check, referencePolicy.cpp: 76
johnc
parents:
3979
diff
changeset
|
48 // Initialize the soft ref timestamp clock. |
d1bdeef3e3e2
7098282: G1: assert(interval >= 0) failed: Sanity check, referencePolicy.cpp: 76
johnc
parents:
3979
diff
changeset
|
49 _soft_ref_timestamp_clock = now; |
d1bdeef3e3e2
7098282: G1: assert(interval >= 0) failed: Sanity check, referencePolicy.cpp: 76
johnc
parents:
3979
diff
changeset
|
50 // Also update the soft ref clock in j.l.r.SoftReference |
d1bdeef3e3e2
7098282: G1: assert(interval >= 0) failed: Sanity check, referencePolicy.cpp: 76
johnc
parents:
3979
diff
changeset
|
51 java_lang_ref_SoftReference::set_clock(_soft_ref_timestamp_clock); |
0 | 52 |
453
c96030fff130
6684579: SoftReference processing can be made more efficient
ysr
parents:
452
diff
changeset
|
53 _always_clear_soft_ref_policy = new AlwaysClearPolicy(); |
c96030fff130
6684579: SoftReference processing can be made more efficient
ysr
parents:
452
diff
changeset
|
54 _default_soft_ref_policy = new COMPILER2_PRESENT(LRUMaxHeapPolicy()) |
c96030fff130
6684579: SoftReference processing can be made more efficient
ysr
parents:
452
diff
changeset
|
55 NOT_COMPILER2(LRUCurrentHeapPolicy()); |
c96030fff130
6684579: SoftReference processing can be made more efficient
ysr
parents:
452
diff
changeset
|
56 if (_always_clear_soft_ref_policy == NULL || _default_soft_ref_policy == NULL) { |
c96030fff130
6684579: SoftReference processing can be made more efficient
ysr
parents:
452
diff
changeset
|
57 vm_exit_during_initialization("Could not allocate reference policy object"); |
c96030fff130
6684579: SoftReference processing can be made more efficient
ysr
parents:
452
diff
changeset
|
58 } |
0 | 59 guarantee(RefDiscoveryPolicy == ReferenceBasedDiscovery || |
60 RefDiscoveryPolicy == ReferentBasedDiscovery, | |
61 "Unrecongnized RefDiscoveryPolicy"); | |
3917
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3915
diff
changeset
|
62 _pending_list_uses_discovered_field = JDK_Version::current().pending_list_uses_discovered_field(); |
0 | 63 } |
64 | |
3992
d1bdeef3e3e2
7098282: G1: assert(interval >= 0) failed: Sanity check, referencePolicy.cpp: 76
johnc
parents:
3979
diff
changeset
|
65 void ReferenceProcessor::enable_discovery(bool verify_disabled, bool check_no_refs) { |
d1bdeef3e3e2
7098282: G1: assert(interval >= 0) failed: Sanity check, referencePolicy.cpp: 76
johnc
parents:
3979
diff
changeset
|
66 #ifdef ASSERT |
d1bdeef3e3e2
7098282: G1: assert(interval >= 0) failed: Sanity check, referencePolicy.cpp: 76
johnc
parents:
3979
diff
changeset
|
67 // Verify that we're not currently discovering refs |
d1bdeef3e3e2
7098282: G1: assert(interval >= 0) failed: Sanity check, referencePolicy.cpp: 76
johnc
parents:
3979
diff
changeset
|
68 assert(!verify_disabled || !_discovering_refs, "nested call?"); |
d1bdeef3e3e2
7098282: G1: assert(interval >= 0) failed: Sanity check, referencePolicy.cpp: 76
johnc
parents:
3979
diff
changeset
|
69 |
d1bdeef3e3e2
7098282: G1: assert(interval >= 0) failed: Sanity check, referencePolicy.cpp: 76
johnc
parents:
3979
diff
changeset
|
70 if (check_no_refs) { |
d1bdeef3e3e2
7098282: G1: assert(interval >= 0) failed: Sanity check, referencePolicy.cpp: 76
johnc
parents:
3979
diff
changeset
|
71 // Verify that the discovered lists are empty |
d1bdeef3e3e2
7098282: G1: assert(interval >= 0) failed: Sanity check, referencePolicy.cpp: 76
johnc
parents:
3979
diff
changeset
|
72 verify_no_references_recorded(); |
d1bdeef3e3e2
7098282: G1: assert(interval >= 0) failed: Sanity check, referencePolicy.cpp: 76
johnc
parents:
3979
diff
changeset
|
73 } |
d1bdeef3e3e2
7098282: G1: assert(interval >= 0) failed: Sanity check, referencePolicy.cpp: 76
johnc
parents:
3979
diff
changeset
|
74 #endif // ASSERT |
d1bdeef3e3e2
7098282: G1: assert(interval >= 0) failed: Sanity check, referencePolicy.cpp: 76
johnc
parents:
3979
diff
changeset
|
75 |
d1bdeef3e3e2
7098282: G1: assert(interval >= 0) failed: Sanity check, referencePolicy.cpp: 76
johnc
parents:
3979
diff
changeset
|
76 // Someone could have modified the value of the static |
d1bdeef3e3e2
7098282: G1: assert(interval >= 0) failed: Sanity check, referencePolicy.cpp: 76
johnc
parents:
3979
diff
changeset
|
77 // field in the j.l.r.SoftReference class that holds the |
d1bdeef3e3e2
7098282: G1: assert(interval >= 0) failed: Sanity check, referencePolicy.cpp: 76
johnc
parents:
3979
diff
changeset
|
78 // soft reference timestamp clock using reflection or |
d1bdeef3e3e2
7098282: G1: assert(interval >= 0) failed: Sanity check, referencePolicy.cpp: 76
johnc
parents:
3979
diff
changeset
|
79 // Unsafe between GCs. Unconditionally update the static |
d1bdeef3e3e2
7098282: G1: assert(interval >= 0) failed: Sanity check, referencePolicy.cpp: 76
johnc
parents:
3979
diff
changeset
|
80 // field in ReferenceProcessor here so that we use the new |
d1bdeef3e3e2
7098282: G1: assert(interval >= 0) failed: Sanity check, referencePolicy.cpp: 76
johnc
parents:
3979
diff
changeset
|
81 // value during reference discovery. |
d1bdeef3e3e2
7098282: G1: assert(interval >= 0) failed: Sanity check, referencePolicy.cpp: 76
johnc
parents:
3979
diff
changeset
|
82 |
d1bdeef3e3e2
7098282: G1: assert(interval >= 0) failed: Sanity check, referencePolicy.cpp: 76
johnc
parents:
3979
diff
changeset
|
83 _soft_ref_timestamp_clock = java_lang_ref_SoftReference::clock(); |
d1bdeef3e3e2
7098282: G1: assert(interval >= 0) failed: Sanity check, referencePolicy.cpp: 76
johnc
parents:
3979
diff
changeset
|
84 _discovering_refs = true; |
d1bdeef3e3e2
7098282: G1: assert(interval >= 0) failed: Sanity check, referencePolicy.cpp: 76
johnc
parents:
3979
diff
changeset
|
85 } |
d1bdeef3e3e2
7098282: G1: assert(interval >= 0) failed: Sanity check, referencePolicy.cpp: 76
johnc
parents:
3979
diff
changeset
|
86 |
0 | 87 ReferenceProcessor::ReferenceProcessor(MemRegion span, |
2369
92da084fefc9
6668573: CMS: reference processing crash if ParallelCMSThreads > ParallelGCThreads
ysr
parents:
1995
diff
changeset
|
88 bool mt_processing, |
92da084fefc9
6668573: CMS: reference processing crash if ParallelCMSThreads > ParallelGCThreads
ysr
parents:
1995
diff
changeset
|
89 int mt_processing_degree, |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
5
diff
changeset
|
90 bool mt_discovery, |
2369
92da084fefc9
6668573: CMS: reference processing crash if ParallelCMSThreads > ParallelGCThreads
ysr
parents:
1995
diff
changeset
|
91 int mt_discovery_degree, |
92da084fefc9
6668573: CMS: reference processing crash if ParallelCMSThreads > ParallelGCThreads
ysr
parents:
1995
diff
changeset
|
92 bool atomic_discovery, |
92da084fefc9
6668573: CMS: reference processing crash if ParallelCMSThreads > ParallelGCThreads
ysr
parents:
1995
diff
changeset
|
93 BoolObjectClosure* is_alive_non_header, |
342
37f87013dfd8
6711316: Open source the Garbage-First garbage collector
ysr
parents:
113
diff
changeset
|
94 bool discovered_list_needs_barrier) : |
0 | 95 _discovering_refs(false), |
96 _enqueuing_is_done(false), | |
2369
92da084fefc9
6668573: CMS: reference processing crash if ParallelCMSThreads > ParallelGCThreads
ysr
parents:
1995
diff
changeset
|
97 _is_alive_non_header(is_alive_non_header), |
342
37f87013dfd8
6711316: Open source the Garbage-First garbage collector
ysr
parents:
113
diff
changeset
|
98 _discovered_list_needs_barrier(discovered_list_needs_barrier), |
37f87013dfd8
6711316: Open source the Garbage-First garbage collector
ysr
parents:
113
diff
changeset
|
99 _bs(NULL), |
0 | 100 _processing_is_mt(mt_processing), |
101 _next_id(0) | |
102 { | |
103 _span = span; | |
104 _discovery_is_atomic = atomic_discovery; | |
105 _discovery_is_mt = mt_discovery; | |
2369
92da084fefc9
6668573: CMS: reference processing crash if ParallelCMSThreads > ParallelGCThreads
ysr
parents:
1995
diff
changeset
|
106 _num_q = MAX2(1, mt_processing_degree); |
92da084fefc9
6668573: CMS: reference processing crash if ParallelCMSThreads > ParallelGCThreads
ysr
parents:
1995
diff
changeset
|
107 _max_num_q = MAX2(_num_q, mt_discovery_degree); |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3917
diff
changeset
|
108 _discoveredSoftRefs = NEW_C_HEAP_ARRAY(DiscoveredList, |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3917
diff
changeset
|
109 _max_num_q * number_of_subclasses_of_ref()); |
0 | 110 if (_discoveredSoftRefs == NULL) { |
111 vm_exit_during_initialization("Could not allocated RefProc Array"); | |
112 } | |
1833
8b10f48633dc
6984287: Regularize how GC parallel workers are specified.
jmasa
parents:
1552
diff
changeset
|
113 _discoveredWeakRefs = &_discoveredSoftRefs[_max_num_q]; |
8b10f48633dc
6984287: Regularize how GC parallel workers are specified.
jmasa
parents:
1552
diff
changeset
|
114 _discoveredFinalRefs = &_discoveredWeakRefs[_max_num_q]; |
8b10f48633dc
6984287: Regularize how GC parallel workers are specified.
jmasa
parents:
1552
diff
changeset
|
115 _discoveredPhantomRefs = &_discoveredFinalRefs[_max_num_q]; |
3915
c2bf0120ee5d
7085906: Replace the permgen allocated sentinelRef with a self-looped end
stefank
parents:
2369
diff
changeset
|
116 // Initialized all entries to NULL |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3917
diff
changeset
|
117 for (int i = 0; i < _max_num_q * number_of_subclasses_of_ref(); i++) { |
3915
c2bf0120ee5d
7085906: Replace the permgen allocated sentinelRef with a self-looped end
stefank
parents:
2369
diff
changeset
|
118 _discoveredSoftRefs[i].set_head(NULL); |
0 | 119 _discoveredSoftRefs[i].set_length(0); |
120 } | |
3917
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3915
diff
changeset
|
121 // If we do barriers, cache a copy of the barrier set. |
342
37f87013dfd8
6711316: Open source the Garbage-First garbage collector
ysr
parents:
113
diff
changeset
|
122 if (discovered_list_needs_barrier) { |
37f87013dfd8
6711316: Open source the Garbage-First garbage collector
ysr
parents:
113
diff
changeset
|
123 _bs = Universe::heap()->barrier_set(); |
37f87013dfd8
6711316: Open source the Garbage-First garbage collector
ysr
parents:
113
diff
changeset
|
124 } |
2369
92da084fefc9
6668573: CMS: reference processing crash if ParallelCMSThreads > ParallelGCThreads
ysr
parents:
1995
diff
changeset
|
125 setup_policy(false /* default soft ref policy */); |
0 | 126 } |
127 | |
128 #ifndef PRODUCT | |
129 void ReferenceProcessor::verify_no_references_recorded() { | |
130 guarantee(!_discovering_refs, "Discovering refs?"); | |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3917
diff
changeset
|
131 for (int i = 0; i < _max_num_q * number_of_subclasses_of_ref(); i++) { |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3917
diff
changeset
|
132 guarantee(_discoveredSoftRefs[i].is_empty(), |
0 | 133 "Found non-empty discovered list"); |
134 } | |
135 } | |
136 #endif | |
137 | |
138 void ReferenceProcessor::weak_oops_do(OopClosure* f) { | |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3917
diff
changeset
|
139 for (int i = 0; i < _max_num_q * number_of_subclasses_of_ref(); i++) { |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
5
diff
changeset
|
140 if (UseCompressedOops) { |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
5
diff
changeset
|
141 f->do_oop((narrowOop*)_discoveredSoftRefs[i].adr_head()); |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
5
diff
changeset
|
142 } else { |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
5
diff
changeset
|
143 f->do_oop((oop*)_discoveredSoftRefs[i].adr_head()); |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
5
diff
changeset
|
144 } |
0 | 145 } |
146 } | |
147 | |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
5
diff
changeset
|
148 void ReferenceProcessor::update_soft_ref_master_clock() { |
0 | 149 // Update (advance) the soft ref master clock field. This must be done |
150 // after processing the soft ref list. | |
151 jlong now = os::javaTimeMillis(); | |
3992
d1bdeef3e3e2
7098282: G1: assert(interval >= 0) failed: Sanity check, referencePolicy.cpp: 76
johnc
parents:
3979
diff
changeset
|
152 jlong soft_ref_clock = java_lang_ref_SoftReference::clock(); |
d1bdeef3e3e2
7098282: G1: assert(interval >= 0) failed: Sanity check, referencePolicy.cpp: 76
johnc
parents:
3979
diff
changeset
|
153 assert(soft_ref_clock == _soft_ref_timestamp_clock, "soft ref clocks out of sync"); |
d1bdeef3e3e2
7098282: G1: assert(interval >= 0) failed: Sanity check, referencePolicy.cpp: 76
johnc
parents:
3979
diff
changeset
|
154 |
0 | 155 NOT_PRODUCT( |
3992
d1bdeef3e3e2
7098282: G1: assert(interval >= 0) failed: Sanity check, referencePolicy.cpp: 76
johnc
parents:
3979
diff
changeset
|
156 if (now < _soft_ref_timestamp_clock) { |
d1bdeef3e3e2
7098282: G1: assert(interval >= 0) failed: Sanity check, referencePolicy.cpp: 76
johnc
parents:
3979
diff
changeset
|
157 warning("time warp: "INT64_FORMAT" to "INT64_FORMAT, |
d1bdeef3e3e2
7098282: G1: assert(interval >= 0) failed: Sanity check, referencePolicy.cpp: 76
johnc
parents:
3979
diff
changeset
|
158 _soft_ref_timestamp_clock, now); |
0 | 159 } |
160 ) | |
161 // In product mode, protect ourselves from system time being adjusted | |
162 // externally and going backward; see note in the implementation of | |
163 // GenCollectedHeap::time_since_last_gc() for the right way to fix | |
164 // this uniformly throughout the VM; see bug-id 4741166. XXX | |
3992
d1bdeef3e3e2
7098282: G1: assert(interval >= 0) failed: Sanity check, referencePolicy.cpp: 76
johnc
parents:
3979
diff
changeset
|
165 if (now > _soft_ref_timestamp_clock) { |
d1bdeef3e3e2
7098282: G1: assert(interval >= 0) failed: Sanity check, referencePolicy.cpp: 76
johnc
parents:
3979
diff
changeset
|
166 _soft_ref_timestamp_clock = now; |
0 | 167 java_lang_ref_SoftReference::set_clock(now); |
168 } | |
169 // Else leave clock stalled at its old value until time progresses | |
170 // past clock value. | |
171 } | |
172 | |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
5
diff
changeset
|
173 void ReferenceProcessor::process_discovered_references( |
0 | 174 BoolObjectClosure* is_alive, |
175 OopClosure* keep_alive, | |
176 VoidClosure* complete_gc, | |
177 AbstractRefProcTaskExecutor* task_executor) { | |
178 NOT_PRODUCT(verify_ok_to_handle_reflists()); | |
179 | |
180 assert(!enqueuing_is_done(), "If here enqueuing should not be complete"); | |
181 // Stop treating discovered references specially. | |
182 disable_discovery(); | |
183 | |
3992
d1bdeef3e3e2
7098282: G1: assert(interval >= 0) failed: Sanity check, referencePolicy.cpp: 76
johnc
parents:
3979
diff
changeset
|
184 // If discovery was concurrent, someone could have modified |
d1bdeef3e3e2
7098282: G1: assert(interval >= 0) failed: Sanity check, referencePolicy.cpp: 76
johnc
parents:
3979
diff
changeset
|
185 // the value of the static field in the j.l.r.SoftReference |
d1bdeef3e3e2
7098282: G1: assert(interval >= 0) failed: Sanity check, referencePolicy.cpp: 76
johnc
parents:
3979
diff
changeset
|
186 // class that holds the soft reference timestamp clock using |
d1bdeef3e3e2
7098282: G1: assert(interval >= 0) failed: Sanity check, referencePolicy.cpp: 76
johnc
parents:
3979
diff
changeset
|
187 // reflection or Unsafe between when discovery was enabled and |
d1bdeef3e3e2
7098282: G1: assert(interval >= 0) failed: Sanity check, referencePolicy.cpp: 76
johnc
parents:
3979
diff
changeset
|
188 // now. Unconditionally update the static field in ReferenceProcessor |
d1bdeef3e3e2
7098282: G1: assert(interval >= 0) failed: Sanity check, referencePolicy.cpp: 76
johnc
parents:
3979
diff
changeset
|
189 // here so that we use the new value during processing of the |
d1bdeef3e3e2
7098282: G1: assert(interval >= 0) failed: Sanity check, referencePolicy.cpp: 76
johnc
parents:
3979
diff
changeset
|
190 // discovered soft refs. |
d1bdeef3e3e2
7098282: G1: assert(interval >= 0) failed: Sanity check, referencePolicy.cpp: 76
johnc
parents:
3979
diff
changeset
|
191 |
d1bdeef3e3e2
7098282: G1: assert(interval >= 0) failed: Sanity check, referencePolicy.cpp: 76
johnc
parents:
3979
diff
changeset
|
192 _soft_ref_timestamp_clock = java_lang_ref_SoftReference::clock(); |
d1bdeef3e3e2
7098282: G1: assert(interval >= 0) failed: Sanity check, referencePolicy.cpp: 76
johnc
parents:
3979
diff
changeset
|
193 |
0 | 194 bool trace_time = PrintGCDetails && PrintReferenceGC; |
195 // Soft references | |
196 { | |
197 TraceTime tt("SoftReference", trace_time, false, gclog_or_tty); | |
453
c96030fff130
6684579: SoftReference processing can be made more efficient
ysr
parents:
452
diff
changeset
|
198 process_discovered_reflist(_discoveredSoftRefs, _current_soft_ref_policy, true, |
0 | 199 is_alive, keep_alive, complete_gc, task_executor); |
200 } | |
201 | |
202 update_soft_ref_master_clock(); | |
203 | |
204 // Weak references | |
205 { | |
206 TraceTime tt("WeakReference", trace_time, false, gclog_or_tty); | |
207 process_discovered_reflist(_discoveredWeakRefs, NULL, true, | |
208 is_alive, keep_alive, complete_gc, task_executor); | |
209 } | |
210 | |
211 // Final references | |
212 { | |
213 TraceTime tt("FinalReference", trace_time, false, gclog_or_tty); | |
214 process_discovered_reflist(_discoveredFinalRefs, NULL, false, | |
215 is_alive, keep_alive, complete_gc, task_executor); | |
216 } | |
217 | |
218 // Phantom references | |
219 { | |
220 TraceTime tt("PhantomReference", trace_time, false, gclog_or_tty); | |
221 process_discovered_reflist(_discoveredPhantomRefs, NULL, false, | |
222 is_alive, keep_alive, complete_gc, task_executor); | |
223 } | |
224 | |
225 // Weak global JNI references. It would make more sense (semantically) to | |
226 // traverse these simultaneously with the regular weak references above, but | |
227 // that is not how the JDK1.2 specification is. See #4126360. Native code can | |
228 // thus use JNI weak references to circumvent the phantom references and | |
229 // resurrect a "post-mortem" object. | |
230 { | |
231 TraceTime tt("JNI Weak Reference", trace_time, false, gclog_or_tty); | |
232 if (task_executor != NULL) { | |
233 task_executor->set_single_threaded_mode(); | |
234 } | |
235 process_phaseJNI(is_alive, keep_alive, complete_gc); | |
236 } | |
237 } | |
238 | |
239 #ifndef PRODUCT | |
240 // Calculate the number of jni handles. | |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
5
diff
changeset
|
241 uint ReferenceProcessor::count_jni_refs() { |
0 | 242 class AlwaysAliveClosure: public BoolObjectClosure { |
243 public: | |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
5
diff
changeset
|
244 virtual bool do_object_b(oop obj) { return true; } |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
5
diff
changeset
|
245 virtual void do_object(oop obj) { assert(false, "Don't call"); } |
0 | 246 }; |
247 | |
248 class CountHandleClosure: public OopClosure { | |
249 private: | |
250 int _count; | |
251 public: | |
252 CountHandleClosure(): _count(0) {} | |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
5
diff
changeset
|
253 void do_oop(oop* unused) { _count++; } |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
5
diff
changeset
|
254 void do_oop(narrowOop* unused) { ShouldNotReachHere(); } |
0 | 255 int count() { return _count; } |
256 }; | |
257 CountHandleClosure global_handle_count; | |
258 AlwaysAliveClosure always_alive; | |
259 JNIHandles::weak_oops_do(&always_alive, &global_handle_count); | |
260 return global_handle_count.count(); | |
261 } | |
262 #endif | |
263 | |
264 void ReferenceProcessor::process_phaseJNI(BoolObjectClosure* is_alive, | |
265 OopClosure* keep_alive, | |
266 VoidClosure* complete_gc) { | |
267 #ifndef PRODUCT | |
268 if (PrintGCDetails && PrintReferenceGC) { | |
269 unsigned int count = count_jni_refs(); | |
270 gclog_or_tty->print(", %u refs", count); | |
271 } | |
272 #endif | |
273 JNIHandles::weak_oops_do(is_alive, keep_alive); | |
274 complete_gc->do_void(); | |
275 } | |
276 | |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
5
diff
changeset
|
277 |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
5
diff
changeset
|
278 template <class T> |
1123
167c2986d91b
6843629: Make current hotspot build part of jdk5 control build
phh
parents:
935
diff
changeset
|
279 bool enqueue_discovered_ref_helper(ReferenceProcessor* ref, |
167c2986d91b
6843629: Make current hotspot build part of jdk5 control build
phh
parents:
935
diff
changeset
|
280 AbstractRefProcTaskExecutor* task_executor) { |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
5
diff
changeset
|
281 |
0 | 282 // Remember old value of pending references list |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
5
diff
changeset
|
283 T* pending_list_addr = (T*)java_lang_ref_Reference::pending_list_addr(); |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
5
diff
changeset
|
284 T old_pending_list_value = *pending_list_addr; |
0 | 285 |
286 // Enqueue references that are not made active again, and | |
287 // clear the decks for the next collection (cycle). | |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
5
diff
changeset
|
288 ref->enqueue_discovered_reflists((HeapWord*)pending_list_addr, task_executor); |
0 | 289 // Do the oop-check on pending_list_addr missed in |
290 // enqueue_discovered_reflist. We should probably | |
291 // do a raw oop_check so that future such idempotent | |
292 // oop_stores relying on the oop-check side-effect | |
293 // may be elided automatically and safely without | |
294 // affecting correctness. | |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
5
diff
changeset
|
295 oop_store(pending_list_addr, oopDesc::load_decode_heap_oop(pending_list_addr)); |
0 | 296 |
297 // Stop treating discovered references specially. | |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
5
diff
changeset
|
298 ref->disable_discovery(); |
0 | 299 |
300 // Return true if new pending references were added | |
301 return old_pending_list_value != *pending_list_addr; | |
302 } | |
303 | |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
5
diff
changeset
|
304 bool ReferenceProcessor::enqueue_discovered_references(AbstractRefProcTaskExecutor* task_executor) { |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
5
diff
changeset
|
305 NOT_PRODUCT(verify_ok_to_handle_reflists()); |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
5
diff
changeset
|
306 if (UseCompressedOops) { |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
5
diff
changeset
|
307 return enqueue_discovered_ref_helper<narrowOop>(this, task_executor); |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
5
diff
changeset
|
308 } else { |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
5
diff
changeset
|
309 return enqueue_discovered_ref_helper<oop>(this, task_executor); |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
5
diff
changeset
|
310 } |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
5
diff
changeset
|
311 } |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
5
diff
changeset
|
312 |
0 | 313 void ReferenceProcessor::enqueue_discovered_reflist(DiscoveredList& refs_list, |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
5
diff
changeset
|
314 HeapWord* pending_list_addr) { |
0 | 315 // Given a list of refs linked through the "discovered" field |
3917
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3915
diff
changeset
|
316 // (java.lang.ref.Reference.discovered), self-loop their "next" field |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3915
diff
changeset
|
317 // thus distinguishing them from active References, then |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3915
diff
changeset
|
318 // prepend them to the pending list. |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3915
diff
changeset
|
319 // BKWRD COMPATIBILITY NOTE: For older JDKs (prior to the fix for 4956777), |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3915
diff
changeset
|
320 // the "next" field is used to chain the pending list, not the discovered |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3915
diff
changeset
|
321 // field. |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3915
diff
changeset
|
322 |
0 | 323 if (TraceReferenceGC && PrintGCDetails) { |
324 gclog_or_tty->print_cr("ReferenceProcessor::enqueue_discovered_reflist list " | |
325 INTPTR_FORMAT, (address)refs_list.head()); | |
326 } | |
3915
c2bf0120ee5d
7085906: Replace the permgen allocated sentinelRef with a self-looped end
stefank
parents:
2369
diff
changeset
|
327 |
c2bf0120ee5d
7085906: Replace the permgen allocated sentinelRef with a self-looped end
stefank
parents:
2369
diff
changeset
|
328 oop obj = NULL; |
3917
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3915
diff
changeset
|
329 oop next_d = refs_list.head(); |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3915
diff
changeset
|
330 if (pending_list_uses_discovered_field()) { // New behaviour |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3915
diff
changeset
|
331 // Walk down the list, self-looping the next field |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3915
diff
changeset
|
332 // so that the References are not considered active. |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3915
diff
changeset
|
333 while (obj != next_d) { |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3915
diff
changeset
|
334 obj = next_d; |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3915
diff
changeset
|
335 assert(obj->is_instanceRef(), "should be reference object"); |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3915
diff
changeset
|
336 next_d = java_lang_ref_Reference::discovered(obj); |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3915
diff
changeset
|
337 if (TraceReferenceGC && PrintGCDetails) { |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3915
diff
changeset
|
338 gclog_or_tty->print_cr(" obj " INTPTR_FORMAT "/next_d " INTPTR_FORMAT, |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3915
diff
changeset
|
339 obj, next_d); |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3915
diff
changeset
|
340 } |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3915
diff
changeset
|
341 assert(java_lang_ref_Reference::next(obj) == NULL, |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3915
diff
changeset
|
342 "Reference not active; should not be discovered"); |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3915
diff
changeset
|
343 // Self-loop next, so as to make Ref not active. |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3915
diff
changeset
|
344 java_lang_ref_Reference::set_next(obj, obj); |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3915
diff
changeset
|
345 if (next_d == obj) { // obj is last |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3915
diff
changeset
|
346 // Swap refs_list into pendling_list_addr and |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3915
diff
changeset
|
347 // set obj's discovered to what we read from pending_list_addr. |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3915
diff
changeset
|
348 oop old = oopDesc::atomic_exchange_oop(refs_list.head(), pending_list_addr); |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3915
diff
changeset
|
349 // Need oop_check on pending_list_addr above; |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3915
diff
changeset
|
350 // see special oop-check code at the end of |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3915
diff
changeset
|
351 // enqueue_discovered_reflists() further below. |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3915
diff
changeset
|
352 java_lang_ref_Reference::set_discovered(obj, old); // old may be NULL |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3915
diff
changeset
|
353 } |
0 | 354 } |
3917
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3915
diff
changeset
|
355 } else { // Old behaviour |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3915
diff
changeset
|
356 // Walk down the list, copying the discovered field into |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3915
diff
changeset
|
357 // the next field and clearing the discovered field. |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3915
diff
changeset
|
358 while (obj != next_d) { |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3915
diff
changeset
|
359 obj = next_d; |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3915
diff
changeset
|
360 assert(obj->is_instanceRef(), "should be reference object"); |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3915
diff
changeset
|
361 next_d = java_lang_ref_Reference::discovered(obj); |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3915
diff
changeset
|
362 if (TraceReferenceGC && PrintGCDetails) { |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3915
diff
changeset
|
363 gclog_or_tty->print_cr(" obj " INTPTR_FORMAT "/next_d " INTPTR_FORMAT, |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3915
diff
changeset
|
364 obj, next_d); |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3915
diff
changeset
|
365 } |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3915
diff
changeset
|
366 assert(java_lang_ref_Reference::next(obj) == NULL, |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3915
diff
changeset
|
367 "The reference should not be enqueued"); |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3915
diff
changeset
|
368 if (next_d == obj) { // obj is last |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3915
diff
changeset
|
369 // Swap refs_list into pendling_list_addr and |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3915
diff
changeset
|
370 // set obj's next to what we read from pending_list_addr. |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3915
diff
changeset
|
371 oop old = oopDesc::atomic_exchange_oop(refs_list.head(), pending_list_addr); |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3915
diff
changeset
|
372 // Need oop_check on pending_list_addr above; |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3915
diff
changeset
|
373 // see special oop-check code at the end of |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3915
diff
changeset
|
374 // enqueue_discovered_reflists() further below. |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3915
diff
changeset
|
375 if (old == NULL) { |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3915
diff
changeset
|
376 // obj should be made to point to itself, since |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3915
diff
changeset
|
377 // pending list was empty. |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3915
diff
changeset
|
378 java_lang_ref_Reference::set_next(obj, obj); |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3915
diff
changeset
|
379 } else { |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3915
diff
changeset
|
380 java_lang_ref_Reference::set_next(obj, old); |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3915
diff
changeset
|
381 } |
0 | 382 } else { |
3917
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3915
diff
changeset
|
383 java_lang_ref_Reference::set_next(obj, next_d); |
0 | 384 } |
3917
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3915
diff
changeset
|
385 java_lang_ref_Reference::set_discovered(obj, (oop) NULL); |
0 | 386 } |
387 } | |
388 } | |
389 | |
390 // Parallel enqueue task | |
391 class RefProcEnqueueTask: public AbstractRefProcTaskExecutor::EnqueueTask { | |
392 public: | |
393 RefProcEnqueueTask(ReferenceProcessor& ref_processor, | |
394 DiscoveredList discovered_refs[], | |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
5
diff
changeset
|
395 HeapWord* pending_list_addr, |
0 | 396 int n_queues) |
397 : EnqueueTask(ref_processor, discovered_refs, | |
3915
c2bf0120ee5d
7085906: Replace the permgen allocated sentinelRef with a self-looped end
stefank
parents:
2369
diff
changeset
|
398 pending_list_addr, n_queues) |
0 | 399 { } |
400 | |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
5
diff
changeset
|
401 virtual void work(unsigned int work_id) { |
2369
92da084fefc9
6668573: CMS: reference processing crash if ParallelCMSThreads > ParallelGCThreads
ysr
parents:
1995
diff
changeset
|
402 assert(work_id < (unsigned int)_ref_processor.max_num_q(), "Index out-of-bounds"); |
0 | 403 // Simplest first cut: static partitioning. |
404 int index = work_id; | |
1833
8b10f48633dc
6984287: Regularize how GC parallel workers are specified.
jmasa
parents:
1552
diff
changeset
|
405 // The increment on "index" must correspond to the maximum number of queues |
8b10f48633dc
6984287: Regularize how GC parallel workers are specified.
jmasa
parents:
1552
diff
changeset
|
406 // (n_queues) with which that ReferenceProcessor was created. That |
8b10f48633dc
6984287: Regularize how GC parallel workers are specified.
jmasa
parents:
1552
diff
changeset
|
407 // is because of the "clever" way the discovered references lists were |
2369
92da084fefc9
6668573: CMS: reference processing crash if ParallelCMSThreads > ParallelGCThreads
ysr
parents:
1995
diff
changeset
|
408 // allocated and are indexed into. |
92da084fefc9
6668573: CMS: reference processing crash if ParallelCMSThreads > ParallelGCThreads
ysr
parents:
1995
diff
changeset
|
409 assert(_n_queues == (int) _ref_processor.max_num_q(), "Different number not expected"); |
1833
8b10f48633dc
6984287: Regularize how GC parallel workers are specified.
jmasa
parents:
1552
diff
changeset
|
410 for (int j = 0; |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3917
diff
changeset
|
411 j < ReferenceProcessor::number_of_subclasses_of_ref(); |
1833
8b10f48633dc
6984287: Regularize how GC parallel workers are specified.
jmasa
parents:
1552
diff
changeset
|
412 j++, index += _n_queues) { |
0 | 413 _ref_processor.enqueue_discovered_reflist( |
414 _refs_lists[index], _pending_list_addr); | |
3915
c2bf0120ee5d
7085906: Replace the permgen allocated sentinelRef with a self-looped end
stefank
parents:
2369
diff
changeset
|
415 _refs_lists[index].set_head(NULL); |
0 | 416 _refs_lists[index].set_length(0); |
417 } | |
418 } | |
419 }; | |
420 | |
421 // Enqueue references that are not made active again | |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
5
diff
changeset
|
422 void ReferenceProcessor::enqueue_discovered_reflists(HeapWord* pending_list_addr, |
0 | 423 AbstractRefProcTaskExecutor* task_executor) { |
424 if (_processing_is_mt && task_executor != NULL) { | |
425 // Parallel code | |
426 RefProcEnqueueTask tsk(*this, _discoveredSoftRefs, | |
3915
c2bf0120ee5d
7085906: Replace the permgen allocated sentinelRef with a self-looped end
stefank
parents:
2369
diff
changeset
|
427 pending_list_addr, _max_num_q); |
0 | 428 task_executor->execute(tsk); |
429 } else { | |
430 // Serial code: call the parent class's implementation | |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3917
diff
changeset
|
431 for (int i = 0; i < _max_num_q * number_of_subclasses_of_ref(); i++) { |
0 | 432 enqueue_discovered_reflist(_discoveredSoftRefs[i], pending_list_addr); |
3915
c2bf0120ee5d
7085906: Replace the permgen allocated sentinelRef with a self-looped end
stefank
parents:
2369
diff
changeset
|
433 _discoveredSoftRefs[i].set_head(NULL); |
0 | 434 _discoveredSoftRefs[i].set_length(0); |
435 } | |
436 } | |
437 } | |
438 | |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3917
diff
changeset
|
439 void DiscoveredListIterator::load_ptrs(DEBUG_ONLY(bool allow_null_referent)) { |
0 | 440 _discovered_addr = java_lang_ref_Reference::discovered_addr(_ref); |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
5
diff
changeset
|
441 oop discovered = java_lang_ref_Reference::discovered(_ref); |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
5
diff
changeset
|
442 assert(_discovered_addr && discovered->is_oop_or_null(), |
0 | 443 "discovered field is bad"); |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
5
diff
changeset
|
444 _next = discovered; |
0 | 445 _referent_addr = java_lang_ref_Reference::referent_addr(_ref); |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
5
diff
changeset
|
446 _referent = java_lang_ref_Reference::referent(_ref); |
0 | 447 assert(Universe::heap()->is_in_reserved_or_null(_referent), |
448 "Wrong oop found in java.lang.Reference object"); | |
449 assert(allow_null_referent ? | |
450 _referent->is_oop_or_null() | |
451 : _referent->is_oop(), | |
452 "bad referent"); | |
453 } | |
454 | |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3917
diff
changeset
|
455 void DiscoveredListIterator::remove() { |
0 | 456 assert(_ref->is_oop(), "Dropping a bad reference"); |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
5
diff
changeset
|
457 oop_store_raw(_discovered_addr, NULL); |
3915
c2bf0120ee5d
7085906: Replace the permgen allocated sentinelRef with a self-looped end
stefank
parents:
2369
diff
changeset
|
458 |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
5
diff
changeset
|
459 // First _prev_next ref actually points into DiscoveredList (gross). |
3915
c2bf0120ee5d
7085906: Replace the permgen allocated sentinelRef with a self-looped end
stefank
parents:
2369
diff
changeset
|
460 oop new_next; |
c2bf0120ee5d
7085906: Replace the permgen allocated sentinelRef with a self-looped end
stefank
parents:
2369
diff
changeset
|
461 if (_next == _ref) { |
c2bf0120ee5d
7085906: Replace the permgen allocated sentinelRef with a self-looped end
stefank
parents:
2369
diff
changeset
|
462 // At the end of the list, we should make _prev point to itself. |
c2bf0120ee5d
7085906: Replace the permgen allocated sentinelRef with a self-looped end
stefank
parents:
2369
diff
changeset
|
463 // If _ref is the first ref, then _prev_next will be in the DiscoveredList, |
c2bf0120ee5d
7085906: Replace the permgen allocated sentinelRef with a self-looped end
stefank
parents:
2369
diff
changeset
|
464 // and _prev will be NULL. |
c2bf0120ee5d
7085906: Replace the permgen allocated sentinelRef with a self-looped end
stefank
parents:
2369
diff
changeset
|
465 new_next = _prev; |
c2bf0120ee5d
7085906: Replace the permgen allocated sentinelRef with a self-looped end
stefank
parents:
2369
diff
changeset
|
466 } else { |
c2bf0120ee5d
7085906: Replace the permgen allocated sentinelRef with a self-looped end
stefank
parents:
2369
diff
changeset
|
467 new_next = _next; |
c2bf0120ee5d
7085906: Replace the permgen allocated sentinelRef with a self-looped end
stefank
parents:
2369
diff
changeset
|
468 } |
c2bf0120ee5d
7085906: Replace the permgen allocated sentinelRef with a self-looped end
stefank
parents:
2369
diff
changeset
|
469 |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
5
diff
changeset
|
470 if (UseCompressedOops) { |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
5
diff
changeset
|
471 // Remove Reference object from list. |
3915
c2bf0120ee5d
7085906: Replace the permgen allocated sentinelRef with a self-looped end
stefank
parents:
2369
diff
changeset
|
472 oopDesc::encode_store_heap_oop((narrowOop*)_prev_next, new_next); |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
5
diff
changeset
|
473 } else { |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
5
diff
changeset
|
474 // Remove Reference object from list. |
3915
c2bf0120ee5d
7085906: Replace the permgen allocated sentinelRef with a self-looped end
stefank
parents:
2369
diff
changeset
|
475 oopDesc::store_heap_oop((oop*)_prev_next, new_next); |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
5
diff
changeset
|
476 } |
0 | 477 NOT_PRODUCT(_removed++); |
452
00b023ae2d78
6722113: CMS: Incorrect overflow handling during precleaning of Reference lists
ysr
parents:
356
diff
changeset
|
478 _refs_list.dec_length(1); |
0 | 479 } |
480 | |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3917
diff
changeset
|
481 // Make the Reference object active again. |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3917
diff
changeset
|
482 void DiscoveredListIterator::make_active() { |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3917
diff
changeset
|
483 // For G1 we don't want to use set_next - it |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3917
diff
changeset
|
484 // will dirty the card for the next field of |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3917
diff
changeset
|
485 // the reference object and will fail |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3917
diff
changeset
|
486 // CT verification. |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3917
diff
changeset
|
487 if (UseG1GC) { |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3917
diff
changeset
|
488 BarrierSet* bs = oopDesc::bs(); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3917
diff
changeset
|
489 HeapWord* next_addr = java_lang_ref_Reference::next_addr(_ref); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3917
diff
changeset
|
490 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3917
diff
changeset
|
491 if (UseCompressedOops) { |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3917
diff
changeset
|
492 bs->write_ref_field_pre((narrowOop*)next_addr, NULL); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3917
diff
changeset
|
493 } else { |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3917
diff
changeset
|
494 bs->write_ref_field_pre((oop*)next_addr, NULL); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3917
diff
changeset
|
495 } |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3917
diff
changeset
|
496 java_lang_ref_Reference::set_next_raw(_ref, NULL); |
3915
c2bf0120ee5d
7085906: Replace the permgen allocated sentinelRef with a self-looped end
stefank
parents:
2369
diff
changeset
|
497 } else { |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3917
diff
changeset
|
498 java_lang_ref_Reference::set_next(_ref, NULL); |
3915
c2bf0120ee5d
7085906: Replace the permgen allocated sentinelRef with a self-looped end
stefank
parents:
2369
diff
changeset
|
499 } |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3917
diff
changeset
|
500 } |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3917
diff
changeset
|
501 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3917
diff
changeset
|
502 void DiscoveredListIterator::clear_referent() { |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3917
diff
changeset
|
503 oop_store_raw(_referent_addr, NULL); |
0 | 504 } |
505 | |
506 // NOTE: process_phase*() are largely similar, and at a high level | |
507 // merely iterate over the extant list applying a predicate to | |
508 // each of its elements and possibly removing that element from the | |
509 // list and applying some further closures to that element. | |
510 // We should consider the possibility of replacing these | |
511 // process_phase*() methods by abstracting them into | |
512 // a single general iterator invocation that receives appropriate | |
513 // closures that accomplish this work. | |
514 | |
515 // (SoftReferences only) Traverse the list and remove any SoftReferences whose | |
516 // referents are not alive, but that should be kept alive for policy reasons. | |
517 // Keep alive the transitive closure of all such referents. | |
518 void | |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
5
diff
changeset
|
519 ReferenceProcessor::process_phase1(DiscoveredList& refs_list, |
0 | 520 ReferencePolicy* policy, |
521 BoolObjectClosure* is_alive, | |
522 OopClosure* keep_alive, | |
523 VoidClosure* complete_gc) { | |
524 assert(policy != NULL, "Must have a non-NULL policy"); | |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
5
diff
changeset
|
525 DiscoveredListIterator iter(refs_list, keep_alive, is_alive); |
0 | 526 // Decide which softly reachable refs should be kept alive. |
527 while (iter.has_next()) { | |
528 iter.load_ptrs(DEBUG_ONLY(!discovery_is_atomic() /* allow_null_referent */)); | |
529 bool referent_is_dead = (iter.referent() != NULL) && !iter.is_referent_alive(); | |
3992
d1bdeef3e3e2
7098282: G1: assert(interval >= 0) failed: Sanity check, referencePolicy.cpp: 76
johnc
parents:
3979
diff
changeset
|
530 if (referent_is_dead && |
d1bdeef3e3e2
7098282: G1: assert(interval >= 0) failed: Sanity check, referencePolicy.cpp: 76
johnc
parents:
3979
diff
changeset
|
531 !policy->should_clear_reference(iter.obj(), _soft_ref_timestamp_clock)) { |
0 | 532 if (TraceReferenceGC) { |
533 gclog_or_tty->print_cr("Dropping reference (" INTPTR_FORMAT ": %s" ") by policy", | |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
5
diff
changeset
|
534 iter.obj(), iter.obj()->blueprint()->internal_name()); |
0 | 535 } |
452
00b023ae2d78
6722113: CMS: Incorrect overflow handling during precleaning of Reference lists
ysr
parents:
356
diff
changeset
|
536 // Remove Reference object from list |
00b023ae2d78
6722113: CMS: Incorrect overflow handling during precleaning of Reference lists
ysr
parents:
356
diff
changeset
|
537 iter.remove(); |
0 | 538 // Make the Reference object active again |
539 iter.make_active(); | |
540 // keep the referent around | |
541 iter.make_referent_alive(); | |
452
00b023ae2d78
6722113: CMS: Incorrect overflow handling during precleaning of Reference lists
ysr
parents:
356
diff
changeset
|
542 iter.move_to_next(); |
0 | 543 } else { |
544 iter.next(); | |
545 } | |
546 } | |
547 // Close the reachable set | |
548 complete_gc->do_void(); | |
549 NOT_PRODUCT( | |
550 if (PrintGCDetails && TraceReferenceGC) { | |
1833
8b10f48633dc
6984287: Regularize how GC parallel workers are specified.
jmasa
parents:
1552
diff
changeset
|
551 gclog_or_tty->print_cr(" Dropped %d dead Refs out of %d " |
3917
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3915
diff
changeset
|
552 "discovered Refs by policy, from list " INTPTR_FORMAT, |
1833
8b10f48633dc
6984287: Regularize how GC parallel workers are specified.
jmasa
parents:
1552
diff
changeset
|
553 iter.removed(), iter.processed(), (address)refs_list.head()); |
0 | 554 } |
555 ) | |
556 } | |
557 | |
558 // Traverse the list and remove any Refs that are not active, or | |
559 // whose referents are either alive or NULL. | |
560 void | |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
5
diff
changeset
|
561 ReferenceProcessor::pp2_work(DiscoveredList& refs_list, |
0 | 562 BoolObjectClosure* is_alive, |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
5
diff
changeset
|
563 OopClosure* keep_alive) { |
0 | 564 assert(discovery_is_atomic(), "Error"); |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
5
diff
changeset
|
565 DiscoveredListIterator iter(refs_list, keep_alive, is_alive); |
0 | 566 while (iter.has_next()) { |
567 iter.load_ptrs(DEBUG_ONLY(false /* allow_null_referent */)); | |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
5
diff
changeset
|
568 DEBUG_ONLY(oop next = java_lang_ref_Reference::next(iter.obj());) |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
5
diff
changeset
|
569 assert(next == NULL, "Should not discover inactive Reference"); |
0 | 570 if (iter.is_referent_alive()) { |
571 if (TraceReferenceGC) { | |
572 gclog_or_tty->print_cr("Dropping strongly reachable reference (" INTPTR_FORMAT ": %s)", | |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
5
diff
changeset
|
573 iter.obj(), iter.obj()->blueprint()->internal_name()); |
0 | 574 } |
575 // The referent is reachable after all. | |
452
00b023ae2d78
6722113: CMS: Incorrect overflow handling during precleaning of Reference lists
ysr
parents:
356
diff
changeset
|
576 // Remove Reference object from list. |
00b023ae2d78
6722113: CMS: Incorrect overflow handling during precleaning of Reference lists
ysr
parents:
356
diff
changeset
|
577 iter.remove(); |
0 | 578 // Update the referent pointer as necessary: Note that this |
579 // should not entail any recursive marking because the | |
580 // referent must already have been traversed. | |
581 iter.make_referent_alive(); | |
452
00b023ae2d78
6722113: CMS: Incorrect overflow handling during precleaning of Reference lists
ysr
parents:
356
diff
changeset
|
582 iter.move_to_next(); |
0 | 583 } else { |
584 iter.next(); | |
585 } | |
586 } | |
587 NOT_PRODUCT( | |
2369
92da084fefc9
6668573: CMS: reference processing crash if ParallelCMSThreads > ParallelGCThreads
ysr
parents:
1995
diff
changeset
|
588 if (PrintGCDetails && TraceReferenceGC && (iter.processed() > 0)) { |
1833
8b10f48633dc
6984287: Regularize how GC parallel workers are specified.
jmasa
parents:
1552
diff
changeset
|
589 gclog_or_tty->print_cr(" Dropped %d active Refs out of %d " |
8b10f48633dc
6984287: Regularize how GC parallel workers are specified.
jmasa
parents:
1552
diff
changeset
|
590 "Refs in discovered list " INTPTR_FORMAT, |
8b10f48633dc
6984287: Regularize how GC parallel workers are specified.
jmasa
parents:
1552
diff
changeset
|
591 iter.removed(), iter.processed(), (address)refs_list.head()); |
0 | 592 } |
593 ) | |
594 } | |
595 | |
596 void | |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
5
diff
changeset
|
597 ReferenceProcessor::pp2_work_concurrent_discovery(DiscoveredList& refs_list, |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
5
diff
changeset
|
598 BoolObjectClosure* is_alive, |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
5
diff
changeset
|
599 OopClosure* keep_alive, |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
5
diff
changeset
|
600 VoidClosure* complete_gc) { |
0 | 601 assert(!discovery_is_atomic(), "Error"); |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
5
diff
changeset
|
602 DiscoveredListIterator iter(refs_list, keep_alive, is_alive); |
0 | 603 while (iter.has_next()) { |
604 iter.load_ptrs(DEBUG_ONLY(true /* allow_null_referent */)); | |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
5
diff
changeset
|
605 HeapWord* next_addr = java_lang_ref_Reference::next_addr(iter.obj()); |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
5
diff
changeset
|
606 oop next = java_lang_ref_Reference::next(iter.obj()); |
0 | 607 if ((iter.referent() == NULL || iter.is_referent_alive() || |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
5
diff
changeset
|
608 next != NULL)) { |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
5
diff
changeset
|
609 assert(next->is_oop_or_null(), "bad next field"); |
0 | 610 // Remove Reference object from list |
611 iter.remove(); | |
612 // Trace the cohorts | |
613 iter.make_referent_alive(); | |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
5
diff
changeset
|
614 if (UseCompressedOops) { |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
5
diff
changeset
|
615 keep_alive->do_oop((narrowOop*)next_addr); |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
5
diff
changeset
|
616 } else { |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
5
diff
changeset
|
617 keep_alive->do_oop((oop*)next_addr); |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
5
diff
changeset
|
618 } |
452
00b023ae2d78
6722113: CMS: Incorrect overflow handling during precleaning of Reference lists
ysr
parents:
356
diff
changeset
|
619 iter.move_to_next(); |
0 | 620 } else { |
621 iter.next(); | |
622 } | |
623 } | |
624 // Now close the newly reachable set | |
625 complete_gc->do_void(); | |
626 NOT_PRODUCT( | |
2369
92da084fefc9
6668573: CMS: reference processing crash if ParallelCMSThreads > ParallelGCThreads
ysr
parents:
1995
diff
changeset
|
627 if (PrintGCDetails && TraceReferenceGC && (iter.processed() > 0)) { |
1833
8b10f48633dc
6984287: Regularize how GC parallel workers are specified.
jmasa
parents:
1552
diff
changeset
|
628 gclog_or_tty->print_cr(" Dropped %d active Refs out of %d " |
8b10f48633dc
6984287: Regularize how GC parallel workers are specified.
jmasa
parents:
1552
diff
changeset
|
629 "Refs in discovered list " INTPTR_FORMAT, |
8b10f48633dc
6984287: Regularize how GC parallel workers are specified.
jmasa
parents:
1552
diff
changeset
|
630 iter.removed(), iter.processed(), (address)refs_list.head()); |
0 | 631 } |
632 ) | |
633 } | |
634 | |
635 // Traverse the list and process the referents, by either | |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
5
diff
changeset
|
636 // clearing them or keeping them (and their reachable |
0 | 637 // closure) alive. |
638 void | |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
5
diff
changeset
|
639 ReferenceProcessor::process_phase3(DiscoveredList& refs_list, |
0 | 640 bool clear_referent, |
641 BoolObjectClosure* is_alive, | |
642 OopClosure* keep_alive, | |
643 VoidClosure* complete_gc) { | |
1833
8b10f48633dc
6984287: Regularize how GC parallel workers are specified.
jmasa
parents:
1552
diff
changeset
|
644 ResourceMark rm; |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
5
diff
changeset
|
645 DiscoveredListIterator iter(refs_list, keep_alive, is_alive); |
0 | 646 while (iter.has_next()) { |
647 iter.update_discovered(); | |
648 iter.load_ptrs(DEBUG_ONLY(false /* allow_null_referent */)); | |
649 if (clear_referent) { | |
650 // NULL out referent pointer | |
651 iter.clear_referent(); | |
652 } else { | |
653 // keep the referent around | |
654 iter.make_referent_alive(); | |
655 } | |
656 if (TraceReferenceGC) { | |
657 gclog_or_tty->print_cr("Adding %sreference (" INTPTR_FORMAT ": %s) as pending", | |
658 clear_referent ? "cleared " : "", | |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
5
diff
changeset
|
659 iter.obj(), iter.obj()->blueprint()->internal_name()); |
0 | 660 } |
661 assert(iter.obj()->is_oop(UseConcMarkSweepGC), "Adding a bad reference"); | |
662 iter.next(); | |
663 } | |
3915
c2bf0120ee5d
7085906: Replace the permgen allocated sentinelRef with a self-looped end
stefank
parents:
2369
diff
changeset
|
664 // Remember to update the next pointer of the last ref. |
0 | 665 iter.update_discovered(); |
666 // Close the reachable set | |
667 complete_gc->do_void(); | |
668 } | |
669 | |
670 void | |
3915
c2bf0120ee5d
7085906: Replace the permgen allocated sentinelRef with a self-looped end
stefank
parents:
2369
diff
changeset
|
671 ReferenceProcessor::clear_discovered_references(DiscoveredList& refs_list) { |
c2bf0120ee5d
7085906: Replace the permgen allocated sentinelRef with a self-looped end
stefank
parents:
2369
diff
changeset
|
672 oop obj = NULL; |
c2bf0120ee5d
7085906: Replace the permgen allocated sentinelRef with a self-looped end
stefank
parents:
2369
diff
changeset
|
673 oop next = refs_list.head(); |
c2bf0120ee5d
7085906: Replace the permgen allocated sentinelRef with a self-looped end
stefank
parents:
2369
diff
changeset
|
674 while (next != obj) { |
c2bf0120ee5d
7085906: Replace the permgen allocated sentinelRef with a self-looped end
stefank
parents:
2369
diff
changeset
|
675 obj = next; |
c2bf0120ee5d
7085906: Replace the permgen allocated sentinelRef with a self-looped end
stefank
parents:
2369
diff
changeset
|
676 next = java_lang_ref_Reference::discovered(obj); |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
5
diff
changeset
|
677 java_lang_ref_Reference::set_discovered_raw(obj, NULL); |
0 | 678 } |
3915
c2bf0120ee5d
7085906: Replace the permgen allocated sentinelRef with a self-looped end
stefank
parents:
2369
diff
changeset
|
679 refs_list.set_head(NULL); |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
5
diff
changeset
|
680 refs_list.set_length(0); |
0 | 681 } |
682 | |
3915
c2bf0120ee5d
7085906: Replace the permgen allocated sentinelRef with a self-looped end
stefank
parents:
2369
diff
changeset
|
683 void |
c2bf0120ee5d
7085906: Replace the permgen allocated sentinelRef with a self-looped end
stefank
parents:
2369
diff
changeset
|
684 ReferenceProcessor::abandon_partial_discovered_list(DiscoveredList& refs_list) { |
c2bf0120ee5d
7085906: Replace the permgen allocated sentinelRef with a self-looped end
stefank
parents:
2369
diff
changeset
|
685 clear_discovered_references(refs_list); |
c2bf0120ee5d
7085906: Replace the permgen allocated sentinelRef with a self-looped end
stefank
parents:
2369
diff
changeset
|
686 } |
c2bf0120ee5d
7085906: Replace the permgen allocated sentinelRef with a self-looped end
stefank
parents:
2369
diff
changeset
|
687 |
342
37f87013dfd8
6711316: Open source the Garbage-First garbage collector
ysr
parents:
113
diff
changeset
|
688 void ReferenceProcessor::abandon_partial_discovery() { |
37f87013dfd8
6711316: Open source the Garbage-First garbage collector
ysr
parents:
113
diff
changeset
|
689 // loop over the lists |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3917
diff
changeset
|
690 for (int i = 0; i < _max_num_q * number_of_subclasses_of_ref(); i++) { |
1833
8b10f48633dc
6984287: Regularize how GC parallel workers are specified.
jmasa
parents:
1552
diff
changeset
|
691 if (TraceReferenceGC && PrintGCDetails && ((i % _max_num_q) == 0)) { |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3917
diff
changeset
|
692 gclog_or_tty->print_cr("\nAbandoning %s discovered list", list_name(i)); |
342
37f87013dfd8
6711316: Open source the Garbage-First garbage collector
ysr
parents:
113
diff
changeset
|
693 } |
37f87013dfd8
6711316: Open source the Garbage-First garbage collector
ysr
parents:
113
diff
changeset
|
694 abandon_partial_discovered_list(_discoveredSoftRefs[i]); |
0 | 695 } |
696 } | |
697 | |
698 class RefProcPhase1Task: public AbstractRefProcTaskExecutor::ProcessTask { | |
699 public: | |
700 RefProcPhase1Task(ReferenceProcessor& ref_processor, | |
701 DiscoveredList refs_lists[], | |
702 ReferencePolicy* policy, | |
703 bool marks_oops_alive) | |
704 : ProcessTask(ref_processor, refs_lists, marks_oops_alive), | |
705 _policy(policy) | |
706 { } | |
707 virtual void work(unsigned int i, BoolObjectClosure& is_alive, | |
708 OopClosure& keep_alive, | |
709 VoidClosure& complete_gc) | |
710 { | |
1833
8b10f48633dc
6984287: Regularize how GC parallel workers are specified.
jmasa
parents:
1552
diff
changeset
|
711 Thread* thr = Thread::current(); |
8b10f48633dc
6984287: Regularize how GC parallel workers are specified.
jmasa
parents:
1552
diff
changeset
|
712 int refs_list_index = ((WorkerThread*)thr)->id(); |
8b10f48633dc
6984287: Regularize how GC parallel workers are specified.
jmasa
parents:
1552
diff
changeset
|
713 _ref_processor.process_phase1(_refs_lists[refs_list_index], _policy, |
0 | 714 &is_alive, &keep_alive, &complete_gc); |
715 } | |
716 private: | |
717 ReferencePolicy* _policy; | |
718 }; | |
719 | |
720 class RefProcPhase2Task: public AbstractRefProcTaskExecutor::ProcessTask { | |
721 public: | |
722 RefProcPhase2Task(ReferenceProcessor& ref_processor, | |
723 DiscoveredList refs_lists[], | |
724 bool marks_oops_alive) | |
725 : ProcessTask(ref_processor, refs_lists, marks_oops_alive) | |
726 { } | |
727 virtual void work(unsigned int i, BoolObjectClosure& is_alive, | |
728 OopClosure& keep_alive, | |
729 VoidClosure& complete_gc) | |
730 { | |
731 _ref_processor.process_phase2(_refs_lists[i], | |
732 &is_alive, &keep_alive, &complete_gc); | |
733 } | |
734 }; | |
735 | |
736 class RefProcPhase3Task: public AbstractRefProcTaskExecutor::ProcessTask { | |
737 public: | |
738 RefProcPhase3Task(ReferenceProcessor& ref_processor, | |
739 DiscoveredList refs_lists[], | |
740 bool clear_referent, | |
741 bool marks_oops_alive) | |
742 : ProcessTask(ref_processor, refs_lists, marks_oops_alive), | |
743 _clear_referent(clear_referent) | |
744 { } | |
745 virtual void work(unsigned int i, BoolObjectClosure& is_alive, | |
746 OopClosure& keep_alive, | |
747 VoidClosure& complete_gc) | |
748 { | |
1833
8b10f48633dc
6984287: Regularize how GC parallel workers are specified.
jmasa
parents:
1552
diff
changeset
|
749 // Don't use "refs_list_index" calculated in this way because |
8b10f48633dc
6984287: Regularize how GC parallel workers are specified.
jmasa
parents:
1552
diff
changeset
|
750 // balance_queues() has moved the Ref's into the first n queues. |
8b10f48633dc
6984287: Regularize how GC parallel workers are specified.
jmasa
parents:
1552
diff
changeset
|
751 // Thread* thr = Thread::current(); |
8b10f48633dc
6984287: Regularize how GC parallel workers are specified.
jmasa
parents:
1552
diff
changeset
|
752 // int refs_list_index = ((WorkerThread*)thr)->id(); |
8b10f48633dc
6984287: Regularize how GC parallel workers are specified.
jmasa
parents:
1552
diff
changeset
|
753 // _ref_processor.process_phase3(_refs_lists[refs_list_index], _clear_referent, |
0 | 754 _ref_processor.process_phase3(_refs_lists[i], _clear_referent, |
755 &is_alive, &keep_alive, &complete_gc); | |
756 } | |
757 private: | |
758 bool _clear_referent; | |
759 }; | |
760 | |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3917
diff
changeset
|
761 void ReferenceProcessor::set_discovered(oop ref, oop value) { |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3917
diff
changeset
|
762 if (_discovered_list_needs_barrier) { |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3917
diff
changeset
|
763 java_lang_ref_Reference::set_discovered(ref, value); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3917
diff
changeset
|
764 } else { |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3917
diff
changeset
|
765 java_lang_ref_Reference::set_discovered_raw(ref, value); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3917
diff
changeset
|
766 } |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3917
diff
changeset
|
767 } |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3917
diff
changeset
|
768 |
0 | 769 // Balances reference queues. |
1833
8b10f48633dc
6984287: Regularize how GC parallel workers are specified.
jmasa
parents:
1552
diff
changeset
|
770 // Move entries from all queues[0, 1, ..., _max_num_q-1] to |
8b10f48633dc
6984287: Regularize how GC parallel workers are specified.
jmasa
parents:
1552
diff
changeset
|
771 // queues[0, 1, ..., _num_q-1] because only the first _num_q |
8b10f48633dc
6984287: Regularize how GC parallel workers are specified.
jmasa
parents:
1552
diff
changeset
|
772 // corresponding to the active workers will be processed. |
0 | 773 void ReferenceProcessor::balance_queues(DiscoveredList ref_lists[]) |
774 { | |
775 // calculate total length | |
776 size_t total_refs = 0; | |
1833
8b10f48633dc
6984287: Regularize how GC parallel workers are specified.
jmasa
parents:
1552
diff
changeset
|
777 if (TraceReferenceGC && PrintGCDetails) { |
8b10f48633dc
6984287: Regularize how GC parallel workers are specified.
jmasa
parents:
1552
diff
changeset
|
778 gclog_or_tty->print_cr("\nBalance ref_lists "); |
8b10f48633dc
6984287: Regularize how GC parallel workers are specified.
jmasa
parents:
1552
diff
changeset
|
779 } |
8b10f48633dc
6984287: Regularize how GC parallel workers are specified.
jmasa
parents:
1552
diff
changeset
|
780 |
8b10f48633dc
6984287: Regularize how GC parallel workers are specified.
jmasa
parents:
1552
diff
changeset
|
781 for (int i = 0; i < _max_num_q; ++i) { |
0 | 782 total_refs += ref_lists[i].length(); |
1833
8b10f48633dc
6984287: Regularize how GC parallel workers are specified.
jmasa
parents:
1552
diff
changeset
|
783 if (TraceReferenceGC && PrintGCDetails) { |
8b10f48633dc
6984287: Regularize how GC parallel workers are specified.
jmasa
parents:
1552
diff
changeset
|
784 gclog_or_tty->print("%d ", ref_lists[i].length()); |
8b10f48633dc
6984287: Regularize how GC parallel workers are specified.
jmasa
parents:
1552
diff
changeset
|
785 } |
8b10f48633dc
6984287: Regularize how GC parallel workers are specified.
jmasa
parents:
1552
diff
changeset
|
786 } |
8b10f48633dc
6984287: Regularize how GC parallel workers are specified.
jmasa
parents:
1552
diff
changeset
|
787 if (TraceReferenceGC && PrintGCDetails) { |
8b10f48633dc
6984287: Regularize how GC parallel workers are specified.
jmasa
parents:
1552
diff
changeset
|
788 gclog_or_tty->print_cr(" = %d", total_refs); |
0 | 789 } |
790 size_t avg_refs = total_refs / _num_q + 1; | |
791 int to_idx = 0; | |
1833
8b10f48633dc
6984287: Regularize how GC parallel workers are specified.
jmasa
parents:
1552
diff
changeset
|
792 for (int from_idx = 0; from_idx < _max_num_q; from_idx++) { |
8b10f48633dc
6984287: Regularize how GC parallel workers are specified.
jmasa
parents:
1552
diff
changeset
|
793 bool move_all = false; |
8b10f48633dc
6984287: Regularize how GC parallel workers are specified.
jmasa
parents:
1552
diff
changeset
|
794 if (from_idx >= _num_q) { |
8b10f48633dc
6984287: Regularize how GC parallel workers are specified.
jmasa
parents:
1552
diff
changeset
|
795 move_all = ref_lists[from_idx].length() > 0; |
8b10f48633dc
6984287: Regularize how GC parallel workers are specified.
jmasa
parents:
1552
diff
changeset
|
796 } |
8b10f48633dc
6984287: Regularize how GC parallel workers are specified.
jmasa
parents:
1552
diff
changeset
|
797 while ((ref_lists[from_idx].length() > avg_refs) || |
8b10f48633dc
6984287: Regularize how GC parallel workers are specified.
jmasa
parents:
1552
diff
changeset
|
798 move_all) { |
0 | 799 assert(to_idx < _num_q, "Sanity Check!"); |
800 if (ref_lists[to_idx].length() < avg_refs) { | |
801 // move superfluous refs | |
1833
8b10f48633dc
6984287: Regularize how GC parallel workers are specified.
jmasa
parents:
1552
diff
changeset
|
802 size_t refs_to_move; |
8b10f48633dc
6984287: Regularize how GC parallel workers are specified.
jmasa
parents:
1552
diff
changeset
|
803 // Move all the Ref's if the from queue will not be processed. |
8b10f48633dc
6984287: Regularize how GC parallel workers are specified.
jmasa
parents:
1552
diff
changeset
|
804 if (move_all) { |
8b10f48633dc
6984287: Regularize how GC parallel workers are specified.
jmasa
parents:
1552
diff
changeset
|
805 refs_to_move = MIN2(ref_lists[from_idx].length(), |
8b10f48633dc
6984287: Regularize how GC parallel workers are specified.
jmasa
parents:
1552
diff
changeset
|
806 avg_refs - ref_lists[to_idx].length()); |
8b10f48633dc
6984287: Regularize how GC parallel workers are specified.
jmasa
parents:
1552
diff
changeset
|
807 } else { |
8b10f48633dc
6984287: Regularize how GC parallel workers are specified.
jmasa
parents:
1552
diff
changeset
|
808 refs_to_move = MIN2(ref_lists[from_idx].length() - avg_refs, |
8b10f48633dc
6984287: Regularize how GC parallel workers are specified.
jmasa
parents:
1552
diff
changeset
|
809 avg_refs - ref_lists[to_idx].length()); |
8b10f48633dc
6984287: Regularize how GC parallel workers are specified.
jmasa
parents:
1552
diff
changeset
|
810 } |
3915
c2bf0120ee5d
7085906: Replace the permgen allocated sentinelRef with a self-looped end
stefank
parents:
2369
diff
changeset
|
811 |
c2bf0120ee5d
7085906: Replace the permgen allocated sentinelRef with a self-looped end
stefank
parents:
2369
diff
changeset
|
812 assert(refs_to_move > 0, "otherwise the code below will fail"); |
c2bf0120ee5d
7085906: Replace the permgen allocated sentinelRef with a self-looped end
stefank
parents:
2369
diff
changeset
|
813 |
0 | 814 oop move_head = ref_lists[from_idx].head(); |
815 oop move_tail = move_head; | |
816 oop new_head = move_head; | |
817 // find an element to split the list on | |
818 for (size_t j = 0; j < refs_to_move; ++j) { | |
819 move_tail = new_head; | |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
5
diff
changeset
|
820 new_head = java_lang_ref_Reference::discovered(new_head); |
0 | 821 } |
3915
c2bf0120ee5d
7085906: Replace the permgen allocated sentinelRef with a self-looped end
stefank
parents:
2369
diff
changeset
|
822 |
c2bf0120ee5d
7085906: Replace the permgen allocated sentinelRef with a self-looped end
stefank
parents:
2369
diff
changeset
|
823 // Add the chain to the to list. |
c2bf0120ee5d
7085906: Replace the permgen allocated sentinelRef with a self-looped end
stefank
parents:
2369
diff
changeset
|
824 if (ref_lists[to_idx].head() == NULL) { |
c2bf0120ee5d
7085906: Replace the permgen allocated sentinelRef with a self-looped end
stefank
parents:
2369
diff
changeset
|
825 // to list is empty. Make a loop at the end. |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3917
diff
changeset
|
826 set_discovered(move_tail, move_tail); |
3915
c2bf0120ee5d
7085906: Replace the permgen allocated sentinelRef with a self-looped end
stefank
parents:
2369
diff
changeset
|
827 } else { |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3917
diff
changeset
|
828 set_discovered(move_tail, ref_lists[to_idx].head()); |
3915
c2bf0120ee5d
7085906: Replace the permgen allocated sentinelRef with a self-looped end
stefank
parents:
2369
diff
changeset
|
829 } |
0 | 830 ref_lists[to_idx].set_head(move_head); |
452
00b023ae2d78
6722113: CMS: Incorrect overflow handling during precleaning of Reference lists
ysr
parents:
356
diff
changeset
|
831 ref_lists[to_idx].inc_length(refs_to_move); |
3915
c2bf0120ee5d
7085906: Replace the permgen allocated sentinelRef with a self-looped end
stefank
parents:
2369
diff
changeset
|
832 |
c2bf0120ee5d
7085906: Replace the permgen allocated sentinelRef with a self-looped end
stefank
parents:
2369
diff
changeset
|
833 // Remove the chain from the from list. |
c2bf0120ee5d
7085906: Replace the permgen allocated sentinelRef with a self-looped end
stefank
parents:
2369
diff
changeset
|
834 if (move_tail == new_head) { |
c2bf0120ee5d
7085906: Replace the permgen allocated sentinelRef with a self-looped end
stefank
parents:
2369
diff
changeset
|
835 // We found the end of the from list. |
c2bf0120ee5d
7085906: Replace the permgen allocated sentinelRef with a self-looped end
stefank
parents:
2369
diff
changeset
|
836 ref_lists[from_idx].set_head(NULL); |
c2bf0120ee5d
7085906: Replace the permgen allocated sentinelRef with a self-looped end
stefank
parents:
2369
diff
changeset
|
837 } else { |
c2bf0120ee5d
7085906: Replace the permgen allocated sentinelRef with a self-looped end
stefank
parents:
2369
diff
changeset
|
838 ref_lists[from_idx].set_head(new_head); |
c2bf0120ee5d
7085906: Replace the permgen allocated sentinelRef with a self-looped end
stefank
parents:
2369
diff
changeset
|
839 } |
452
00b023ae2d78
6722113: CMS: Incorrect overflow handling during precleaning of Reference lists
ysr
parents:
356
diff
changeset
|
840 ref_lists[from_idx].dec_length(refs_to_move); |
1833
8b10f48633dc
6984287: Regularize how GC parallel workers are specified.
jmasa
parents:
1552
diff
changeset
|
841 if (ref_lists[from_idx].length() == 0) { |
8b10f48633dc
6984287: Regularize how GC parallel workers are specified.
jmasa
parents:
1552
diff
changeset
|
842 break; |
8b10f48633dc
6984287: Regularize how GC parallel workers are specified.
jmasa
parents:
1552
diff
changeset
|
843 } |
0 | 844 } else { |
1833
8b10f48633dc
6984287: Regularize how GC parallel workers are specified.
jmasa
parents:
1552
diff
changeset
|
845 to_idx = (to_idx + 1) % _num_q; |
0 | 846 } |
847 } | |
848 } | |
1833
8b10f48633dc
6984287: Regularize how GC parallel workers are specified.
jmasa
parents:
1552
diff
changeset
|
849 #ifdef ASSERT |
8b10f48633dc
6984287: Regularize how GC parallel workers are specified.
jmasa
parents:
1552
diff
changeset
|
850 size_t balanced_total_refs = 0; |
8b10f48633dc
6984287: Regularize how GC parallel workers are specified.
jmasa
parents:
1552
diff
changeset
|
851 for (int i = 0; i < _max_num_q; ++i) { |
8b10f48633dc
6984287: Regularize how GC parallel workers are specified.
jmasa
parents:
1552
diff
changeset
|
852 balanced_total_refs += ref_lists[i].length(); |
8b10f48633dc
6984287: Regularize how GC parallel workers are specified.
jmasa
parents:
1552
diff
changeset
|
853 if (TraceReferenceGC && PrintGCDetails) { |
8b10f48633dc
6984287: Regularize how GC parallel workers are specified.
jmasa
parents:
1552
diff
changeset
|
854 gclog_or_tty->print("%d ", ref_lists[i].length()); |
8b10f48633dc
6984287: Regularize how GC parallel workers are specified.
jmasa
parents:
1552
diff
changeset
|
855 } |
8b10f48633dc
6984287: Regularize how GC parallel workers are specified.
jmasa
parents:
1552
diff
changeset
|
856 } |
8b10f48633dc
6984287: Regularize how GC parallel workers are specified.
jmasa
parents:
1552
diff
changeset
|
857 if (TraceReferenceGC && PrintGCDetails) { |
8b10f48633dc
6984287: Regularize how GC parallel workers are specified.
jmasa
parents:
1552
diff
changeset
|
858 gclog_or_tty->print_cr(" = %d", balanced_total_refs); |
8b10f48633dc
6984287: Regularize how GC parallel workers are specified.
jmasa
parents:
1552
diff
changeset
|
859 gclog_or_tty->flush(); |
8b10f48633dc
6984287: Regularize how GC parallel workers are specified.
jmasa
parents:
1552
diff
changeset
|
860 } |
8b10f48633dc
6984287: Regularize how GC parallel workers are specified.
jmasa
parents:
1552
diff
changeset
|
861 assert(total_refs == balanced_total_refs, "Balancing was incomplete"); |
8b10f48633dc
6984287: Regularize how GC parallel workers are specified.
jmasa
parents:
1552
diff
changeset
|
862 #endif |
8b10f48633dc
6984287: Regularize how GC parallel workers are specified.
jmasa
parents:
1552
diff
changeset
|
863 } |
8b10f48633dc
6984287: Regularize how GC parallel workers are specified.
jmasa
parents:
1552
diff
changeset
|
864 |
8b10f48633dc
6984287: Regularize how GC parallel workers are specified.
jmasa
parents:
1552
diff
changeset
|
865 void ReferenceProcessor::balance_all_queues() { |
8b10f48633dc
6984287: Regularize how GC parallel workers are specified.
jmasa
parents:
1552
diff
changeset
|
866 balance_queues(_discoveredSoftRefs); |
8b10f48633dc
6984287: Regularize how GC parallel workers are specified.
jmasa
parents:
1552
diff
changeset
|
867 balance_queues(_discoveredWeakRefs); |
8b10f48633dc
6984287: Regularize how GC parallel workers are specified.
jmasa
parents:
1552
diff
changeset
|
868 balance_queues(_discoveredFinalRefs); |
8b10f48633dc
6984287: Regularize how GC parallel workers are specified.
jmasa
parents:
1552
diff
changeset
|
869 balance_queues(_discoveredPhantomRefs); |
0 | 870 } |
871 | |
872 void | |
873 ReferenceProcessor::process_discovered_reflist( | |
874 DiscoveredList refs_lists[], | |
875 ReferencePolicy* policy, | |
876 bool clear_referent, | |
877 BoolObjectClosure* is_alive, | |
878 OopClosure* keep_alive, | |
879 VoidClosure* complete_gc, | |
880 AbstractRefProcTaskExecutor* task_executor) | |
881 { | |
1833
8b10f48633dc
6984287: Regularize how GC parallel workers are specified.
jmasa
parents:
1552
diff
changeset
|
882 bool mt_processing = task_executor != NULL && _processing_is_mt; |
8b10f48633dc
6984287: Regularize how GC parallel workers are specified.
jmasa
parents:
1552
diff
changeset
|
883 // If discovery used MT and a dynamic number of GC threads, then |
8b10f48633dc
6984287: Regularize how GC parallel workers are specified.
jmasa
parents:
1552
diff
changeset
|
884 // the queues must be balanced for correctness if fewer than the |
8b10f48633dc
6984287: Regularize how GC parallel workers are specified.
jmasa
parents:
1552
diff
changeset
|
885 // maximum number of queues were used. The number of queue used |
8b10f48633dc
6984287: Regularize how GC parallel workers are specified.
jmasa
parents:
1552
diff
changeset
|
886 // during discovery may be different than the number to be used |
8b10f48633dc
6984287: Regularize how GC parallel workers are specified.
jmasa
parents:
1552
diff
changeset
|
887 // for processing so don't depend of _num_q < _max_num_q as part |
8b10f48633dc
6984287: Regularize how GC parallel workers are specified.
jmasa
parents:
1552
diff
changeset
|
888 // of the test. |
8b10f48633dc
6984287: Regularize how GC parallel workers are specified.
jmasa
parents:
1552
diff
changeset
|
889 bool must_balance = _discovery_is_mt; |
8b10f48633dc
6984287: Regularize how GC parallel workers are specified.
jmasa
parents:
1552
diff
changeset
|
890 |
8b10f48633dc
6984287: Regularize how GC parallel workers are specified.
jmasa
parents:
1552
diff
changeset
|
891 if ((mt_processing && ParallelRefProcBalancingEnabled) || |
8b10f48633dc
6984287: Regularize how GC parallel workers are specified.
jmasa
parents:
1552
diff
changeset
|
892 must_balance) { |
0 | 893 balance_queues(refs_lists); |
894 } | |
895 if (PrintReferenceGC && PrintGCDetails) { | |
896 size_t total = 0; | |
2369
92da084fefc9
6668573: CMS: reference processing crash if ParallelCMSThreads > ParallelGCThreads
ysr
parents:
1995
diff
changeset
|
897 for (int i = 0; i < _max_num_q; ++i) { |
0 | 898 total += refs_lists[i].length(); |
899 } | |
900 gclog_or_tty->print(", %u refs", total); | |
901 } | |
902 | |
903 // Phase 1 (soft refs only): | |
904 // . Traverse the list and remove any SoftReferences whose | |
905 // referents are not alive, but that should be kept alive for | |
906 // policy reasons. Keep alive the transitive closure of all | |
907 // such referents. | |
908 if (policy != NULL) { | |
1833
8b10f48633dc
6984287: Regularize how GC parallel workers are specified.
jmasa
parents:
1552
diff
changeset
|
909 if (mt_processing) { |
0 | 910 RefProcPhase1Task phase1(*this, refs_lists, policy, true /*marks_oops_alive*/); |
911 task_executor->execute(phase1); | |
912 } else { | |
2369
92da084fefc9
6668573: CMS: reference processing crash if ParallelCMSThreads > ParallelGCThreads
ysr
parents:
1995
diff
changeset
|
913 for (int i = 0; i < _max_num_q; i++) { |
0 | 914 process_phase1(refs_lists[i], policy, |
915 is_alive, keep_alive, complete_gc); | |
916 } | |
917 } | |
918 } else { // policy == NULL | |
919 assert(refs_lists != _discoveredSoftRefs, | |
920 "Policy must be specified for soft references."); | |
921 } | |
922 | |
923 // Phase 2: | |
924 // . Traverse the list and remove any refs whose referents are alive. | |
1833
8b10f48633dc
6984287: Regularize how GC parallel workers are specified.
jmasa
parents:
1552
diff
changeset
|
925 if (mt_processing) { |
0 | 926 RefProcPhase2Task phase2(*this, refs_lists, !discovery_is_atomic() /*marks_oops_alive*/); |
927 task_executor->execute(phase2); | |
928 } else { | |
2369
92da084fefc9
6668573: CMS: reference processing crash if ParallelCMSThreads > ParallelGCThreads
ysr
parents:
1995
diff
changeset
|
929 for (int i = 0; i < _max_num_q; i++) { |
0 | 930 process_phase2(refs_lists[i], is_alive, keep_alive, complete_gc); |
931 } | |
932 } | |
933 | |
934 // Phase 3: | |
935 // . Traverse the list and process referents as appropriate. | |
1833
8b10f48633dc
6984287: Regularize how GC parallel workers are specified.
jmasa
parents:
1552
diff
changeset
|
936 if (mt_processing) { |
0 | 937 RefProcPhase3Task phase3(*this, refs_lists, clear_referent, true /*marks_oops_alive*/); |
938 task_executor->execute(phase3); | |
939 } else { | |
2369
92da084fefc9
6668573: CMS: reference processing crash if ParallelCMSThreads > ParallelGCThreads
ysr
parents:
1995
diff
changeset
|
940 for (int i = 0; i < _max_num_q; i++) { |
0 | 941 process_phase3(refs_lists[i], clear_referent, |
942 is_alive, keep_alive, complete_gc); | |
943 } | |
944 } | |
945 } | |
946 | |
947 void ReferenceProcessor::clean_up_discovered_references() { | |
948 // loop over the lists | |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3917
diff
changeset
|
949 for (int i = 0; i < _max_num_q * number_of_subclasses_of_ref(); i++) { |
2369
92da084fefc9
6668573: CMS: reference processing crash if ParallelCMSThreads > ParallelGCThreads
ysr
parents:
1995
diff
changeset
|
950 if (TraceReferenceGC && PrintGCDetails && ((i % _max_num_q) == 0)) { |
0 | 951 gclog_or_tty->print_cr( |
952 "\nScrubbing %s discovered list of Null referents", | |
953 list_name(i)); | |
954 } | |
955 clean_up_discovered_reflist(_discoveredSoftRefs[i]); | |
956 } | |
957 } | |
958 | |
959 void ReferenceProcessor::clean_up_discovered_reflist(DiscoveredList& refs_list) { | |
960 assert(!discovery_is_atomic(), "Else why call this method?"); | |
961 DiscoveredListIterator iter(refs_list, NULL, NULL); | |
962 while (iter.has_next()) { | |
963 iter.load_ptrs(DEBUG_ONLY(true /* allow_null_referent */)); | |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
5
diff
changeset
|
964 oop next = java_lang_ref_Reference::next(iter.obj()); |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
5
diff
changeset
|
965 assert(next->is_oop_or_null(), "bad next field"); |
0 | 966 // If referent has been cleared or Reference is not active, |
967 // drop it. | |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
5
diff
changeset
|
968 if (iter.referent() == NULL || next != NULL) { |
0 | 969 debug_only( |
970 if (PrintGCDetails && TraceReferenceGC) { | |
971 gclog_or_tty->print_cr("clean_up_discovered_list: Dropping Reference: " | |
972 INTPTR_FORMAT " with next field: " INTPTR_FORMAT | |
973 " and referent: " INTPTR_FORMAT, | |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
5
diff
changeset
|
974 iter.obj(), next, iter.referent()); |
0 | 975 } |
976 ) | |
977 // Remove Reference object from list | |
978 iter.remove(); | |
452
00b023ae2d78
6722113: CMS: Incorrect overflow handling during precleaning of Reference lists
ysr
parents:
356
diff
changeset
|
979 iter.move_to_next(); |
0 | 980 } else { |
981 iter.next(); | |
982 } | |
983 } | |
984 NOT_PRODUCT( | |
985 if (PrintGCDetails && TraceReferenceGC) { | |
986 gclog_or_tty->print( | |
987 " Removed %d Refs with NULL referents out of %d discovered Refs", | |
988 iter.removed(), iter.processed()); | |
989 } | |
990 ) | |
991 } | |
992 | |
993 inline DiscoveredList* ReferenceProcessor::get_discovered_list(ReferenceType rt) { | |
994 int id = 0; | |
995 // Determine the queue index to use for this object. | |
996 if (_discovery_is_mt) { | |
997 // During a multi-threaded discovery phase, | |
998 // each thread saves to its "own" list. | |
999 Thread* thr = Thread::current(); | |
1974
fd1d227ef1b9
6983204: G1: Nightly test nsk/regression/b4958615 failing with +ExplicitGCInvokesConcurrent
johnc
parents:
1972
diff
changeset
|
1000 id = thr->as_Worker_thread()->id(); |
0 | 1001 } else { |
1002 // single-threaded discovery, we save in round-robin | |
1003 // fashion to each of the lists. | |
1004 if (_processing_is_mt) { | |
1005 id = next_id(); | |
1006 } | |
1007 } | |
1833
8b10f48633dc
6984287: Regularize how GC parallel workers are specified.
jmasa
parents:
1552
diff
changeset
|
1008 assert(0 <= id && id < _max_num_q, "Id is out-of-bounds (call Freud?)"); |
0 | 1009 |
1010 // Get the discovered queue to which we will add | |
1011 DiscoveredList* list = NULL; | |
1012 switch (rt) { | |
1013 case REF_OTHER: | |
1014 // Unknown reference type, no special treatment | |
1015 break; | |
1016 case REF_SOFT: | |
1017 list = &_discoveredSoftRefs[id]; | |
1018 break; | |
1019 case REF_WEAK: | |
1020 list = &_discoveredWeakRefs[id]; | |
1021 break; | |
1022 case REF_FINAL: | |
1023 list = &_discoveredFinalRefs[id]; | |
1024 break; | |
1025 case REF_PHANTOM: | |
1026 list = &_discoveredPhantomRefs[id]; | |
1027 break; | |
1028 case REF_NONE: | |
1029 // we should not reach here if we are an instanceRefKlass | |
1030 default: | |
1031 ShouldNotReachHere(); | |
1032 } | |
1833
8b10f48633dc
6984287: Regularize how GC parallel workers are specified.
jmasa
parents:
1552
diff
changeset
|
1033 if (TraceReferenceGC && PrintGCDetails) { |
1974
fd1d227ef1b9
6983204: G1: Nightly test nsk/regression/b4958615 failing with +ExplicitGCInvokesConcurrent
johnc
parents:
1972
diff
changeset
|
1034 gclog_or_tty->print_cr("Thread %d gets list " INTPTR_FORMAT, id, list); |
1833
8b10f48633dc
6984287: Regularize how GC parallel workers are specified.
jmasa
parents:
1552
diff
changeset
|
1035 } |
0 | 1036 return list; |
1037 } | |
1038 | |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
5
diff
changeset
|
1039 inline void |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
5
diff
changeset
|
1040 ReferenceProcessor::add_to_discovered_list_mt(DiscoveredList& refs_list, |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
5
diff
changeset
|
1041 oop obj, |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
5
diff
changeset
|
1042 HeapWord* discovered_addr) { |
0 | 1043 assert(_discovery_is_mt, "!_discovery_is_mt should have been handled by caller"); |
1044 // First we must make sure this object is only enqueued once. CAS in a non null | |
1045 // discovered_addr. | |
342
37f87013dfd8
6711316: Open source the Garbage-First garbage collector
ysr
parents:
113
diff
changeset
|
1046 oop current_head = refs_list.head(); |
3915
c2bf0120ee5d
7085906: Replace the permgen allocated sentinelRef with a self-looped end
stefank
parents:
2369
diff
changeset
|
1047 // The last ref must have its discovered field pointing to itself. |
c2bf0120ee5d
7085906: Replace the permgen allocated sentinelRef with a self-looped end
stefank
parents:
2369
diff
changeset
|
1048 oop next_discovered = (current_head != NULL) ? current_head : obj; |
342
37f87013dfd8
6711316: Open source the Garbage-First garbage collector
ysr
parents:
113
diff
changeset
|
1049 |
845
df6caf649ff7
6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents:
579
diff
changeset
|
1050 // Note: In the case of G1, this specific pre-barrier is strictly |
342
37f87013dfd8
6711316: Open source the Garbage-First garbage collector
ysr
parents:
113
diff
changeset
|
1051 // not necessary because the only case we are interested in |
845
df6caf649ff7
6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents:
579
diff
changeset
|
1052 // here is when *discovered_addr is NULL (see the CAS further below), |
df6caf649ff7
6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents:
579
diff
changeset
|
1053 // so this will expand to nothing. As a result, we have manually |
df6caf649ff7
6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents:
579
diff
changeset
|
1054 // elided this out for G1, but left in the test for some future |
3917
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3915
diff
changeset
|
1055 // collector that might have need for a pre-barrier here, e.g.:- |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3915
diff
changeset
|
1056 // _bs->write_ref_field_pre((oop* or narrowOop*)discovered_addr, next_discovered); |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3915
diff
changeset
|
1057 assert(!_discovered_list_needs_barrier || UseG1GC, |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3915
diff
changeset
|
1058 "Need to check non-G1 collector: " |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3915
diff
changeset
|
1059 "may need a pre-write-barrier for CAS from NULL below"); |
3915
c2bf0120ee5d
7085906: Replace the permgen allocated sentinelRef with a self-looped end
stefank
parents:
2369
diff
changeset
|
1060 oop retest = oopDesc::atomic_compare_exchange_oop(next_discovered, discovered_addr, |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
5
diff
changeset
|
1061 NULL); |
0 | 1062 if (retest == NULL) { |
1063 // This thread just won the right to enqueue the object. | |
3917
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3915
diff
changeset
|
1064 // We have separate lists for enqueueing, so no synchronization |
0 | 1065 // is necessary. |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
5
diff
changeset
|
1066 refs_list.set_head(obj); |
452
00b023ae2d78
6722113: CMS: Incorrect overflow handling during precleaning of Reference lists
ysr
parents:
356
diff
changeset
|
1067 refs_list.inc_length(1); |
342
37f87013dfd8
6711316: Open source the Garbage-First garbage collector
ysr
parents:
113
diff
changeset
|
1068 if (_discovered_list_needs_barrier) { |
3915
c2bf0120ee5d
7085906: Replace the permgen allocated sentinelRef with a self-looped end
stefank
parents:
2369
diff
changeset
|
1069 _bs->write_ref_field((void*)discovered_addr, next_discovered); |
342
37f87013dfd8
6711316: Open source the Garbage-First garbage collector
ysr
parents:
113
diff
changeset
|
1070 } |
1974
fd1d227ef1b9
6983204: G1: Nightly test nsk/regression/b4958615 failing with +ExplicitGCInvokesConcurrent
johnc
parents:
1972
diff
changeset
|
1071 |
fd1d227ef1b9
6983204: G1: Nightly test nsk/regression/b4958615 failing with +ExplicitGCInvokesConcurrent
johnc
parents:
1972
diff
changeset
|
1072 if (TraceReferenceGC) { |
3917
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3915
diff
changeset
|
1073 gclog_or_tty->print_cr("Discovered reference (mt) (" INTPTR_FORMAT ": %s)", |
1974
fd1d227ef1b9
6983204: G1: Nightly test nsk/regression/b4958615 failing with +ExplicitGCInvokesConcurrent
johnc
parents:
1972
diff
changeset
|
1074 obj, obj->blueprint()->internal_name()); |
fd1d227ef1b9
6983204: G1: Nightly test nsk/regression/b4958615 failing with +ExplicitGCInvokesConcurrent
johnc
parents:
1972
diff
changeset
|
1075 } |
0 | 1076 } else { |
1077 // If retest was non NULL, another thread beat us to it: | |
1078 // The reference has already been discovered... | |
1079 if (TraceReferenceGC) { | |
3917
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3915
diff
changeset
|
1080 gclog_or_tty->print_cr("Already discovered reference (" INTPTR_FORMAT ": %s)", |
0 | 1081 obj, obj->blueprint()->internal_name()); |
1082 } | |
1083 } | |
1084 } | |
1085 | |
1995
8df09fb45352
7005259: CMS: BubbleUpRef asserts referent(obj)->is_oop() failed: Enqueued a bad referent
ysr
parents:
1974
diff
changeset
|
1086 #ifndef PRODUCT |
8df09fb45352
7005259: CMS: BubbleUpRef asserts referent(obj)->is_oop() failed: Enqueued a bad referent
ysr
parents:
1974
diff
changeset
|
1087 // Non-atomic (i.e. concurrent) discovery might allow us |
8df09fb45352
7005259: CMS: BubbleUpRef asserts referent(obj)->is_oop() failed: Enqueued a bad referent
ysr
parents:
1974
diff
changeset
|
1088 // to observe j.l.References with NULL referents, being those |
8df09fb45352
7005259: CMS: BubbleUpRef asserts referent(obj)->is_oop() failed: Enqueued a bad referent
ysr
parents:
1974
diff
changeset
|
1089 // cleared concurrently by mutators during (or after) discovery. |
8df09fb45352
7005259: CMS: BubbleUpRef asserts referent(obj)->is_oop() failed: Enqueued a bad referent
ysr
parents:
1974
diff
changeset
|
1090 void ReferenceProcessor::verify_referent(oop obj) { |
8df09fb45352
7005259: CMS: BubbleUpRef asserts referent(obj)->is_oop() failed: Enqueued a bad referent
ysr
parents:
1974
diff
changeset
|
1091 bool da = discovery_is_atomic(); |
8df09fb45352
7005259: CMS: BubbleUpRef asserts referent(obj)->is_oop() failed: Enqueued a bad referent
ysr
parents:
1974
diff
changeset
|
1092 oop referent = java_lang_ref_Reference::referent(obj); |
8df09fb45352
7005259: CMS: BubbleUpRef asserts referent(obj)->is_oop() failed: Enqueued a bad referent
ysr
parents:
1974
diff
changeset
|
1093 assert(da ? referent->is_oop() : referent->is_oop_or_null(), |
8df09fb45352
7005259: CMS: BubbleUpRef asserts referent(obj)->is_oop() failed: Enqueued a bad referent
ysr
parents:
1974
diff
changeset
|
1094 err_msg("Bad referent " INTPTR_FORMAT " found in Reference " |
8df09fb45352
7005259: CMS: BubbleUpRef asserts referent(obj)->is_oop() failed: Enqueued a bad referent
ysr
parents:
1974
diff
changeset
|
1095 INTPTR_FORMAT " during %satomic discovery ", |
8df09fb45352
7005259: CMS: BubbleUpRef asserts referent(obj)->is_oop() failed: Enqueued a bad referent
ysr
parents:
1974
diff
changeset
|
1096 (intptr_t)referent, (intptr_t)obj, da ? "" : "non-")); |
8df09fb45352
7005259: CMS: BubbleUpRef asserts referent(obj)->is_oop() failed: Enqueued a bad referent
ysr
parents:
1974
diff
changeset
|
1097 } |
8df09fb45352
7005259: CMS: BubbleUpRef asserts referent(obj)->is_oop() failed: Enqueued a bad referent
ysr
parents:
1974
diff
changeset
|
1098 #endif |
8df09fb45352
7005259: CMS: BubbleUpRef asserts referent(obj)->is_oop() failed: Enqueued a bad referent
ysr
parents:
1974
diff
changeset
|
1099 |
0 | 1100 // We mention two of several possible choices here: |
1101 // #0: if the reference object is not in the "originating generation" | |
1102 // (or part of the heap being collected, indicated by our "span" | |
1103 // we don't treat it specially (i.e. we scan it as we would | |
1104 // a normal oop, treating its references as strong references). | |
3917
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3915
diff
changeset
|
1105 // This means that references can't be discovered unless their |
0 | 1106 // referent is also in the same span. This is the simplest, |
1107 // most "local" and most conservative approach, albeit one | |
1108 // that may cause weak references to be enqueued least promptly. | |
1109 // We call this choice the "ReferenceBasedDiscovery" policy. | |
1110 // #1: the reference object may be in any generation (span), but if | |
1111 // the referent is in the generation (span) being currently collected | |
1112 // then we can discover the reference object, provided | |
1113 // the object has not already been discovered by | |
1114 // a different concurrently running collector (as may be the | |
1115 // case, for instance, if the reference object is in CMS and | |
1116 // the referent in DefNewGeneration), and provided the processing | |
1117 // of this reference object by the current collector will | |
1118 // appear atomic to every other collector in the system. | |
1119 // (Thus, for instance, a concurrent collector may not | |
1120 // discover references in other generations even if the | |
1121 // referent is in its own generation). This policy may, | |
1122 // in certain cases, enqueue references somewhat sooner than | |
1123 // might Policy #0 above, but at marginally increased cost | |
1124 // and complexity in processing these references. | |
1125 // We call this choice the "RefeferentBasedDiscovery" policy. | |
1126 bool ReferenceProcessor::discover_reference(oop obj, ReferenceType rt) { | |
3917
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3915
diff
changeset
|
1127 // Make sure we are discovering refs (rather than processing discovered refs). |
0 | 1128 if (!_discovering_refs || !RegisterReferences) { |
1129 return false; | |
1130 } | |
3917
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3915
diff
changeset
|
1131 // We only discover active references. |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
5
diff
changeset
|
1132 oop next = java_lang_ref_Reference::next(obj); |
3917
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3915
diff
changeset
|
1133 if (next != NULL) { // Ref is no longer active |
0 | 1134 return false; |
1135 } | |
1136 | |
1137 HeapWord* obj_addr = (HeapWord*)obj; | |
1138 if (RefDiscoveryPolicy == ReferenceBasedDiscovery && | |
1139 !_span.contains(obj_addr)) { | |
1140 // Reference is not in the originating generation; | |
1141 // don't treat it specially (i.e. we want to scan it as a normal | |
1142 // object with strong references). | |
1143 return false; | |
1144 } | |
1145 | |
3917
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3915
diff
changeset
|
1146 // We only discover references whose referents are not (yet) |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3915
diff
changeset
|
1147 // known to be strongly reachable. |
0 | 1148 if (is_alive_non_header() != NULL) { |
1995
8df09fb45352
7005259: CMS: BubbleUpRef asserts referent(obj)->is_oop() failed: Enqueued a bad referent
ysr
parents:
1974
diff
changeset
|
1149 verify_referent(obj); |
8df09fb45352
7005259: CMS: BubbleUpRef asserts referent(obj)->is_oop() failed: Enqueued a bad referent
ysr
parents:
1974
diff
changeset
|
1150 if (is_alive_non_header()->do_object_b(java_lang_ref_Reference::referent(obj))) { |
0 | 1151 return false; // referent is reachable |
1152 } | |
1153 } | |
453
c96030fff130
6684579: SoftReference processing can be made more efficient
ysr
parents:
452
diff
changeset
|
1154 if (rt == REF_SOFT) { |
c96030fff130
6684579: SoftReference processing can be made more efficient
ysr
parents:
452
diff
changeset
|
1155 // For soft refs we can decide now if these are not |
c96030fff130
6684579: SoftReference processing can be made more efficient
ysr
parents:
452
diff
changeset
|
1156 // current candidates for clearing, in which case we |
c96030fff130
6684579: SoftReference processing can be made more efficient
ysr
parents:
452
diff
changeset
|
1157 // can mark through them now, rather than delaying that |
c96030fff130
6684579: SoftReference processing can be made more efficient
ysr
parents:
452
diff
changeset
|
1158 // to the reference-processing phase. Since all current |
c96030fff130
6684579: SoftReference processing can be made more efficient
ysr
parents:
452
diff
changeset
|
1159 // time-stamp policies advance the soft-ref clock only |
c96030fff130
6684579: SoftReference processing can be made more efficient
ysr
parents:
452
diff
changeset
|
1160 // at a major collection cycle, this is always currently |
c96030fff130
6684579: SoftReference processing can be made more efficient
ysr
parents:
452
diff
changeset
|
1161 // accurate. |
3992
d1bdeef3e3e2
7098282: G1: assert(interval >= 0) failed: Sanity check, referencePolicy.cpp: 76
johnc
parents:
3979
diff
changeset
|
1162 if (!_current_soft_ref_policy->should_clear_reference(obj, _soft_ref_timestamp_clock)) { |
453
c96030fff130
6684579: SoftReference processing can be made more efficient
ysr
parents:
452
diff
changeset
|
1163 return false; |
c96030fff130
6684579: SoftReference processing can be made more efficient
ysr
parents:
452
diff
changeset
|
1164 } |
c96030fff130
6684579: SoftReference processing can be made more efficient
ysr
parents:
452
diff
changeset
|
1165 } |
0 | 1166 |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3917
diff
changeset
|
1167 ResourceMark rm; // Needed for tracing. |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3917
diff
changeset
|
1168 |
342
37f87013dfd8
6711316: Open source the Garbage-First garbage collector
ysr
parents:
113
diff
changeset
|
1169 HeapWord* const discovered_addr = java_lang_ref_Reference::discovered_addr(obj); |
37f87013dfd8
6711316: Open source the Garbage-First garbage collector
ysr
parents:
113
diff
changeset
|
1170 const oop discovered = java_lang_ref_Reference::discovered(obj); |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
5
diff
changeset
|
1171 assert(discovered->is_oop_or_null(), "bad discovered field"); |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
5
diff
changeset
|
1172 if (discovered != NULL) { |
0 | 1173 // The reference has already been discovered... |
1174 if (TraceReferenceGC) { | |
3917
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3915
diff
changeset
|
1175 gclog_or_tty->print_cr("Already discovered reference (" INTPTR_FORMAT ": %s)", |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
5
diff
changeset
|
1176 obj, obj->blueprint()->internal_name()); |
0 | 1177 } |
1178 if (RefDiscoveryPolicy == ReferentBasedDiscovery) { | |
1179 // assumes that an object is not processed twice; | |
1180 // if it's been already discovered it must be on another | |
1181 // generation's discovered list; so we won't discover it. | |
1182 return false; | |
1183 } else { | |
1184 assert(RefDiscoveryPolicy == ReferenceBasedDiscovery, | |
1185 "Unrecognized policy"); | |
1186 // Check assumption that an object is not potentially | |
1187 // discovered twice except by concurrent collectors that potentially | |
1188 // trace the same Reference object twice. | |
1974
fd1d227ef1b9
6983204: G1: Nightly test nsk/regression/b4958615 failing with +ExplicitGCInvokesConcurrent
johnc
parents:
1972
diff
changeset
|
1189 assert(UseConcMarkSweepGC || UseG1GC, |
fd1d227ef1b9
6983204: G1: Nightly test nsk/regression/b4958615 failing with +ExplicitGCInvokesConcurrent
johnc
parents:
1972
diff
changeset
|
1190 "Only possible with a concurrent marking collector"); |
0 | 1191 return true; |
1192 } | |
1193 } | |
1194 | |
1195 if (RefDiscoveryPolicy == ReferentBasedDiscovery) { | |
1995
8df09fb45352
7005259: CMS: BubbleUpRef asserts referent(obj)->is_oop() failed: Enqueued a bad referent
ysr
parents:
1974
diff
changeset
|
1196 verify_referent(obj); |
3917
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3915
diff
changeset
|
1197 // Discover if and only if EITHER: |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3915
diff
changeset
|
1198 // .. reference is in our span, OR |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3915
diff
changeset
|
1199 // .. we are an atomic collector and referent is in our span |
0 | 1200 if (_span.contains(obj_addr) || |
1995
8df09fb45352
7005259: CMS: BubbleUpRef asserts referent(obj)->is_oop() failed: Enqueued a bad referent
ysr
parents:
1974
diff
changeset
|
1201 (discovery_is_atomic() && |
8df09fb45352
7005259: CMS: BubbleUpRef asserts referent(obj)->is_oop() failed: Enqueued a bad referent
ysr
parents:
1974
diff
changeset
|
1202 _span.contains(java_lang_ref_Reference::referent(obj)))) { |
0 | 1203 // should_enqueue = true; |
1204 } else { | |
1205 return false; | |
1206 } | |
1207 } else { | |
1208 assert(RefDiscoveryPolicy == ReferenceBasedDiscovery && | |
1209 _span.contains(obj_addr), "code inconsistency"); | |
1210 } | |
1211 | |
1212 // Get the right type of discovered queue head. | |
1213 DiscoveredList* list = get_discovered_list(rt); | |
1214 if (list == NULL) { | |
1215 return false; // nothing special needs to be done | |
1216 } | |
1217 | |
1218 if (_discovery_is_mt) { | |
1219 add_to_discovered_list_mt(*list, obj, discovered_addr); | |
1220 } else { | |
342
37f87013dfd8
6711316: Open source the Garbage-First garbage collector
ysr
parents:
113
diff
changeset
|
1221 // If "_discovered_list_needs_barrier", we do write barriers when |
37f87013dfd8
6711316: Open source the Garbage-First garbage collector
ysr
parents:
113
diff
changeset
|
1222 // updating the discovered reference list. Otherwise, we do a raw store |
37f87013dfd8
6711316: Open source the Garbage-First garbage collector
ysr
parents:
113
diff
changeset
|
1223 // here: the field will be visited later when processing the discovered |
37f87013dfd8
6711316: Open source the Garbage-First garbage collector
ysr
parents:
113
diff
changeset
|
1224 // references. |
37f87013dfd8
6711316: Open source the Garbage-First garbage collector
ysr
parents:
113
diff
changeset
|
1225 oop current_head = list->head(); |
3915
c2bf0120ee5d
7085906: Replace the permgen allocated sentinelRef with a self-looped end
stefank
parents:
2369
diff
changeset
|
1226 // The last ref must have its discovered field pointing to itself. |
c2bf0120ee5d
7085906: Replace the permgen allocated sentinelRef with a self-looped end
stefank
parents:
2369
diff
changeset
|
1227 oop next_discovered = (current_head != NULL) ? current_head : obj; |
c2bf0120ee5d
7085906: Replace the permgen allocated sentinelRef with a self-looped end
stefank
parents:
2369
diff
changeset
|
1228 |
342
37f87013dfd8
6711316: Open source the Garbage-First garbage collector
ysr
parents:
113
diff
changeset
|
1229 // As in the case further above, since we are over-writing a NULL |
37f87013dfd8
6711316: Open source the Garbage-First garbage collector
ysr
parents:
113
diff
changeset
|
1230 // pre-value, we can safely elide the pre-barrier here for the case of G1. |
3917
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3915
diff
changeset
|
1231 // e.g.:- _bs->write_ref_field_pre((oop* or narrowOop*)discovered_addr, next_discovered); |
342
37f87013dfd8
6711316: Open source the Garbage-First garbage collector
ysr
parents:
113
diff
changeset
|
1232 assert(discovered == NULL, "control point invariant"); |
3917
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3915
diff
changeset
|
1233 assert(!_discovered_list_needs_barrier || UseG1GC, |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3915
diff
changeset
|
1234 "For non-G1 collector, may need a pre-write-barrier for CAS from NULL below"); |
3915
c2bf0120ee5d
7085906: Replace the permgen allocated sentinelRef with a self-looped end
stefank
parents:
2369
diff
changeset
|
1235 oop_store_raw(discovered_addr, next_discovered); |
342
37f87013dfd8
6711316: Open source the Garbage-First garbage collector
ysr
parents:
113
diff
changeset
|
1236 if (_discovered_list_needs_barrier) { |
3915
c2bf0120ee5d
7085906: Replace the permgen allocated sentinelRef with a self-looped end
stefank
parents:
2369
diff
changeset
|
1237 _bs->write_ref_field((void*)discovered_addr, next_discovered); |
342
37f87013dfd8
6711316: Open source the Garbage-First garbage collector
ysr
parents:
113
diff
changeset
|
1238 } |
0 | 1239 list->set_head(obj); |
452
00b023ae2d78
6722113: CMS: Incorrect overflow handling during precleaning of Reference lists
ysr
parents:
356
diff
changeset
|
1240 list->inc_length(1); |
0 | 1241 |
1974
fd1d227ef1b9
6983204: G1: Nightly test nsk/regression/b4958615 failing with +ExplicitGCInvokesConcurrent
johnc
parents:
1972
diff
changeset
|
1242 if (TraceReferenceGC) { |
3917
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3915
diff
changeset
|
1243 gclog_or_tty->print_cr("Discovered reference (" INTPTR_FORMAT ": %s)", |
1974
fd1d227ef1b9
6983204: G1: Nightly test nsk/regression/b4958615 failing with +ExplicitGCInvokesConcurrent
johnc
parents:
1972
diff
changeset
|
1244 obj, obj->blueprint()->internal_name()); |
0 | 1245 } |
1246 } | |
3917
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3915
diff
changeset
|
1247 assert(obj->is_oop(), "Discovered a bad reference"); |
1995
8df09fb45352
7005259: CMS: BubbleUpRef asserts referent(obj)->is_oop() failed: Enqueued a bad referent
ysr
parents:
1974
diff
changeset
|
1248 verify_referent(obj); |
0 | 1249 return true; |
1250 } | |
1251 | |
1252 // Preclean the discovered references by removing those | |
1253 // whose referents are alive, and by marking from those that | |
1254 // are not active. These lists can be handled here | |
1255 // in any order and, indeed, concurrently. | |
1256 void ReferenceProcessor::preclean_discovered_references( | |
1257 BoolObjectClosure* is_alive, | |
1258 OopClosure* keep_alive, | |
1259 VoidClosure* complete_gc, | |
1190
4788266644c1
6895236: CMS: cmsOopClosures.inline.hpp:43 assert(..., "Should remember klasses in this context")
jmasa
parents:
1144
diff
changeset
|
1260 YieldClosure* yield, |
4788266644c1
6895236: CMS: cmsOopClosures.inline.hpp:43 assert(..., "Should remember klasses in this context")
jmasa
parents:
1144
diff
changeset
|
1261 bool should_unload_classes) { |
0 | 1262 |
1263 NOT_PRODUCT(verify_ok_to_handle_reflists()); | |
1264 | |
935 | 1265 #ifdef ASSERT |
1266 bool must_remember_klasses = ClassUnloading && !UseConcMarkSweepGC || | |
1190
4788266644c1
6895236: CMS: cmsOopClosures.inline.hpp:43 assert(..., "Should remember klasses in this context")
jmasa
parents:
1144
diff
changeset
|
1267 CMSClassUnloadingEnabled && UseConcMarkSweepGC || |
4788266644c1
6895236: CMS: cmsOopClosures.inline.hpp:43 assert(..., "Should remember klasses in this context")
jmasa
parents:
1144
diff
changeset
|
1268 ExplicitGCInvokesConcurrentAndUnloadsClasses && |
4788266644c1
6895236: CMS: cmsOopClosures.inline.hpp:43 assert(..., "Should remember klasses in this context")
jmasa
parents:
1144
diff
changeset
|
1269 UseConcMarkSweepGC && should_unload_classes; |
935 | 1270 RememberKlassesChecker mx(must_remember_klasses); |
1271 #endif | |
0 | 1272 // Soft references |
1273 { | |
1274 TraceTime tt("Preclean SoftReferences", PrintGCDetails && PrintReferenceGC, | |
1275 false, gclog_or_tty); | |
1833
8b10f48633dc
6984287: Regularize how GC parallel workers are specified.
jmasa
parents:
1552
diff
changeset
|
1276 for (int i = 0; i < _max_num_q; i++) { |
452
00b023ae2d78
6722113: CMS: Incorrect overflow handling during precleaning of Reference lists
ysr
parents:
356
diff
changeset
|
1277 if (yield->should_return()) { |
00b023ae2d78
6722113: CMS: Incorrect overflow handling during precleaning of Reference lists
ysr
parents:
356
diff
changeset
|
1278 return; |
00b023ae2d78
6722113: CMS: Incorrect overflow handling during precleaning of Reference lists
ysr
parents:
356
diff
changeset
|
1279 } |
0 | 1280 preclean_discovered_reflist(_discoveredSoftRefs[i], is_alive, |
1281 keep_alive, complete_gc, yield); | |
1282 } | |
1283 } | |
1284 | |
1285 // Weak references | |
1286 { | |
1287 TraceTime tt("Preclean WeakReferences", PrintGCDetails && PrintReferenceGC, | |
1288 false, gclog_or_tty); | |
2369
92da084fefc9
6668573: CMS: reference processing crash if ParallelCMSThreads > ParallelGCThreads
ysr
parents:
1995
diff
changeset
|
1289 for (int i = 0; i < _max_num_q; i++) { |
452
00b023ae2d78
6722113: CMS: Incorrect overflow handling during precleaning of Reference lists
ysr
parents:
356
diff
changeset
|
1290 if (yield->should_return()) { |
00b023ae2d78
6722113: CMS: Incorrect overflow handling during precleaning of Reference lists
ysr
parents:
356
diff
changeset
|
1291 return; |
00b023ae2d78
6722113: CMS: Incorrect overflow handling during precleaning of Reference lists
ysr
parents:
356
diff
changeset
|
1292 } |
0 | 1293 preclean_discovered_reflist(_discoveredWeakRefs[i], is_alive, |
1294 keep_alive, complete_gc, yield); | |
1295 } | |
1296 } | |
1297 | |
1298 // Final references | |
1299 { | |
1300 TraceTime tt("Preclean FinalReferences", PrintGCDetails && PrintReferenceGC, | |
1301 false, gclog_or_tty); | |
2369
92da084fefc9
6668573: CMS: reference processing crash if ParallelCMSThreads > ParallelGCThreads
ysr
parents:
1995
diff
changeset
|
1302 for (int i = 0; i < _max_num_q; i++) { |
452
00b023ae2d78
6722113: CMS: Incorrect overflow handling during precleaning of Reference lists
ysr
parents:
356
diff
changeset
|
1303 if (yield->should_return()) { |
00b023ae2d78
6722113: CMS: Incorrect overflow handling during precleaning of Reference lists
ysr
parents:
356
diff
changeset
|
1304 return; |
00b023ae2d78
6722113: CMS: Incorrect overflow handling during precleaning of Reference lists
ysr
parents:
356
diff
changeset
|
1305 } |
0 | 1306 preclean_discovered_reflist(_discoveredFinalRefs[i], is_alive, |
1307 keep_alive, complete_gc, yield); | |
1308 } | |
1309 } | |
1310 | |
1311 // Phantom references | |
1312 { | |
1313 TraceTime tt("Preclean PhantomReferences", PrintGCDetails && PrintReferenceGC, | |
1314 false, gclog_or_tty); | |
2369
92da084fefc9
6668573: CMS: reference processing crash if ParallelCMSThreads > ParallelGCThreads
ysr
parents:
1995
diff
changeset
|
1315 for (int i = 0; i < _max_num_q; i++) { |
452
00b023ae2d78
6722113: CMS: Incorrect overflow handling during precleaning of Reference lists
ysr
parents:
356
diff
changeset
|
1316 if (yield->should_return()) { |
00b023ae2d78
6722113: CMS: Incorrect overflow handling during precleaning of Reference lists
ysr
parents:
356
diff
changeset
|
1317 return; |
00b023ae2d78
6722113: CMS: Incorrect overflow handling during precleaning of Reference lists
ysr
parents:
356
diff
changeset
|
1318 } |
0 | 1319 preclean_discovered_reflist(_discoveredPhantomRefs[i], is_alive, |
1320 keep_alive, complete_gc, yield); | |
1321 } | |
1322 } | |
1323 } | |
1324 | |
1325 // Walk the given discovered ref list, and remove all reference objects | |
1326 // whose referents are still alive, whose referents are NULL or which | |
452
00b023ae2d78
6722113: CMS: Incorrect overflow handling during precleaning of Reference lists
ysr
parents:
356
diff
changeset
|
1327 // are not active (have a non-NULL next field). NOTE: When we are |
00b023ae2d78
6722113: CMS: Incorrect overflow handling during precleaning of Reference lists
ysr
parents:
356
diff
changeset
|
1328 // thus precleaning the ref lists (which happens single-threaded today), |
00b023ae2d78
6722113: CMS: Incorrect overflow handling during precleaning of Reference lists
ysr
parents:
356
diff
changeset
|
1329 // we do not disable refs discovery to honour the correct semantics of |
00b023ae2d78
6722113: CMS: Incorrect overflow handling during precleaning of Reference lists
ysr
parents:
356
diff
changeset
|
1330 // java.lang.Reference. As a result, we need to be careful below |
00b023ae2d78
6722113: CMS: Incorrect overflow handling during precleaning of Reference lists
ysr
parents:
356
diff
changeset
|
1331 // that ref removal steps interleave safely with ref discovery steps |
00b023ae2d78
6722113: CMS: Incorrect overflow handling during precleaning of Reference lists
ysr
parents:
356
diff
changeset
|
1332 // (in this thread). |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
5
diff
changeset
|
1333 void |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
5
diff
changeset
|
1334 ReferenceProcessor::preclean_discovered_reflist(DiscoveredList& refs_list, |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
5
diff
changeset
|
1335 BoolObjectClosure* is_alive, |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
5
diff
changeset
|
1336 OopClosure* keep_alive, |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
5
diff
changeset
|
1337 VoidClosure* complete_gc, |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
5
diff
changeset
|
1338 YieldClosure* yield) { |
0 | 1339 DiscoveredListIterator iter(refs_list, keep_alive, is_alive); |
1340 while (iter.has_next()) { | |
1341 iter.load_ptrs(DEBUG_ONLY(true /* allow_null_referent */)); | |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
5
diff
changeset
|
1342 oop obj = iter.obj(); |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
5
diff
changeset
|
1343 oop next = java_lang_ref_Reference::next(obj); |
0 | 1344 if (iter.referent() == NULL || iter.is_referent_alive() || |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
5
diff
changeset
|
1345 next != NULL) { |
0 | 1346 // The referent has been cleared, or is alive, or the Reference is not |
1347 // active; we need to trace and mark its cohort. | |
1348 if (TraceReferenceGC) { | |
1349 gclog_or_tty->print_cr("Precleaning Reference (" INTPTR_FORMAT ": %s)", | |
1350 iter.obj(), iter.obj()->blueprint()->internal_name()); | |
1351 } | |
1352 // Remove Reference object from list | |
1353 iter.remove(); | |
1354 // Keep alive its cohort. | |
1355 iter.make_referent_alive(); | |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
5
diff
changeset
|
1356 if (UseCompressedOops) { |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
5
diff
changeset
|
1357 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:
5
diff
changeset
|
1358 keep_alive->do_oop(next_addr); |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
5
diff
changeset
|
1359 } else { |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
5
diff
changeset
|
1360 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:
5
diff
changeset
|
1361 keep_alive->do_oop(next_addr); |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
5
diff
changeset
|
1362 } |
452
00b023ae2d78
6722113: CMS: Incorrect overflow handling during precleaning of Reference lists
ysr
parents:
356
diff
changeset
|
1363 iter.move_to_next(); |
0 | 1364 } else { |
1365 iter.next(); | |
1366 } | |
1367 } | |
1368 // Close the reachable set | |
1369 complete_gc->do_void(); | |
1370 | |
1371 NOT_PRODUCT( | |
2369
92da084fefc9
6668573: CMS: reference processing crash if ParallelCMSThreads > ParallelGCThreads
ysr
parents:
1995
diff
changeset
|
1372 if (PrintGCDetails && PrintReferenceGC && (iter.processed() > 0)) { |
1833
8b10f48633dc
6984287: Regularize how GC parallel workers are specified.
jmasa
parents:
1552
diff
changeset
|
1373 gclog_or_tty->print_cr(" Dropped %d Refs out of %d " |
8b10f48633dc
6984287: Regularize how GC parallel workers are specified.
jmasa
parents:
1552
diff
changeset
|
1374 "Refs in discovered list " INTPTR_FORMAT, |
8b10f48633dc
6984287: Regularize how GC parallel workers are specified.
jmasa
parents:
1552
diff
changeset
|
1375 iter.removed(), iter.processed(), (address)refs_list.head()); |
0 | 1376 } |
1377 ) | |
1378 } | |
1379 | |
1380 const char* ReferenceProcessor::list_name(int i) { | |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3917
diff
changeset
|
1381 assert(i >= 0 && i <= _max_num_q * number_of_subclasses_of_ref(), |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3917
diff
changeset
|
1382 "Out of bounds index"); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3917
diff
changeset
|
1383 |
1833
8b10f48633dc
6984287: Regularize how GC parallel workers are specified.
jmasa
parents:
1552
diff
changeset
|
1384 int j = i / _max_num_q; |
0 | 1385 switch (j) { |
1386 case 0: return "SoftRef"; | |
1387 case 1: return "WeakRef"; | |
1388 case 2: return "FinalRef"; | |
1389 case 3: return "PhantomRef"; | |
1390 } | |
1391 ShouldNotReachHere(); | |
1392 return NULL; | |
1393 } | |
1394 | |
1395 #ifndef PRODUCT | |
1396 void ReferenceProcessor::verify_ok_to_handle_reflists() { | |
1397 // empty for now | |
1398 } | |
1399 #endif | |
1400 | |
1401 #ifndef PRODUCT | |
1402 void ReferenceProcessor::clear_discovered_references() { | |
1403 guarantee(!_discovering_refs, "Discovering refs?"); | |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3917
diff
changeset
|
1404 for (int i = 0; i < _max_num_q * number_of_subclasses_of_ref(); i++) { |
3915
c2bf0120ee5d
7085906: Replace the permgen allocated sentinelRef with a self-looped end
stefank
parents:
2369
diff
changeset
|
1405 clear_discovered_references(_discoveredSoftRefs[i]); |
0 | 1406 } |
1407 } | |
3915
c2bf0120ee5d
7085906: Replace the permgen allocated sentinelRef with a self-looped end
stefank
parents:
2369
diff
changeset
|
1408 |
0 | 1409 #endif // PRODUCT |