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