annotate src/share/vm/memory/referenceProcessor.hpp @ 3917:eca1193ca245

4965777: GC changes to support use of discovered field for pending references Summary: If and when the reference handler thread is able to use the discovered field to link reference objects in its pending list, so will GC. In that case, GC will scan through this field once a reference object has been placed on the pending list, but not scan that field before that stage, as the field is used by the concurrent GC thread to link discovered objects. When ReferenceHandleR thread does not use the discovered field for the purpose of linking the elements in the pending list, as would be the case in older JDKs, the JVM will fall back to the old behaviour of using the next field for that purpose. Reviewed-by: jcoomes, mchung, stefank
author ysr
date Wed, 07 Sep 2011 13:55:42 -0700
parents c2bf0120ee5d
children 4dfb2df418f2
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
2369
92da084fefc9 6668573: CMS: reference processing crash if ParallelCMSThreads > ParallelGCThreads
ysr
parents: 1995
diff changeset
2 * Copyright (c) 2001, 2011, Oracle and/or its affiliates. All rights reserved.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
a61af66fc99e Initial load
duke
parents:
diff changeset
4 *
a61af66fc99e Initial load
duke
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
a61af66fc99e Initial load
duke
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
a61af66fc99e Initial load
duke
parents:
diff changeset
7 * published by the Free Software Foundation.
a61af66fc99e Initial load
duke
parents:
diff changeset
8 *
a61af66fc99e Initial load
duke
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
a61af66fc99e Initial load
duke
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
a61af66fc99e Initial load
duke
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
a61af66fc99e Initial load
duke
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
a61af66fc99e Initial load
duke
parents:
diff changeset
13 * accompanied this code).
a61af66fc99e Initial load
duke
parents:
diff changeset
14 *
a61af66fc99e Initial load
duke
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
a61af66fc99e Initial load
duke
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
a61af66fc99e Initial load
duke
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
a61af66fc99e Initial load
duke
parents:
diff changeset
18 *
1552
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1244
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1244
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: 1244
diff changeset
21 * questions.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
22 *
a61af66fc99e Initial load
duke
parents:
diff changeset
23 */
a61af66fc99e Initial load
duke
parents:
diff changeset
24
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1843
diff changeset
25 #ifndef SHARE_VM_MEMORY_REFERENCEPROCESSOR_HPP
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1843
diff changeset
26 #define SHARE_VM_MEMORY_REFERENCEPROCESSOR_HPP
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1843
diff changeset
27
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1843
diff changeset
28 #include "memory/referencePolicy.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1843
diff changeset
29 #include "oops/instanceRefKlass.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1843
diff changeset
30
0
a61af66fc99e Initial load
duke
parents:
diff changeset
31 // ReferenceProcessor class encapsulates the per-"collector" processing
453
c96030fff130 6684579: SoftReference processing can be made more efficient
ysr
parents: 356
diff changeset
32 // of java.lang.Reference objects for GC. The interface is useful for supporting
0
a61af66fc99e Initial load
duke
parents:
diff changeset
33 // a generational abstraction, in particular when there are multiple
a61af66fc99e Initial load
duke
parents:
diff changeset
34 // generations that are being independently collected -- possibly
a61af66fc99e Initial load
duke
parents:
diff changeset
35 // concurrently and/or incrementally. Note, however, that the
a61af66fc99e Initial load
duke
parents:
diff changeset
36 // ReferenceProcessor class abstracts away from a generational setting
a61af66fc99e Initial load
duke
parents:
diff changeset
37 // by using only a heap interval (called "span" below), thus allowing
a61af66fc99e Initial load
duke
parents:
diff changeset
38 // its use in a straightforward manner in a general, non-generational
a61af66fc99e Initial load
duke
parents:
diff changeset
39 // setting.
a61af66fc99e Initial load
duke
parents:
diff changeset
40 //
a61af66fc99e Initial load
duke
parents:
diff changeset
41 // The basic idea is that each ReferenceProcessor object concerns
a61af66fc99e Initial load
duke
parents:
diff changeset
42 // itself with ("weak") reference processing in a specific "span"
a61af66fc99e Initial load
duke
parents:
diff changeset
43 // of the heap of interest to a specific collector. Currently,
a61af66fc99e Initial load
duke
parents:
diff changeset
44 // the span is a convex interval of the heap, but, efficiency
a61af66fc99e Initial load
duke
parents:
diff changeset
45 // apart, there seems to be no reason it couldn't be extended
a61af66fc99e Initial load
duke
parents:
diff changeset
46 // (with appropriate modifications) to any "non-convex interval".
a61af66fc99e Initial load
duke
parents:
diff changeset
47
a61af66fc99e Initial load
duke
parents:
diff changeset
48 // forward references
a61af66fc99e Initial load
duke
parents:
diff changeset
49 class ReferencePolicy;
a61af66fc99e Initial load
duke
parents:
diff changeset
50 class AbstractRefProcTaskExecutor;
a61af66fc99e Initial load
duke
parents:
diff changeset
51 class DiscoveredList;
a61af66fc99e Initial load
duke
parents:
diff changeset
52
a61af66fc99e Initial load
duke
parents:
diff changeset
53 class ReferenceProcessor : public CHeapObj {
a61af66fc99e Initial load
duke
parents:
diff changeset
54 protected:
3917
eca1193ca245 4965777: GC changes to support use of discovered field for pending references
ysr
parents: 3915
diff changeset
55 // Compatibility with pre-4965777 JDK's
eca1193ca245 4965777: GC changes to support use of discovered field for pending references
ysr
parents: 3915
diff changeset
56 static bool _pending_list_uses_discovered_field;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
57 MemRegion _span; // (right-open) interval of heap
a61af66fc99e Initial load
duke
parents:
diff changeset
58 // subject to wkref discovery
a61af66fc99e Initial load
duke
parents:
diff changeset
59 bool _discovering_refs; // true when discovery enabled
a61af66fc99e Initial load
duke
parents:
diff changeset
60 bool _discovery_is_atomic; // if discovery is atomic wrt
a61af66fc99e Initial load
duke
parents:
diff changeset
61 // other collectors in configuration
a61af66fc99e Initial load
duke
parents:
diff changeset
62 bool _discovery_is_mt; // true if reference discovery is MT.
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
63 // If true, setting "next" field of a discovered refs list requires
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
64 // write barrier(s). (Must be true if used in a collector in which
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
65 // elements of a discovered list may be moved during discovery: for
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
66 // example, a collector like Garbage-First that moves objects during a
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
67 // long-term concurrent marking phase that does weak reference
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
68 // discovery.)
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
69 bool _discovered_list_needs_barrier;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
70 BarrierSet* _bs; // Cached copy of BarrierSet.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
71 bool _enqueuing_is_done; // true if all weak references enqueued
a61af66fc99e Initial load
duke
parents:
diff changeset
72 bool _processing_is_mt; // true during phases when
a61af66fc99e Initial load
duke
parents:
diff changeset
73 // reference processing is MT.
2369
92da084fefc9 6668573: CMS: reference processing crash if ParallelCMSThreads > ParallelGCThreads
ysr
parents: 1995
diff changeset
74 int _next_id; // round-robin mod _num_q counter in
0
a61af66fc99e Initial load
duke
parents:
diff changeset
75 // support of work distribution
a61af66fc99e Initial load
duke
parents:
diff changeset
76
a61af66fc99e Initial load
duke
parents:
diff changeset
77 // For collectors that do not keep GC marking information
a61af66fc99e Initial load
duke
parents:
diff changeset
78 // in the object header, this field holds a closure that
a61af66fc99e Initial load
duke
parents:
diff changeset
79 // helps the reference processor determine the reachability
a61af66fc99e Initial load
duke
parents:
diff changeset
80 // of an oop (the field is currently initialized to NULL for
a61af66fc99e Initial load
duke
parents:
diff changeset
81 // all collectors but the CMS collector).
a61af66fc99e Initial load
duke
parents:
diff changeset
82 BoolObjectClosure* _is_alive_non_header;
a61af66fc99e Initial load
duke
parents:
diff changeset
83
453
c96030fff130 6684579: SoftReference processing can be made more efficient
ysr
parents: 356
diff changeset
84 // Soft ref clearing policies
c96030fff130 6684579: SoftReference processing can be made more efficient
ysr
parents: 356
diff changeset
85 // . the default policy
c96030fff130 6684579: SoftReference processing can be made more efficient
ysr
parents: 356
diff changeset
86 static ReferencePolicy* _default_soft_ref_policy;
c96030fff130 6684579: SoftReference processing can be made more efficient
ysr
parents: 356
diff changeset
87 // . the "clear all" policy
c96030fff130 6684579: SoftReference processing can be made more efficient
ysr
parents: 356
diff changeset
88 static ReferencePolicy* _always_clear_soft_ref_policy;
c96030fff130 6684579: SoftReference processing can be made more efficient
ysr
parents: 356
diff changeset
89 // . the current policy below is either one of the above
c96030fff130 6684579: SoftReference processing can be made more efficient
ysr
parents: 356
diff changeset
90 ReferencePolicy* _current_soft_ref_policy;
c96030fff130 6684579: SoftReference processing can be made more efficient
ysr
parents: 356
diff changeset
91
0
a61af66fc99e Initial load
duke
parents:
diff changeset
92 // The discovered ref lists themselves
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
93
1833
8b10f48633dc 6984287: Regularize how GC parallel workers are specified.
jmasa
parents: 1552
diff changeset
94 // The active MT'ness degree of the queues below
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
95 int _num_q;
1833
8b10f48633dc 6984287: Regularize how GC parallel workers are specified.
jmasa
parents: 1552
diff changeset
96 // The maximum MT'ness degree of the queues below
8b10f48633dc 6984287: Regularize how GC parallel workers are specified.
jmasa
parents: 1552
diff changeset
97 int _max_num_q;
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
98 // Arrays of lists of oops, one per thread
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
99 DiscoveredList* _discoveredSoftRefs;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
100 DiscoveredList* _discoveredWeakRefs;
a61af66fc99e Initial load
duke
parents:
diff changeset
101 DiscoveredList* _discoveredFinalRefs;
a61af66fc99e Initial load
duke
parents:
diff changeset
102 DiscoveredList* _discoveredPhantomRefs;
a61af66fc99e Initial load
duke
parents:
diff changeset
103
a61af66fc99e Initial load
duke
parents:
diff changeset
104 public:
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
105 int num_q() { return _num_q; }
2369
92da084fefc9 6668573: CMS: reference processing crash if ParallelCMSThreads > ParallelGCThreads
ysr
parents: 1995
diff changeset
106 int max_num_q() { return _max_num_q; }
92da084fefc9 6668573: CMS: reference processing crash if ParallelCMSThreads > ParallelGCThreads
ysr
parents: 1995
diff changeset
107 void set_active_mt_degree(int v) { _num_q = v; }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
108 DiscoveredList* discovered_soft_refs() { return _discoveredSoftRefs; }
457
27a80744a83b 6778647: snap(), snap_policy() should be renamed setup(), setup_policy()
ysr
parents: 453
diff changeset
109 ReferencePolicy* setup_policy(bool always_clear) {
453
c96030fff130 6684579: SoftReference processing can be made more efficient
ysr
parents: 356
diff changeset
110 _current_soft_ref_policy = always_clear ?
c96030fff130 6684579: SoftReference processing can be made more efficient
ysr
parents: 356
diff changeset
111 _always_clear_soft_ref_policy : _default_soft_ref_policy;
457
27a80744a83b 6778647: snap(), snap_policy() should be renamed setup(), setup_policy()
ysr
parents: 453
diff changeset
112 _current_soft_ref_policy->setup(); // snapshot the policy threshold
453
c96030fff130 6684579: SoftReference processing can be made more efficient
ysr
parents: 356
diff changeset
113 return _current_soft_ref_policy;
c96030fff130 6684579: SoftReference processing can be made more efficient
ysr
parents: 356
diff changeset
114 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
115
a61af66fc99e Initial load
duke
parents:
diff changeset
116 // Process references with a certain reachability level.
a61af66fc99e Initial load
duke
parents:
diff changeset
117 void process_discovered_reflist(DiscoveredList refs_lists[],
a61af66fc99e Initial load
duke
parents:
diff changeset
118 ReferencePolicy* policy,
a61af66fc99e Initial load
duke
parents:
diff changeset
119 bool clear_referent,
a61af66fc99e Initial load
duke
parents:
diff changeset
120 BoolObjectClosure* is_alive,
a61af66fc99e Initial load
duke
parents:
diff changeset
121 OopClosure* keep_alive,
a61af66fc99e Initial load
duke
parents:
diff changeset
122 VoidClosure* complete_gc,
a61af66fc99e Initial load
duke
parents:
diff changeset
123 AbstractRefProcTaskExecutor* task_executor);
a61af66fc99e Initial load
duke
parents:
diff changeset
124
a61af66fc99e Initial load
duke
parents:
diff changeset
125 void process_phaseJNI(BoolObjectClosure* is_alive,
a61af66fc99e Initial load
duke
parents:
diff changeset
126 OopClosure* keep_alive,
a61af66fc99e Initial load
duke
parents:
diff changeset
127 VoidClosure* complete_gc);
a61af66fc99e Initial load
duke
parents:
diff changeset
128
a61af66fc99e Initial load
duke
parents:
diff changeset
129 // Work methods used by the method process_discovered_reflist
a61af66fc99e Initial load
duke
parents:
diff changeset
130 // Phase1: keep alive all those referents that are otherwise
a61af66fc99e Initial load
duke
parents:
diff changeset
131 // dead but which must be kept alive by policy (and their closure).
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
132 void process_phase1(DiscoveredList& refs_list,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
133 ReferencePolicy* policy,
a61af66fc99e Initial load
duke
parents:
diff changeset
134 BoolObjectClosure* is_alive,
a61af66fc99e Initial load
duke
parents:
diff changeset
135 OopClosure* keep_alive,
a61af66fc99e Initial load
duke
parents:
diff changeset
136 VoidClosure* complete_gc);
a61af66fc99e Initial load
duke
parents:
diff changeset
137 // Phase2: remove all those references whose referents are
a61af66fc99e Initial load
duke
parents:
diff changeset
138 // reachable.
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
139 inline void process_phase2(DiscoveredList& refs_list,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
140 BoolObjectClosure* is_alive,
a61af66fc99e Initial load
duke
parents:
diff changeset
141 OopClosure* keep_alive,
a61af66fc99e Initial load
duke
parents:
diff changeset
142 VoidClosure* complete_gc) {
a61af66fc99e Initial load
duke
parents:
diff changeset
143 if (discovery_is_atomic()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
144 // complete_gc is ignored in this case for this phase
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
145 pp2_work(refs_list, is_alive, keep_alive);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
146 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
147 assert(complete_gc != NULL, "Error");
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
148 pp2_work_concurrent_discovery(refs_list, is_alive,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
149 keep_alive, complete_gc);
a61af66fc99e Initial load
duke
parents:
diff changeset
150 }
a61af66fc99e Initial load
duke
parents:
diff changeset
151 }
a61af66fc99e Initial load
duke
parents:
diff changeset
152 // Work methods in support of process_phase2
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
153 void pp2_work(DiscoveredList& refs_list,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
154 BoolObjectClosure* is_alive,
a61af66fc99e Initial load
duke
parents:
diff changeset
155 OopClosure* keep_alive);
a61af66fc99e Initial load
duke
parents:
diff changeset
156 void pp2_work_concurrent_discovery(
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
157 DiscoveredList& refs_list,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
158 BoolObjectClosure* is_alive,
a61af66fc99e Initial load
duke
parents:
diff changeset
159 OopClosure* keep_alive,
a61af66fc99e Initial load
duke
parents:
diff changeset
160 VoidClosure* complete_gc);
a61af66fc99e Initial load
duke
parents:
diff changeset
161 // Phase3: process the referents by either clearing them
a61af66fc99e Initial load
duke
parents:
diff changeset
162 // or keeping them alive (and their closure)
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
163 void process_phase3(DiscoveredList& refs_list,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
164 bool clear_referent,
a61af66fc99e Initial load
duke
parents:
diff changeset
165 BoolObjectClosure* is_alive,
a61af66fc99e Initial load
duke
parents:
diff changeset
166 OopClosure* keep_alive,
a61af66fc99e Initial load
duke
parents:
diff changeset
167 VoidClosure* complete_gc);
a61af66fc99e Initial load
duke
parents:
diff changeset
168
a61af66fc99e Initial load
duke
parents:
diff changeset
169 // Enqueue references with a certain reachability level
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
170 void enqueue_discovered_reflist(DiscoveredList& refs_list, HeapWord* pending_list_addr);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
171
a61af66fc99e Initial load
duke
parents:
diff changeset
172 // "Preclean" all the discovered reference lists
a61af66fc99e Initial load
duke
parents:
diff changeset
173 // by removing references with strongly reachable referents.
a61af66fc99e Initial load
duke
parents:
diff changeset
174 // The first argument is a predicate on an oop that indicates
a61af66fc99e Initial load
duke
parents:
diff changeset
175 // its (strong) reachability and the second is a closure that
a61af66fc99e Initial load
duke
parents:
diff changeset
176 // may be used to incrementalize or abort the precleaning process.
a61af66fc99e Initial load
duke
parents:
diff changeset
177 // The caller is responsible for taking care of potential
a61af66fc99e Initial load
duke
parents:
diff changeset
178 // interference with concurrent operations on these lists
a61af66fc99e Initial load
duke
parents:
diff changeset
179 // (or predicates involved) by other threads. Currently
1190
4788266644c1 6895236: CMS: cmsOopClosures.inline.hpp:43 assert(..., "Should remember klasses in this context")
jmasa
parents: 457
diff changeset
180 // only used by the CMS collector. should_unload_classes is
4788266644c1 6895236: CMS: cmsOopClosures.inline.hpp:43 assert(..., "Should remember klasses in this context")
jmasa
parents: 457
diff changeset
181 // used to aid assertion checking when classes are collected.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
182 void preclean_discovered_references(BoolObjectClosure* is_alive,
a61af66fc99e Initial load
duke
parents:
diff changeset
183 OopClosure* keep_alive,
a61af66fc99e Initial load
duke
parents:
diff changeset
184 VoidClosure* complete_gc,
1190
4788266644c1 6895236: CMS: cmsOopClosures.inline.hpp:43 assert(..., "Should remember klasses in this context")
jmasa
parents: 457
diff changeset
185 YieldClosure* yield,
4788266644c1 6895236: CMS: cmsOopClosures.inline.hpp:43 assert(..., "Should remember klasses in this context")
jmasa
parents: 457
diff changeset
186 bool should_unload_classes);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
187
a61af66fc99e Initial load
duke
parents:
diff changeset
188 // Delete entries in the discovered lists that have
a61af66fc99e Initial load
duke
parents:
diff changeset
189 // either a null referent or are not active. Such
a61af66fc99e Initial load
duke
parents:
diff changeset
190 // Reference objects can result from the clearing
a61af66fc99e Initial load
duke
parents:
diff changeset
191 // or enqueueing of Reference objects concurrent
a61af66fc99e Initial load
duke
parents:
diff changeset
192 // with their discovery by a (concurrent) collector.
a61af66fc99e Initial load
duke
parents:
diff changeset
193 // For a definition of "active" see java.lang.ref.Reference;
a61af66fc99e Initial load
duke
parents:
diff changeset
194 // Refs are born active, become inactive when enqueued,
a61af66fc99e Initial load
duke
parents:
diff changeset
195 // and never become active again. The state of being
a61af66fc99e Initial load
duke
parents:
diff changeset
196 // active is encoded as follows: A Ref is active
a61af66fc99e Initial load
duke
parents:
diff changeset
197 // if and only if its "next" field is NULL.
a61af66fc99e Initial load
duke
parents:
diff changeset
198 void clean_up_discovered_references();
a61af66fc99e Initial load
duke
parents:
diff changeset
199 void clean_up_discovered_reflist(DiscoveredList& refs_list);
a61af66fc99e Initial load
duke
parents:
diff changeset
200
a61af66fc99e Initial load
duke
parents:
diff changeset
201 // Returns the name of the discovered reference list
a61af66fc99e Initial load
duke
parents:
diff changeset
202 // occupying the i / _num_q slot.
a61af66fc99e Initial load
duke
parents:
diff changeset
203 const char* list_name(int i);
a61af66fc99e Initial load
duke
parents:
diff changeset
204
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
205 void enqueue_discovered_reflists(HeapWord* pending_list_addr, AbstractRefProcTaskExecutor* task_executor);
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
206
0
a61af66fc99e Initial load
duke
parents:
diff changeset
207 protected:
a61af66fc99e Initial load
duke
parents:
diff changeset
208 // "Preclean" the given discovered reference list
a61af66fc99e Initial load
duke
parents:
diff changeset
209 // by removing references with strongly reachable referents.
a61af66fc99e Initial load
duke
parents:
diff changeset
210 // Currently used in support of CMS only.
a61af66fc99e Initial load
duke
parents:
diff changeset
211 void preclean_discovered_reflist(DiscoveredList& refs_list,
a61af66fc99e Initial load
duke
parents:
diff changeset
212 BoolObjectClosure* is_alive,
a61af66fc99e Initial load
duke
parents:
diff changeset
213 OopClosure* keep_alive,
a61af66fc99e Initial load
duke
parents:
diff changeset
214 VoidClosure* complete_gc,
a61af66fc99e Initial load
duke
parents:
diff changeset
215 YieldClosure* yield);
a61af66fc99e Initial load
duke
parents:
diff changeset
216
2369
92da084fefc9 6668573: CMS: reference processing crash if ParallelCMSThreads > ParallelGCThreads
ysr
parents: 1995
diff changeset
217 // round-robin mod _num_q (not: _not_ mode _max_num_q)
0
a61af66fc99e Initial load
duke
parents:
diff changeset
218 int next_id() {
a61af66fc99e Initial load
duke
parents:
diff changeset
219 int id = _next_id;
a61af66fc99e Initial load
duke
parents:
diff changeset
220 if (++_next_id == _num_q) {
a61af66fc99e Initial load
duke
parents:
diff changeset
221 _next_id = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
222 }
a61af66fc99e Initial load
duke
parents:
diff changeset
223 return id;
a61af66fc99e Initial load
duke
parents:
diff changeset
224 }
a61af66fc99e Initial load
duke
parents:
diff changeset
225 DiscoveredList* get_discovered_list(ReferenceType rt);
a61af66fc99e Initial load
duke
parents:
diff changeset
226 inline void add_to_discovered_list_mt(DiscoveredList& refs_list, oop obj,
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
227 HeapWord* discovered_addr);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
228 void verify_ok_to_handle_reflists() PRODUCT_RETURN;
a61af66fc99e Initial load
duke
parents:
diff changeset
229
3915
c2bf0120ee5d 7085906: Replace the permgen allocated sentinelRef with a self-looped end
stefank
parents: 2369
diff changeset
230 void clear_discovered_references(DiscoveredList& refs_list);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
231 void abandon_partial_discovered_list(DiscoveredList& refs_list);
a61af66fc99e Initial load
duke
parents:
diff changeset
232
a61af66fc99e Initial load
duke
parents:
diff changeset
233 // Calculate the number of jni handles.
a61af66fc99e Initial load
duke
parents:
diff changeset
234 unsigned int count_jni_refs();
a61af66fc99e Initial load
duke
parents:
diff changeset
235
a61af66fc99e Initial load
duke
parents:
diff changeset
236 // Balances reference queues.
a61af66fc99e Initial load
duke
parents:
diff changeset
237 void balance_queues(DiscoveredList ref_lists[]);
a61af66fc99e Initial load
duke
parents:
diff changeset
238
a61af66fc99e Initial load
duke
parents:
diff changeset
239 // Update (advance) the soft ref master clock field.
a61af66fc99e Initial load
duke
parents:
diff changeset
240 void update_soft_ref_master_clock();
a61af66fc99e Initial load
duke
parents:
diff changeset
241
a61af66fc99e Initial load
duke
parents:
diff changeset
242 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
243 // constructor
a61af66fc99e Initial load
duke
parents:
diff changeset
244 ReferenceProcessor():
a61af66fc99e Initial load
duke
parents:
diff changeset
245 _span((HeapWord*)NULL, (HeapWord*)NULL),
a61af66fc99e Initial load
duke
parents:
diff changeset
246 _discoveredSoftRefs(NULL), _discoveredWeakRefs(NULL),
a61af66fc99e Initial load
duke
parents:
diff changeset
247 _discoveredFinalRefs(NULL), _discoveredPhantomRefs(NULL),
a61af66fc99e Initial load
duke
parents:
diff changeset
248 _discovering_refs(false),
a61af66fc99e Initial load
duke
parents:
diff changeset
249 _discovery_is_atomic(true),
a61af66fc99e Initial load
duke
parents:
diff changeset
250 _enqueuing_is_done(false),
a61af66fc99e Initial load
duke
parents:
diff changeset
251 _discovery_is_mt(false),
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
252 _discovered_list_needs_barrier(false),
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
253 _bs(NULL),
0
a61af66fc99e Initial load
duke
parents:
diff changeset
254 _is_alive_non_header(NULL),
a61af66fc99e Initial load
duke
parents:
diff changeset
255 _num_q(0),
1833
8b10f48633dc 6984287: Regularize how GC parallel workers are specified.
jmasa
parents: 1552
diff changeset
256 _max_num_q(0),
0
a61af66fc99e Initial load
duke
parents:
diff changeset
257 _processing_is_mt(false),
a61af66fc99e Initial load
duke
parents:
diff changeset
258 _next_id(0)
2369
92da084fefc9 6668573: CMS: reference processing crash if ParallelCMSThreads > ParallelGCThreads
ysr
parents: 1995
diff changeset
259 { }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
260
2369
92da084fefc9 6668573: CMS: reference processing crash if ParallelCMSThreads > ParallelGCThreads
ysr
parents: 1995
diff changeset
261 // Default parameters give you a vanilla reference processor.
92da084fefc9 6668573: CMS: reference processing crash if ParallelCMSThreads > ParallelGCThreads
ysr
parents: 1995
diff changeset
262 ReferenceProcessor(MemRegion span,
92da084fefc9 6668573: CMS: reference processing crash if ParallelCMSThreads > ParallelGCThreads
ysr
parents: 1995
diff changeset
263 bool mt_processing = false, int mt_processing_degree = 1,
92da084fefc9 6668573: CMS: reference processing crash if ParallelCMSThreads > ParallelGCThreads
ysr
parents: 1995
diff changeset
264 bool mt_discovery = false, int mt_discovery_degree = 1,
92da084fefc9 6668573: CMS: reference processing crash if ParallelCMSThreads > ParallelGCThreads
ysr
parents: 1995
diff changeset
265 bool atomic_discovery = true,
92da084fefc9 6668573: CMS: reference processing crash if ParallelCMSThreads > ParallelGCThreads
ysr
parents: 1995
diff changeset
266 BoolObjectClosure* is_alive_non_header = NULL,
92da084fefc9 6668573: CMS: reference processing crash if ParallelCMSThreads > ParallelGCThreads
ysr
parents: 1995
diff changeset
267 bool discovered_list_needs_barrier = false);
1244
745c853ee57f 6885297: java -XX:RefDiscoveryPolicy=2 or -XX:TLABWasteTargetPercent=0 cause VM crash
johnc
parents: 1190
diff changeset
268
0
a61af66fc99e Initial load
duke
parents:
diff changeset
269 // RefDiscoveryPolicy values
1244
745c853ee57f 6885297: java -XX:RefDiscoveryPolicy=2 or -XX:TLABWasteTargetPercent=0 cause VM crash
johnc
parents: 1190
diff changeset
270 enum DiscoveryPolicy {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
271 ReferenceBasedDiscovery = 0,
1244
745c853ee57f 6885297: java -XX:RefDiscoveryPolicy=2 or -XX:TLABWasteTargetPercent=0 cause VM crash
johnc
parents: 1190
diff changeset
272 ReferentBasedDiscovery = 1,
745c853ee57f 6885297: java -XX:RefDiscoveryPolicy=2 or -XX:TLABWasteTargetPercent=0 cause VM crash
johnc
parents: 1190
diff changeset
273 DiscoveryPolicyMin = ReferenceBasedDiscovery,
745c853ee57f 6885297: java -XX:RefDiscoveryPolicy=2 or -XX:TLABWasteTargetPercent=0 cause VM crash
johnc
parents: 1190
diff changeset
274 DiscoveryPolicyMax = ReferentBasedDiscovery
0
a61af66fc99e Initial load
duke
parents:
diff changeset
275 };
a61af66fc99e Initial load
duke
parents:
diff changeset
276
a61af66fc99e Initial load
duke
parents:
diff changeset
277 static void init_statics();
a61af66fc99e Initial load
duke
parents:
diff changeset
278
a61af66fc99e Initial load
duke
parents:
diff changeset
279 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
280 // get and set "is_alive_non_header" field
a61af66fc99e Initial load
duke
parents:
diff changeset
281 BoolObjectClosure* is_alive_non_header() {
a61af66fc99e Initial load
duke
parents:
diff changeset
282 return _is_alive_non_header;
a61af66fc99e Initial load
duke
parents:
diff changeset
283 }
a61af66fc99e Initial load
duke
parents:
diff changeset
284 void set_is_alive_non_header(BoolObjectClosure* is_alive_non_header) {
a61af66fc99e Initial load
duke
parents:
diff changeset
285 _is_alive_non_header = is_alive_non_header;
a61af66fc99e Initial load
duke
parents:
diff changeset
286 }
a61af66fc99e Initial load
duke
parents:
diff changeset
287
a61af66fc99e Initial load
duke
parents:
diff changeset
288 // get and set span
a61af66fc99e Initial load
duke
parents:
diff changeset
289 MemRegion span() { return _span; }
a61af66fc99e Initial load
duke
parents:
diff changeset
290 void set_span(MemRegion span) { _span = span; }
a61af66fc99e Initial load
duke
parents:
diff changeset
291
a61af66fc99e Initial load
duke
parents:
diff changeset
292 // start and stop weak ref discovery
a61af66fc99e Initial load
duke
parents:
diff changeset
293 void enable_discovery() { _discovering_refs = true; }
a61af66fc99e Initial load
duke
parents:
diff changeset
294 void disable_discovery() { _discovering_refs = false; }
a61af66fc99e Initial load
duke
parents:
diff changeset
295 bool discovery_enabled() { return _discovering_refs; }
a61af66fc99e Initial load
duke
parents:
diff changeset
296
a61af66fc99e Initial load
duke
parents:
diff changeset
297 // whether discovery is atomic wrt other collectors
a61af66fc99e Initial load
duke
parents:
diff changeset
298 bool discovery_is_atomic() const { return _discovery_is_atomic; }
a61af66fc99e Initial load
duke
parents:
diff changeset
299 void set_atomic_discovery(bool atomic) { _discovery_is_atomic = atomic; }
a61af66fc99e Initial load
duke
parents:
diff changeset
300
3917
eca1193ca245 4965777: GC changes to support use of discovered field for pending references
ysr
parents: 3915
diff changeset
301 // whether the JDK in which we are embedded is a pre-4965777 JDK,
eca1193ca245 4965777: GC changes to support use of discovered field for pending references
ysr
parents: 3915
diff changeset
302 // and thus whether or not it uses the discovered field to chain
eca1193ca245 4965777: GC changes to support use of discovered field for pending references
ysr
parents: 3915
diff changeset
303 // the entries in the pending list.
eca1193ca245 4965777: GC changes to support use of discovered field for pending references
ysr
parents: 3915
diff changeset
304 static bool pending_list_uses_discovered_field() {
eca1193ca245 4965777: GC changes to support use of discovered field for pending references
ysr
parents: 3915
diff changeset
305 return _pending_list_uses_discovered_field;
eca1193ca245 4965777: GC changes to support use of discovered field for pending references
ysr
parents: 3915
diff changeset
306 }
eca1193ca245 4965777: GC changes to support use of discovered field for pending references
ysr
parents: 3915
diff changeset
307
0
a61af66fc99e Initial load
duke
parents:
diff changeset
308 // whether discovery is done by multiple threads same-old-timeously
a61af66fc99e Initial load
duke
parents:
diff changeset
309 bool discovery_is_mt() const { return _discovery_is_mt; }
a61af66fc99e Initial load
duke
parents:
diff changeset
310 void set_mt_discovery(bool mt) { _discovery_is_mt = mt; }
a61af66fc99e Initial load
duke
parents:
diff changeset
311
a61af66fc99e Initial load
duke
parents:
diff changeset
312 // Whether we are in a phase when _processing_ is MT.
a61af66fc99e Initial load
duke
parents:
diff changeset
313 bool processing_is_mt() const { return _processing_is_mt; }
a61af66fc99e Initial load
duke
parents:
diff changeset
314 void set_mt_processing(bool mt) { _processing_is_mt = mt; }
a61af66fc99e Initial load
duke
parents:
diff changeset
315
a61af66fc99e Initial load
duke
parents:
diff changeset
316 // whether all enqueuing of weak references is complete
a61af66fc99e Initial load
duke
parents:
diff changeset
317 bool enqueuing_is_done() { return _enqueuing_is_done; }
a61af66fc99e Initial load
duke
parents:
diff changeset
318 void set_enqueuing_is_done(bool v) { _enqueuing_is_done = v; }
a61af66fc99e Initial load
duke
parents:
diff changeset
319
a61af66fc99e Initial load
duke
parents:
diff changeset
320 // iterate over oops
a61af66fc99e Initial load
duke
parents:
diff changeset
321 void weak_oops_do(OopClosure* f); // weak roots
a61af66fc99e Initial load
duke
parents:
diff changeset
322
1833
8b10f48633dc 6984287: Regularize how GC parallel workers are specified.
jmasa
parents: 1552
diff changeset
323 // Balance each of the discovered lists.
8b10f48633dc 6984287: Regularize how GC parallel workers are specified.
jmasa
parents: 1552
diff changeset
324 void balance_all_queues();
8b10f48633dc 6984287: Regularize how GC parallel workers are specified.
jmasa
parents: 1552
diff changeset
325
0
a61af66fc99e Initial load
duke
parents:
diff changeset
326 // Discover a Reference object, using appropriate discovery criteria
a61af66fc99e Initial load
duke
parents:
diff changeset
327 bool discover_reference(oop obj, ReferenceType rt);
a61af66fc99e Initial load
duke
parents:
diff changeset
328
a61af66fc99e Initial load
duke
parents:
diff changeset
329 // Process references found during GC (called by the garbage collector)
453
c96030fff130 6684579: SoftReference processing can be made more efficient
ysr
parents: 356
diff changeset
330 void process_discovered_references(BoolObjectClosure* is_alive,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
331 OopClosure* keep_alive,
a61af66fc99e Initial load
duke
parents:
diff changeset
332 VoidClosure* complete_gc,
a61af66fc99e Initial load
duke
parents:
diff changeset
333 AbstractRefProcTaskExecutor* task_executor);
a61af66fc99e Initial load
duke
parents:
diff changeset
334
a61af66fc99e Initial load
duke
parents:
diff changeset
335 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
336 // Enqueue references at end of GC (called by the garbage collector)
a61af66fc99e Initial load
duke
parents:
diff changeset
337 bool enqueue_discovered_references(AbstractRefProcTaskExecutor* task_executor = NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
338
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
339 // If a discovery is in process that is being superceded, abandon it: all
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
340 // the discovered lists will be empty, and all the objects on them will
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
341 // have NULL discovered fields. Must be called only at a safepoint.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
342 void abandon_partial_discovery();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
343
0
a61af66fc99e Initial load
duke
parents:
diff changeset
344 // debugging
a61af66fc99e Initial load
duke
parents:
diff changeset
345 void verify_no_references_recorded() PRODUCT_RETURN;
1995
8df09fb45352 7005259: CMS: BubbleUpRef asserts referent(obj)->is_oop() failed: Enqueued a bad referent
ysr
parents: 1972
diff changeset
346 void verify_referent(oop obj) PRODUCT_RETURN;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
347
a61af66fc99e Initial load
duke
parents:
diff changeset
348 // clear the discovered lists (unlinking each entry).
a61af66fc99e Initial load
duke
parents:
diff changeset
349 void clear_discovered_references() PRODUCT_RETURN;
a61af66fc99e Initial load
duke
parents:
diff changeset
350 };
a61af66fc99e Initial load
duke
parents:
diff changeset
351
a61af66fc99e Initial load
duke
parents:
diff changeset
352 // A utility class to disable reference discovery in
a61af66fc99e Initial load
duke
parents:
diff changeset
353 // the scope which contains it, for given ReferenceProcessor.
a61af66fc99e Initial load
duke
parents:
diff changeset
354 class NoRefDiscovery: StackObj {
a61af66fc99e Initial load
duke
parents:
diff changeset
355 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
356 ReferenceProcessor* _rp;
a61af66fc99e Initial load
duke
parents:
diff changeset
357 bool _was_discovering_refs;
a61af66fc99e Initial load
duke
parents:
diff changeset
358 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
359 NoRefDiscovery(ReferenceProcessor* rp) : _rp(rp) {
1789
a83b0246bb77 6934483: GCC 4.5 errors "suggest parentheses around something..." when compiling with -Werror and -Wall
twisti
parents: 1552
diff changeset
360 _was_discovering_refs = _rp->discovery_enabled();
a83b0246bb77 6934483: GCC 4.5 errors "suggest parentheses around something..." when compiling with -Werror and -Wall
twisti
parents: 1552
diff changeset
361 if (_was_discovering_refs) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
362 _rp->disable_discovery();
a61af66fc99e Initial load
duke
parents:
diff changeset
363 }
a61af66fc99e Initial load
duke
parents:
diff changeset
364 }
a61af66fc99e Initial load
duke
parents:
diff changeset
365
a61af66fc99e Initial load
duke
parents:
diff changeset
366 ~NoRefDiscovery() {
a61af66fc99e Initial load
duke
parents:
diff changeset
367 if (_was_discovering_refs) {
a61af66fc99e Initial load
duke
parents:
diff changeset
368 _rp->enable_discovery();
a61af66fc99e Initial load
duke
parents:
diff changeset
369 }
a61af66fc99e Initial load
duke
parents:
diff changeset
370 }
a61af66fc99e Initial load
duke
parents:
diff changeset
371 };
a61af66fc99e Initial load
duke
parents:
diff changeset
372
a61af66fc99e Initial load
duke
parents:
diff changeset
373
a61af66fc99e Initial load
duke
parents:
diff changeset
374 // A utility class to temporarily mutate the span of the
a61af66fc99e Initial load
duke
parents:
diff changeset
375 // given ReferenceProcessor in the scope that contains it.
a61af66fc99e Initial load
duke
parents:
diff changeset
376 class ReferenceProcessorSpanMutator: StackObj {
a61af66fc99e Initial load
duke
parents:
diff changeset
377 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
378 ReferenceProcessor* _rp;
a61af66fc99e Initial load
duke
parents:
diff changeset
379 MemRegion _saved_span;
a61af66fc99e Initial load
duke
parents:
diff changeset
380
a61af66fc99e Initial load
duke
parents:
diff changeset
381 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
382 ReferenceProcessorSpanMutator(ReferenceProcessor* rp,
a61af66fc99e Initial load
duke
parents:
diff changeset
383 MemRegion span):
a61af66fc99e Initial load
duke
parents:
diff changeset
384 _rp(rp) {
a61af66fc99e Initial load
duke
parents:
diff changeset
385 _saved_span = _rp->span();
a61af66fc99e Initial load
duke
parents:
diff changeset
386 _rp->set_span(span);
a61af66fc99e Initial load
duke
parents:
diff changeset
387 }
a61af66fc99e Initial load
duke
parents:
diff changeset
388
a61af66fc99e Initial load
duke
parents:
diff changeset
389 ~ReferenceProcessorSpanMutator() {
a61af66fc99e Initial load
duke
parents:
diff changeset
390 _rp->set_span(_saved_span);
a61af66fc99e Initial load
duke
parents:
diff changeset
391 }
a61af66fc99e Initial load
duke
parents:
diff changeset
392 };
a61af66fc99e Initial load
duke
parents:
diff changeset
393
a61af66fc99e Initial load
duke
parents:
diff changeset
394 // A utility class to temporarily change the MT'ness of
a61af66fc99e Initial load
duke
parents:
diff changeset
395 // reference discovery for the given ReferenceProcessor
a61af66fc99e Initial load
duke
parents:
diff changeset
396 // in the scope that contains it.
2369
92da084fefc9 6668573: CMS: reference processing crash if ParallelCMSThreads > ParallelGCThreads
ysr
parents: 1995
diff changeset
397 class ReferenceProcessorMTDiscoveryMutator: StackObj {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
398 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
399 ReferenceProcessor* _rp;
a61af66fc99e Initial load
duke
parents:
diff changeset
400 bool _saved_mt;
a61af66fc99e Initial load
duke
parents:
diff changeset
401
a61af66fc99e Initial load
duke
parents:
diff changeset
402 public:
2369
92da084fefc9 6668573: CMS: reference processing crash if ParallelCMSThreads > ParallelGCThreads
ysr
parents: 1995
diff changeset
403 ReferenceProcessorMTDiscoveryMutator(ReferenceProcessor* rp,
92da084fefc9 6668573: CMS: reference processing crash if ParallelCMSThreads > ParallelGCThreads
ysr
parents: 1995
diff changeset
404 bool mt):
0
a61af66fc99e Initial load
duke
parents:
diff changeset
405 _rp(rp) {
a61af66fc99e Initial load
duke
parents:
diff changeset
406 _saved_mt = _rp->discovery_is_mt();
a61af66fc99e Initial load
duke
parents:
diff changeset
407 _rp->set_mt_discovery(mt);
a61af66fc99e Initial load
duke
parents:
diff changeset
408 }
a61af66fc99e Initial load
duke
parents:
diff changeset
409
2369
92da084fefc9 6668573: CMS: reference processing crash if ParallelCMSThreads > ParallelGCThreads
ysr
parents: 1995
diff changeset
410 ~ReferenceProcessorMTDiscoveryMutator() {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
411 _rp->set_mt_discovery(_saved_mt);
a61af66fc99e Initial load
duke
parents:
diff changeset
412 }
a61af66fc99e Initial load
duke
parents:
diff changeset
413 };
a61af66fc99e Initial load
duke
parents:
diff changeset
414
a61af66fc99e Initial load
duke
parents:
diff changeset
415
a61af66fc99e Initial load
duke
parents:
diff changeset
416 // A utility class to temporarily change the disposition
a61af66fc99e Initial load
duke
parents:
diff changeset
417 // of the "is_alive_non_header" closure field of the
a61af66fc99e Initial load
duke
parents:
diff changeset
418 // given ReferenceProcessor in the scope that contains it.
a61af66fc99e Initial load
duke
parents:
diff changeset
419 class ReferenceProcessorIsAliveMutator: StackObj {
a61af66fc99e Initial load
duke
parents:
diff changeset
420 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
421 ReferenceProcessor* _rp;
a61af66fc99e Initial load
duke
parents:
diff changeset
422 BoolObjectClosure* _saved_cl;
a61af66fc99e Initial load
duke
parents:
diff changeset
423
a61af66fc99e Initial load
duke
parents:
diff changeset
424 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
425 ReferenceProcessorIsAliveMutator(ReferenceProcessor* rp,
a61af66fc99e Initial load
duke
parents:
diff changeset
426 BoolObjectClosure* cl):
a61af66fc99e Initial load
duke
parents:
diff changeset
427 _rp(rp) {
a61af66fc99e Initial load
duke
parents:
diff changeset
428 _saved_cl = _rp->is_alive_non_header();
a61af66fc99e Initial load
duke
parents:
diff changeset
429 _rp->set_is_alive_non_header(cl);
a61af66fc99e Initial load
duke
parents:
diff changeset
430 }
a61af66fc99e Initial load
duke
parents:
diff changeset
431
a61af66fc99e Initial load
duke
parents:
diff changeset
432 ~ReferenceProcessorIsAliveMutator() {
a61af66fc99e Initial load
duke
parents:
diff changeset
433 _rp->set_is_alive_non_header(_saved_cl);
a61af66fc99e Initial load
duke
parents:
diff changeset
434 }
a61af66fc99e Initial load
duke
parents:
diff changeset
435 };
a61af66fc99e Initial load
duke
parents:
diff changeset
436
a61af66fc99e Initial load
duke
parents:
diff changeset
437 // A utility class to temporarily change the disposition
a61af66fc99e Initial load
duke
parents:
diff changeset
438 // of the "discovery_is_atomic" field of the
a61af66fc99e Initial load
duke
parents:
diff changeset
439 // given ReferenceProcessor in the scope that contains it.
a61af66fc99e Initial load
duke
parents:
diff changeset
440 class ReferenceProcessorAtomicMutator: StackObj {
a61af66fc99e Initial load
duke
parents:
diff changeset
441 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
442 ReferenceProcessor* _rp;
a61af66fc99e Initial load
duke
parents:
diff changeset
443 bool _saved_atomic_discovery;
a61af66fc99e Initial load
duke
parents:
diff changeset
444
a61af66fc99e Initial load
duke
parents:
diff changeset
445 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
446 ReferenceProcessorAtomicMutator(ReferenceProcessor* rp,
a61af66fc99e Initial load
duke
parents:
diff changeset
447 bool atomic):
a61af66fc99e Initial load
duke
parents:
diff changeset
448 _rp(rp) {
a61af66fc99e Initial load
duke
parents:
diff changeset
449 _saved_atomic_discovery = _rp->discovery_is_atomic();
a61af66fc99e Initial load
duke
parents:
diff changeset
450 _rp->set_atomic_discovery(atomic);
a61af66fc99e Initial load
duke
parents:
diff changeset
451 }
a61af66fc99e Initial load
duke
parents:
diff changeset
452
a61af66fc99e Initial load
duke
parents:
diff changeset
453 ~ReferenceProcessorAtomicMutator() {
a61af66fc99e Initial load
duke
parents:
diff changeset
454 _rp->set_atomic_discovery(_saved_atomic_discovery);
a61af66fc99e Initial load
duke
parents:
diff changeset
455 }
a61af66fc99e Initial load
duke
parents:
diff changeset
456 };
a61af66fc99e Initial load
duke
parents:
diff changeset
457
a61af66fc99e Initial load
duke
parents:
diff changeset
458
a61af66fc99e Initial load
duke
parents:
diff changeset
459 // A utility class to temporarily change the MT processing
a61af66fc99e Initial load
duke
parents:
diff changeset
460 // disposition of the given ReferenceProcessor instance
a61af66fc99e Initial load
duke
parents:
diff changeset
461 // in the scope that contains it.
a61af66fc99e Initial load
duke
parents:
diff changeset
462 class ReferenceProcessorMTProcMutator: StackObj {
a61af66fc99e Initial load
duke
parents:
diff changeset
463 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
464 ReferenceProcessor* _rp;
a61af66fc99e Initial load
duke
parents:
diff changeset
465 bool _saved_mt;
a61af66fc99e Initial load
duke
parents:
diff changeset
466
a61af66fc99e Initial load
duke
parents:
diff changeset
467 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
468 ReferenceProcessorMTProcMutator(ReferenceProcessor* rp,
a61af66fc99e Initial load
duke
parents:
diff changeset
469 bool mt):
a61af66fc99e Initial load
duke
parents:
diff changeset
470 _rp(rp) {
a61af66fc99e Initial load
duke
parents:
diff changeset
471 _saved_mt = _rp->processing_is_mt();
a61af66fc99e Initial load
duke
parents:
diff changeset
472 _rp->set_mt_processing(mt);
a61af66fc99e Initial load
duke
parents:
diff changeset
473 }
a61af66fc99e Initial load
duke
parents:
diff changeset
474
a61af66fc99e Initial load
duke
parents:
diff changeset
475 ~ReferenceProcessorMTProcMutator() {
a61af66fc99e Initial load
duke
parents:
diff changeset
476 _rp->set_mt_processing(_saved_mt);
a61af66fc99e Initial load
duke
parents:
diff changeset
477 }
a61af66fc99e Initial load
duke
parents:
diff changeset
478 };
a61af66fc99e Initial load
duke
parents:
diff changeset
479
a61af66fc99e Initial load
duke
parents:
diff changeset
480
a61af66fc99e Initial load
duke
parents:
diff changeset
481 // This class is an interface used to implement task execution for the
a61af66fc99e Initial load
duke
parents:
diff changeset
482 // reference processing.
a61af66fc99e Initial load
duke
parents:
diff changeset
483 class AbstractRefProcTaskExecutor {
a61af66fc99e Initial load
duke
parents:
diff changeset
484 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
485
a61af66fc99e Initial load
duke
parents:
diff changeset
486 // Abstract tasks to execute.
a61af66fc99e Initial load
duke
parents:
diff changeset
487 class ProcessTask;
a61af66fc99e Initial load
duke
parents:
diff changeset
488 class EnqueueTask;
a61af66fc99e Initial load
duke
parents:
diff changeset
489
a61af66fc99e Initial load
duke
parents:
diff changeset
490 // Executes a task using worker threads.
a61af66fc99e Initial load
duke
parents:
diff changeset
491 virtual void execute(ProcessTask& task) = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
492 virtual void execute(EnqueueTask& task) = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
493
a61af66fc99e Initial load
duke
parents:
diff changeset
494 // Switch to single threaded mode.
a61af66fc99e Initial load
duke
parents:
diff changeset
495 virtual void set_single_threaded_mode() { };
a61af66fc99e Initial load
duke
parents:
diff changeset
496 };
a61af66fc99e Initial load
duke
parents:
diff changeset
497
a61af66fc99e Initial load
duke
parents:
diff changeset
498 // Abstract reference processing task to execute.
a61af66fc99e Initial load
duke
parents:
diff changeset
499 class AbstractRefProcTaskExecutor::ProcessTask {
a61af66fc99e Initial load
duke
parents:
diff changeset
500 protected:
a61af66fc99e Initial load
duke
parents:
diff changeset
501 ProcessTask(ReferenceProcessor& ref_processor,
a61af66fc99e Initial load
duke
parents:
diff changeset
502 DiscoveredList refs_lists[],
a61af66fc99e Initial load
duke
parents:
diff changeset
503 bool marks_oops_alive)
a61af66fc99e Initial load
duke
parents:
diff changeset
504 : _ref_processor(ref_processor),
a61af66fc99e Initial load
duke
parents:
diff changeset
505 _refs_lists(refs_lists),
a61af66fc99e Initial load
duke
parents:
diff changeset
506 _marks_oops_alive(marks_oops_alive)
a61af66fc99e Initial load
duke
parents:
diff changeset
507 { }
a61af66fc99e Initial load
duke
parents:
diff changeset
508
a61af66fc99e Initial load
duke
parents:
diff changeset
509 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
510 virtual void work(unsigned int work_id, BoolObjectClosure& is_alive,
a61af66fc99e Initial load
duke
parents:
diff changeset
511 OopClosure& keep_alive,
a61af66fc99e Initial load
duke
parents:
diff changeset
512 VoidClosure& complete_gc) = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
513
a61af66fc99e Initial load
duke
parents:
diff changeset
514 // Returns true if a task marks some oops as alive.
a61af66fc99e Initial load
duke
parents:
diff changeset
515 bool marks_oops_alive() const
a61af66fc99e Initial load
duke
parents:
diff changeset
516 { return _marks_oops_alive; }
a61af66fc99e Initial load
duke
parents:
diff changeset
517
a61af66fc99e Initial load
duke
parents:
diff changeset
518 protected:
a61af66fc99e Initial load
duke
parents:
diff changeset
519 ReferenceProcessor& _ref_processor;
a61af66fc99e Initial load
duke
parents:
diff changeset
520 DiscoveredList* _refs_lists;
a61af66fc99e Initial load
duke
parents:
diff changeset
521 const bool _marks_oops_alive;
a61af66fc99e Initial load
duke
parents:
diff changeset
522 };
a61af66fc99e Initial load
duke
parents:
diff changeset
523
a61af66fc99e Initial load
duke
parents:
diff changeset
524 // Abstract reference processing task to execute.
a61af66fc99e Initial load
duke
parents:
diff changeset
525 class AbstractRefProcTaskExecutor::EnqueueTask {
a61af66fc99e Initial load
duke
parents:
diff changeset
526 protected:
a61af66fc99e Initial load
duke
parents:
diff changeset
527 EnqueueTask(ReferenceProcessor& ref_processor,
a61af66fc99e Initial load
duke
parents:
diff changeset
528 DiscoveredList refs_lists[],
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
529 HeapWord* pending_list_addr,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
530 int n_queues)
a61af66fc99e Initial load
duke
parents:
diff changeset
531 : _ref_processor(ref_processor),
a61af66fc99e Initial load
duke
parents:
diff changeset
532 _refs_lists(refs_lists),
a61af66fc99e Initial load
duke
parents:
diff changeset
533 _pending_list_addr(pending_list_addr),
a61af66fc99e Initial load
duke
parents:
diff changeset
534 _n_queues(n_queues)
a61af66fc99e Initial load
duke
parents:
diff changeset
535 { }
a61af66fc99e Initial load
duke
parents:
diff changeset
536
a61af66fc99e Initial load
duke
parents:
diff changeset
537 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
538 virtual void work(unsigned int work_id) = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
539
a61af66fc99e Initial load
duke
parents:
diff changeset
540 protected:
a61af66fc99e Initial load
duke
parents:
diff changeset
541 ReferenceProcessor& _ref_processor;
a61af66fc99e Initial load
duke
parents:
diff changeset
542 DiscoveredList* _refs_lists;
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
543 HeapWord* _pending_list_addr;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
544 int _n_queues;
a61af66fc99e Initial load
duke
parents:
diff changeset
545 };
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1843
diff changeset
546
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1843
diff changeset
547 #endif // SHARE_VM_MEMORY_REFERENCEPROCESSOR_HPP