annotate src/share/vm/memory/referenceProcessor.hpp @ 453:c96030fff130

6684579: SoftReference processing can be made more efficient Summary: For current soft-ref clearing policies, we can decide at marking time if a soft-reference will definitely not be cleared, postponing the decision of whether it will definitely be cleared to the final reference processing phase. This can be especially beneficial in the case of concurrent collectors where the marking is usually concurrent but reference processing is usually not. Reviewed-by: jmasa
author ysr
date Thu, 20 Nov 2008 16:56:09 -0800
parents 1ee8caae33af
children 27a80744a83b
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
196
d1605aabd0a1 6719955: Update copyright year
xdono
parents: 113
diff changeset
2 * Copyright 2001-2008 Sun Microsystems, Inc. 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 *
a61af66fc99e Initial load
duke
parents:
diff changeset
19 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
a61af66fc99e Initial load
duke
parents:
diff changeset
20 * CA 95054 USA or visit www.sun.com if you need additional information or
a61af66fc99e Initial load
duke
parents:
diff changeset
21 * have any questions.
a61af66fc99e Initial load
duke
parents:
diff changeset
22 *
a61af66fc99e Initial load
duke
parents:
diff changeset
23 */
a61af66fc99e Initial load
duke
parents:
diff changeset
24
a61af66fc99e Initial load
duke
parents:
diff changeset
25 // ReferenceProcessor class encapsulates the per-"collector" processing
453
c96030fff130 6684579: SoftReference processing can be made more efficient
ysr
parents: 356
diff changeset
26 // of java.lang.Reference objects for GC. The interface is useful for supporting
0
a61af66fc99e Initial load
duke
parents:
diff changeset
27 // a generational abstraction, in particular when there are multiple
a61af66fc99e Initial load
duke
parents:
diff changeset
28 // generations that are being independently collected -- possibly
a61af66fc99e Initial load
duke
parents:
diff changeset
29 // concurrently and/or incrementally. Note, however, that the
a61af66fc99e Initial load
duke
parents:
diff changeset
30 // ReferenceProcessor class abstracts away from a generational setting
a61af66fc99e Initial load
duke
parents:
diff changeset
31 // by using only a heap interval (called "span" below), thus allowing
a61af66fc99e Initial load
duke
parents:
diff changeset
32 // its use in a straightforward manner in a general, non-generational
a61af66fc99e Initial load
duke
parents:
diff changeset
33 // setting.
a61af66fc99e Initial load
duke
parents:
diff changeset
34 //
a61af66fc99e Initial load
duke
parents:
diff changeset
35 // The basic idea is that each ReferenceProcessor object concerns
a61af66fc99e Initial load
duke
parents:
diff changeset
36 // itself with ("weak") reference processing in a specific "span"
a61af66fc99e Initial load
duke
parents:
diff changeset
37 // of the heap of interest to a specific collector. Currently,
a61af66fc99e Initial load
duke
parents:
diff changeset
38 // the span is a convex interval of the heap, but, efficiency
a61af66fc99e Initial load
duke
parents:
diff changeset
39 // apart, there seems to be no reason it couldn't be extended
a61af66fc99e Initial load
duke
parents:
diff changeset
40 // (with appropriate modifications) to any "non-convex interval".
a61af66fc99e Initial load
duke
parents:
diff changeset
41
a61af66fc99e Initial load
duke
parents:
diff changeset
42 // forward references
a61af66fc99e Initial load
duke
parents:
diff changeset
43 class ReferencePolicy;
a61af66fc99e Initial load
duke
parents:
diff changeset
44 class AbstractRefProcTaskExecutor;
a61af66fc99e Initial load
duke
parents:
diff changeset
45 class DiscoveredList;
a61af66fc99e Initial load
duke
parents:
diff changeset
46
a61af66fc99e Initial load
duke
parents:
diff changeset
47 class ReferenceProcessor : public CHeapObj {
a61af66fc99e Initial load
duke
parents:
diff changeset
48 protected:
a61af66fc99e Initial load
duke
parents:
diff changeset
49 // End of list marker
a61af66fc99e Initial load
duke
parents:
diff changeset
50 static oop _sentinelRef;
a61af66fc99e Initial load
duke
parents:
diff changeset
51 MemRegion _span; // (right-open) interval of heap
a61af66fc99e Initial load
duke
parents:
diff changeset
52 // subject to wkref discovery
a61af66fc99e Initial load
duke
parents:
diff changeset
53 bool _discovering_refs; // true when discovery enabled
a61af66fc99e Initial load
duke
parents:
diff changeset
54 bool _discovery_is_atomic; // if discovery is atomic wrt
a61af66fc99e Initial load
duke
parents:
diff changeset
55 // other collectors in configuration
a61af66fc99e Initial load
duke
parents:
diff changeset
56 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
57 // 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
58 // 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
59 // 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
60 // 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
61 // long-term concurrent marking phase that does weak reference
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
62 // discovery.)
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
63 bool _discovered_list_needs_barrier;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
64 BarrierSet* _bs; // Cached copy of BarrierSet.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
65 bool _enqueuing_is_done; // true if all weak references enqueued
a61af66fc99e Initial load
duke
parents:
diff changeset
66 bool _processing_is_mt; // true during phases when
a61af66fc99e Initial load
duke
parents:
diff changeset
67 // reference processing is MT.
a61af66fc99e Initial load
duke
parents:
diff changeset
68 int _next_id; // round-robin counter in
a61af66fc99e Initial load
duke
parents:
diff changeset
69 // support of work distribution
a61af66fc99e Initial load
duke
parents:
diff changeset
70
a61af66fc99e Initial load
duke
parents:
diff changeset
71 // For collectors that do not keep GC marking information
a61af66fc99e Initial load
duke
parents:
diff changeset
72 // in the object header, this field holds a closure that
a61af66fc99e Initial load
duke
parents:
diff changeset
73 // helps the reference processor determine the reachability
a61af66fc99e Initial load
duke
parents:
diff changeset
74 // of an oop (the field is currently initialized to NULL for
a61af66fc99e Initial load
duke
parents:
diff changeset
75 // all collectors but the CMS collector).
a61af66fc99e Initial load
duke
parents:
diff changeset
76 BoolObjectClosure* _is_alive_non_header;
a61af66fc99e Initial load
duke
parents:
diff changeset
77
453
c96030fff130 6684579: SoftReference processing can be made more efficient
ysr
parents: 356
diff changeset
78 // Soft ref clearing policies
c96030fff130 6684579: SoftReference processing can be made more efficient
ysr
parents: 356
diff changeset
79 // . the default policy
c96030fff130 6684579: SoftReference processing can be made more efficient
ysr
parents: 356
diff changeset
80 static ReferencePolicy* _default_soft_ref_policy;
c96030fff130 6684579: SoftReference processing can be made more efficient
ysr
parents: 356
diff changeset
81 // . the "clear all" policy
c96030fff130 6684579: SoftReference processing can be made more efficient
ysr
parents: 356
diff changeset
82 static ReferencePolicy* _always_clear_soft_ref_policy;
c96030fff130 6684579: SoftReference processing can be made more efficient
ysr
parents: 356
diff changeset
83 // . the current policy below is either one of the above
c96030fff130 6684579: SoftReference processing can be made more efficient
ysr
parents: 356
diff changeset
84 ReferencePolicy* _current_soft_ref_policy;
c96030fff130 6684579: SoftReference processing can be made more efficient
ysr
parents: 356
diff changeset
85
0
a61af66fc99e Initial load
duke
parents:
diff changeset
86 // 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
87
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
88 // The MT'ness degree of the queues below
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
89 int _num_q;
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
90 // 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
91 DiscoveredList* _discoveredSoftRefs;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
92 DiscoveredList* _discoveredWeakRefs;
a61af66fc99e Initial load
duke
parents:
diff changeset
93 DiscoveredList* _discoveredFinalRefs;
a61af66fc99e Initial load
duke
parents:
diff changeset
94 DiscoveredList* _discoveredPhantomRefs;
a61af66fc99e Initial load
duke
parents:
diff changeset
95
a61af66fc99e Initial load
duke
parents:
diff changeset
96 public:
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
97 int num_q() { return _num_q; }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
98 DiscoveredList* discovered_soft_refs() { return _discoveredSoftRefs; }
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
99 static oop sentinel_ref() { return _sentinelRef; }
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
100 static oop* adr_sentinel_ref() { return &_sentinelRef; }
453
c96030fff130 6684579: SoftReference processing can be made more efficient
ysr
parents: 356
diff changeset
101 ReferencePolicy* snap_policy(bool always_clear) {
c96030fff130 6684579: SoftReference processing can be made more efficient
ysr
parents: 356
diff changeset
102 _current_soft_ref_policy = always_clear ?
c96030fff130 6684579: SoftReference processing can be made more efficient
ysr
parents: 356
diff changeset
103 _always_clear_soft_ref_policy : _default_soft_ref_policy;
c96030fff130 6684579: SoftReference processing can be made more efficient
ysr
parents: 356
diff changeset
104 _current_soft_ref_policy->snap(); // snapshot the policy threshold
c96030fff130 6684579: SoftReference processing can be made more efficient
ysr
parents: 356
diff changeset
105 return _current_soft_ref_policy;
c96030fff130 6684579: SoftReference processing can be made more efficient
ysr
parents: 356
diff changeset
106 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
107
a61af66fc99e Initial load
duke
parents:
diff changeset
108 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
109 // Process references with a certain reachability level.
a61af66fc99e Initial load
duke
parents:
diff changeset
110 void process_discovered_reflist(DiscoveredList refs_lists[],
a61af66fc99e Initial load
duke
parents:
diff changeset
111 ReferencePolicy* policy,
a61af66fc99e Initial load
duke
parents:
diff changeset
112 bool clear_referent,
a61af66fc99e Initial load
duke
parents:
diff changeset
113 BoolObjectClosure* is_alive,
a61af66fc99e Initial load
duke
parents:
diff changeset
114 OopClosure* keep_alive,
a61af66fc99e Initial load
duke
parents:
diff changeset
115 VoidClosure* complete_gc,
a61af66fc99e Initial load
duke
parents:
diff changeset
116 AbstractRefProcTaskExecutor* task_executor);
a61af66fc99e Initial load
duke
parents:
diff changeset
117
a61af66fc99e Initial load
duke
parents:
diff changeset
118 void process_phaseJNI(BoolObjectClosure* is_alive,
a61af66fc99e Initial load
duke
parents:
diff changeset
119 OopClosure* keep_alive,
a61af66fc99e Initial load
duke
parents:
diff changeset
120 VoidClosure* complete_gc);
a61af66fc99e Initial load
duke
parents:
diff changeset
121
a61af66fc99e Initial load
duke
parents:
diff changeset
122 // Work methods used by the method process_discovered_reflist
a61af66fc99e Initial load
duke
parents:
diff changeset
123 // Phase1: keep alive all those referents that are otherwise
a61af66fc99e Initial load
duke
parents:
diff changeset
124 // 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
125 void process_phase1(DiscoveredList& refs_list,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
126 ReferencePolicy* policy,
a61af66fc99e Initial load
duke
parents:
diff changeset
127 BoolObjectClosure* is_alive,
a61af66fc99e Initial load
duke
parents:
diff changeset
128 OopClosure* keep_alive,
a61af66fc99e Initial load
duke
parents:
diff changeset
129 VoidClosure* complete_gc);
a61af66fc99e Initial load
duke
parents:
diff changeset
130 // Phase2: remove all those references whose referents are
a61af66fc99e Initial load
duke
parents:
diff changeset
131 // reachable.
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
132 inline void process_phase2(DiscoveredList& refs_list,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
133 BoolObjectClosure* is_alive,
a61af66fc99e Initial load
duke
parents:
diff changeset
134 OopClosure* keep_alive,
a61af66fc99e Initial load
duke
parents:
diff changeset
135 VoidClosure* complete_gc) {
a61af66fc99e Initial load
duke
parents:
diff changeset
136 if (discovery_is_atomic()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
137 // 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
138 pp2_work(refs_list, is_alive, keep_alive);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
139 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
140 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
141 pp2_work_concurrent_discovery(refs_list, is_alive,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
142 keep_alive, complete_gc);
a61af66fc99e Initial load
duke
parents:
diff changeset
143 }
a61af66fc99e Initial load
duke
parents:
diff changeset
144 }
a61af66fc99e Initial load
duke
parents:
diff changeset
145 // 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
146 void pp2_work(DiscoveredList& refs_list,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
147 BoolObjectClosure* is_alive,
a61af66fc99e Initial load
duke
parents:
diff changeset
148 OopClosure* keep_alive);
a61af66fc99e Initial load
duke
parents:
diff changeset
149 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
150 DiscoveredList& refs_list,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
151 BoolObjectClosure* is_alive,
a61af66fc99e Initial load
duke
parents:
diff changeset
152 OopClosure* keep_alive,
a61af66fc99e Initial load
duke
parents:
diff changeset
153 VoidClosure* complete_gc);
a61af66fc99e Initial load
duke
parents:
diff changeset
154 // Phase3: process the referents by either clearing them
a61af66fc99e Initial load
duke
parents:
diff changeset
155 // 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
156 void process_phase3(DiscoveredList& refs_list,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
157 bool clear_referent,
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
a61af66fc99e Initial load
duke
parents:
diff changeset
162 // 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
163 void enqueue_discovered_reflist(DiscoveredList& refs_list, HeapWord* pending_list_addr);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
164
a61af66fc99e Initial load
duke
parents:
diff changeset
165 // "Preclean" all the discovered reference lists
a61af66fc99e Initial load
duke
parents:
diff changeset
166 // by removing references with strongly reachable referents.
a61af66fc99e Initial load
duke
parents:
diff changeset
167 // The first argument is a predicate on an oop that indicates
a61af66fc99e Initial load
duke
parents:
diff changeset
168 // its (strong) reachability and the second is a closure that
a61af66fc99e Initial load
duke
parents:
diff changeset
169 // may be used to incrementalize or abort the precleaning process.
a61af66fc99e Initial load
duke
parents:
diff changeset
170 // The caller is responsible for taking care of potential
a61af66fc99e Initial load
duke
parents:
diff changeset
171 // interference with concurrent operations on these lists
a61af66fc99e Initial load
duke
parents:
diff changeset
172 // (or predicates involved) by other threads. Currently
a61af66fc99e Initial load
duke
parents:
diff changeset
173 // only used by the CMS collector.
a61af66fc99e Initial load
duke
parents:
diff changeset
174 void preclean_discovered_references(BoolObjectClosure* is_alive,
a61af66fc99e Initial load
duke
parents:
diff changeset
175 OopClosure* keep_alive,
a61af66fc99e Initial load
duke
parents:
diff changeset
176 VoidClosure* complete_gc,
a61af66fc99e Initial load
duke
parents:
diff changeset
177 YieldClosure* yield);
a61af66fc99e Initial load
duke
parents:
diff changeset
178
a61af66fc99e Initial load
duke
parents:
diff changeset
179 // Delete entries in the discovered lists that have
a61af66fc99e Initial load
duke
parents:
diff changeset
180 // either a null referent or are not active. Such
a61af66fc99e Initial load
duke
parents:
diff changeset
181 // Reference objects can result from the clearing
a61af66fc99e Initial load
duke
parents:
diff changeset
182 // or enqueueing of Reference objects concurrent
a61af66fc99e Initial load
duke
parents:
diff changeset
183 // with their discovery by a (concurrent) collector.
a61af66fc99e Initial load
duke
parents:
diff changeset
184 // For a definition of "active" see java.lang.ref.Reference;
a61af66fc99e Initial load
duke
parents:
diff changeset
185 // Refs are born active, become inactive when enqueued,
a61af66fc99e Initial load
duke
parents:
diff changeset
186 // and never become active again. The state of being
a61af66fc99e Initial load
duke
parents:
diff changeset
187 // active is encoded as follows: A Ref is active
a61af66fc99e Initial load
duke
parents:
diff changeset
188 // if and only if its "next" field is NULL.
a61af66fc99e Initial load
duke
parents:
diff changeset
189 void clean_up_discovered_references();
a61af66fc99e Initial load
duke
parents:
diff changeset
190 void clean_up_discovered_reflist(DiscoveredList& refs_list);
a61af66fc99e Initial load
duke
parents:
diff changeset
191
a61af66fc99e Initial load
duke
parents:
diff changeset
192 // Returns the name of the discovered reference list
a61af66fc99e Initial load
duke
parents:
diff changeset
193 // occupying the i / _num_q slot.
a61af66fc99e Initial load
duke
parents:
diff changeset
194 const char* list_name(int i);
a61af66fc99e Initial load
duke
parents:
diff changeset
195
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
196 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
197
0
a61af66fc99e Initial load
duke
parents:
diff changeset
198 protected:
a61af66fc99e Initial load
duke
parents:
diff changeset
199 // "Preclean" the given discovered reference list
a61af66fc99e Initial load
duke
parents:
diff changeset
200 // by removing references with strongly reachable referents.
a61af66fc99e Initial load
duke
parents:
diff changeset
201 // Currently used in support of CMS only.
a61af66fc99e Initial load
duke
parents:
diff changeset
202 void preclean_discovered_reflist(DiscoveredList& refs_list,
a61af66fc99e Initial load
duke
parents:
diff changeset
203 BoolObjectClosure* is_alive,
a61af66fc99e Initial load
duke
parents:
diff changeset
204 OopClosure* keep_alive,
a61af66fc99e Initial load
duke
parents:
diff changeset
205 VoidClosure* complete_gc,
a61af66fc99e Initial load
duke
parents:
diff changeset
206 YieldClosure* yield);
a61af66fc99e Initial load
duke
parents:
diff changeset
207
a61af66fc99e Initial load
duke
parents:
diff changeset
208 int next_id() {
a61af66fc99e Initial load
duke
parents:
diff changeset
209 int id = _next_id;
a61af66fc99e Initial load
duke
parents:
diff changeset
210 if (++_next_id == _num_q) {
a61af66fc99e Initial load
duke
parents:
diff changeset
211 _next_id = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
212 }
a61af66fc99e Initial load
duke
parents:
diff changeset
213 return id;
a61af66fc99e Initial load
duke
parents:
diff changeset
214 }
a61af66fc99e Initial load
duke
parents:
diff changeset
215 DiscoveredList* get_discovered_list(ReferenceType rt);
a61af66fc99e Initial load
duke
parents:
diff changeset
216 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
217 HeapWord* discovered_addr);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
218 void verify_ok_to_handle_reflists() PRODUCT_RETURN;
a61af66fc99e Initial load
duke
parents:
diff changeset
219
a61af66fc99e Initial load
duke
parents:
diff changeset
220 void abandon_partial_discovered_list(DiscoveredList& refs_list);
a61af66fc99e Initial load
duke
parents:
diff changeset
221
a61af66fc99e Initial load
duke
parents:
diff changeset
222 // Calculate the number of jni handles.
a61af66fc99e Initial load
duke
parents:
diff changeset
223 unsigned int count_jni_refs();
a61af66fc99e Initial load
duke
parents:
diff changeset
224
a61af66fc99e Initial load
duke
parents:
diff changeset
225 // Balances reference queues.
a61af66fc99e Initial load
duke
parents:
diff changeset
226 void balance_queues(DiscoveredList ref_lists[]);
a61af66fc99e Initial load
duke
parents:
diff changeset
227
a61af66fc99e Initial load
duke
parents:
diff changeset
228 // Update (advance) the soft ref master clock field.
a61af66fc99e Initial load
duke
parents:
diff changeset
229 void update_soft_ref_master_clock();
a61af66fc99e Initial load
duke
parents:
diff changeset
230
a61af66fc99e Initial load
duke
parents:
diff changeset
231 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
232 // constructor
a61af66fc99e Initial load
duke
parents:
diff changeset
233 ReferenceProcessor():
a61af66fc99e Initial load
duke
parents:
diff changeset
234 _span((HeapWord*)NULL, (HeapWord*)NULL),
a61af66fc99e Initial load
duke
parents:
diff changeset
235 _discoveredSoftRefs(NULL), _discoveredWeakRefs(NULL),
a61af66fc99e Initial load
duke
parents:
diff changeset
236 _discoveredFinalRefs(NULL), _discoveredPhantomRefs(NULL),
a61af66fc99e Initial load
duke
parents:
diff changeset
237 _discovering_refs(false),
a61af66fc99e Initial load
duke
parents:
diff changeset
238 _discovery_is_atomic(true),
a61af66fc99e Initial load
duke
parents:
diff changeset
239 _enqueuing_is_done(false),
a61af66fc99e Initial load
duke
parents:
diff changeset
240 _discovery_is_mt(false),
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
241 _discovered_list_needs_barrier(false),
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
242 _bs(NULL),
0
a61af66fc99e Initial load
duke
parents:
diff changeset
243 _is_alive_non_header(NULL),
a61af66fc99e Initial load
duke
parents:
diff changeset
244 _num_q(0),
a61af66fc99e Initial load
duke
parents:
diff changeset
245 _processing_is_mt(false),
a61af66fc99e Initial load
duke
parents:
diff changeset
246 _next_id(0)
a61af66fc99e Initial load
duke
parents:
diff changeset
247 {}
a61af66fc99e Initial load
duke
parents:
diff changeset
248
a61af66fc99e Initial load
duke
parents:
diff changeset
249 ReferenceProcessor(MemRegion span, bool atomic_discovery,
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
250 bool mt_discovery,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
251 int mt_degree = 1,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
252 bool mt_processing = false,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
253 bool discovered_list_needs_barrier = false);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
254
a61af66fc99e Initial load
duke
parents:
diff changeset
255 // Allocates and initializes a reference processor.
a61af66fc99e Initial load
duke
parents:
diff changeset
256 static ReferenceProcessor* create_ref_processor(
a61af66fc99e Initial load
duke
parents:
diff changeset
257 MemRegion span,
a61af66fc99e Initial load
duke
parents:
diff changeset
258 bool atomic_discovery,
a61af66fc99e Initial load
duke
parents:
diff changeset
259 bool mt_discovery,
a61af66fc99e Initial load
duke
parents:
diff changeset
260 BoolObjectClosure* is_alive_non_header = NULL,
a61af66fc99e Initial load
duke
parents:
diff changeset
261 int parallel_gc_threads = 1,
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
262 bool mt_processing = false,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
263 bool discovered_list_needs_barrier = false);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
264 // RefDiscoveryPolicy values
a61af66fc99e Initial load
duke
parents:
diff changeset
265 enum {
a61af66fc99e Initial load
duke
parents:
diff changeset
266 ReferenceBasedDiscovery = 0,
a61af66fc99e Initial load
duke
parents:
diff changeset
267 ReferentBasedDiscovery = 1
a61af66fc99e Initial load
duke
parents:
diff changeset
268 };
a61af66fc99e Initial load
duke
parents:
diff changeset
269
a61af66fc99e Initial load
duke
parents:
diff changeset
270 static void init_statics();
a61af66fc99e Initial load
duke
parents:
diff changeset
271
a61af66fc99e Initial load
duke
parents:
diff changeset
272 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
273 // get and set "is_alive_non_header" field
a61af66fc99e Initial load
duke
parents:
diff changeset
274 BoolObjectClosure* is_alive_non_header() {
a61af66fc99e Initial load
duke
parents:
diff changeset
275 return _is_alive_non_header;
a61af66fc99e Initial load
duke
parents:
diff changeset
276 }
a61af66fc99e Initial load
duke
parents:
diff changeset
277 void set_is_alive_non_header(BoolObjectClosure* is_alive_non_header) {
a61af66fc99e Initial load
duke
parents:
diff changeset
278 _is_alive_non_header = is_alive_non_header;
a61af66fc99e Initial load
duke
parents:
diff changeset
279 }
a61af66fc99e Initial load
duke
parents:
diff changeset
280
a61af66fc99e Initial load
duke
parents:
diff changeset
281 // get and set span
a61af66fc99e Initial load
duke
parents:
diff changeset
282 MemRegion span() { return _span; }
a61af66fc99e Initial load
duke
parents:
diff changeset
283 void set_span(MemRegion span) { _span = span; }
a61af66fc99e Initial load
duke
parents:
diff changeset
284
a61af66fc99e Initial load
duke
parents:
diff changeset
285 // start and stop weak ref discovery
a61af66fc99e Initial load
duke
parents:
diff changeset
286 void enable_discovery() { _discovering_refs = true; }
a61af66fc99e Initial load
duke
parents:
diff changeset
287 void disable_discovery() { _discovering_refs = false; }
a61af66fc99e Initial load
duke
parents:
diff changeset
288 bool discovery_enabled() { return _discovering_refs; }
a61af66fc99e Initial load
duke
parents:
diff changeset
289
a61af66fc99e Initial load
duke
parents:
diff changeset
290 // whether discovery is atomic wrt other collectors
a61af66fc99e Initial load
duke
parents:
diff changeset
291 bool discovery_is_atomic() const { return _discovery_is_atomic; }
a61af66fc99e Initial load
duke
parents:
diff changeset
292 void set_atomic_discovery(bool atomic) { _discovery_is_atomic = atomic; }
a61af66fc99e Initial load
duke
parents:
diff changeset
293
a61af66fc99e Initial load
duke
parents:
diff changeset
294 // whether discovery is done by multiple threads same-old-timeously
a61af66fc99e Initial load
duke
parents:
diff changeset
295 bool discovery_is_mt() const { return _discovery_is_mt; }
a61af66fc99e Initial load
duke
parents:
diff changeset
296 void set_mt_discovery(bool mt) { _discovery_is_mt = mt; }
a61af66fc99e Initial load
duke
parents:
diff changeset
297
a61af66fc99e Initial load
duke
parents:
diff changeset
298 // Whether we are in a phase when _processing_ is MT.
a61af66fc99e Initial load
duke
parents:
diff changeset
299 bool processing_is_mt() const { return _processing_is_mt; }
a61af66fc99e Initial load
duke
parents:
diff changeset
300 void set_mt_processing(bool mt) { _processing_is_mt = mt; }
a61af66fc99e Initial load
duke
parents:
diff changeset
301
a61af66fc99e Initial load
duke
parents:
diff changeset
302 // whether all enqueuing of weak references is complete
a61af66fc99e Initial load
duke
parents:
diff changeset
303 bool enqueuing_is_done() { return _enqueuing_is_done; }
a61af66fc99e Initial load
duke
parents:
diff changeset
304 void set_enqueuing_is_done(bool v) { _enqueuing_is_done = v; }
a61af66fc99e Initial load
duke
parents:
diff changeset
305
a61af66fc99e Initial load
duke
parents:
diff changeset
306 // iterate over oops
a61af66fc99e Initial load
duke
parents:
diff changeset
307 void weak_oops_do(OopClosure* f); // weak roots
a61af66fc99e Initial load
duke
parents:
diff changeset
308 static void oops_do(OopClosure* f); // strong root(s)
a61af66fc99e Initial load
duke
parents:
diff changeset
309
a61af66fc99e Initial load
duke
parents:
diff changeset
310 // Discover a Reference object, using appropriate discovery criteria
a61af66fc99e Initial load
duke
parents:
diff changeset
311 bool discover_reference(oop obj, ReferenceType rt);
a61af66fc99e Initial load
duke
parents:
diff changeset
312
a61af66fc99e Initial load
duke
parents:
diff changeset
313 // 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
314 void process_discovered_references(BoolObjectClosure* is_alive,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
315 OopClosure* keep_alive,
a61af66fc99e Initial load
duke
parents:
diff changeset
316 VoidClosure* complete_gc,
a61af66fc99e Initial load
duke
parents:
diff changeset
317 AbstractRefProcTaskExecutor* task_executor);
a61af66fc99e Initial load
duke
parents:
diff changeset
318
a61af66fc99e Initial load
duke
parents:
diff changeset
319 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
320 // Enqueue references at end of GC (called by the garbage collector)
a61af66fc99e Initial load
duke
parents:
diff changeset
321 bool enqueue_discovered_references(AbstractRefProcTaskExecutor* task_executor = NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
322
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
323 // 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
324 // 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
325 // 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
326 void abandon_partial_discovery();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
327
0
a61af66fc99e Initial load
duke
parents:
diff changeset
328 // debugging
a61af66fc99e Initial load
duke
parents:
diff changeset
329 void verify_no_references_recorded() PRODUCT_RETURN;
a61af66fc99e Initial load
duke
parents:
diff changeset
330 static void verify();
a61af66fc99e Initial load
duke
parents:
diff changeset
331
a61af66fc99e Initial load
duke
parents:
diff changeset
332 // clear the discovered lists (unlinking each entry).
a61af66fc99e Initial load
duke
parents:
diff changeset
333 void clear_discovered_references() PRODUCT_RETURN;
a61af66fc99e Initial load
duke
parents:
diff changeset
334 };
a61af66fc99e Initial load
duke
parents:
diff changeset
335
a61af66fc99e Initial load
duke
parents:
diff changeset
336 // A utility class to disable reference discovery in
a61af66fc99e Initial load
duke
parents:
diff changeset
337 // the scope which contains it, for given ReferenceProcessor.
a61af66fc99e Initial load
duke
parents:
diff changeset
338 class NoRefDiscovery: StackObj {
a61af66fc99e Initial load
duke
parents:
diff changeset
339 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
340 ReferenceProcessor* _rp;
a61af66fc99e Initial load
duke
parents:
diff changeset
341 bool _was_discovering_refs;
a61af66fc99e Initial load
duke
parents:
diff changeset
342 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
343 NoRefDiscovery(ReferenceProcessor* rp) : _rp(rp) {
a61af66fc99e Initial load
duke
parents:
diff changeset
344 if (_was_discovering_refs = _rp->discovery_enabled()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
345 _rp->disable_discovery();
a61af66fc99e Initial load
duke
parents:
diff changeset
346 }
a61af66fc99e Initial load
duke
parents:
diff changeset
347 }
a61af66fc99e Initial load
duke
parents:
diff changeset
348
a61af66fc99e Initial load
duke
parents:
diff changeset
349 ~NoRefDiscovery() {
a61af66fc99e Initial load
duke
parents:
diff changeset
350 if (_was_discovering_refs) {
a61af66fc99e Initial load
duke
parents:
diff changeset
351 _rp->enable_discovery();
a61af66fc99e Initial load
duke
parents:
diff changeset
352 }
a61af66fc99e Initial load
duke
parents:
diff changeset
353 }
a61af66fc99e Initial load
duke
parents:
diff changeset
354 };
a61af66fc99e Initial load
duke
parents:
diff changeset
355
a61af66fc99e Initial load
duke
parents:
diff changeset
356
a61af66fc99e Initial load
duke
parents:
diff changeset
357 // A utility class to temporarily mutate the span of the
a61af66fc99e Initial load
duke
parents:
diff changeset
358 // given ReferenceProcessor in the scope that contains it.
a61af66fc99e Initial load
duke
parents:
diff changeset
359 class ReferenceProcessorSpanMutator: StackObj {
a61af66fc99e Initial load
duke
parents:
diff changeset
360 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
361 ReferenceProcessor* _rp;
a61af66fc99e Initial load
duke
parents:
diff changeset
362 MemRegion _saved_span;
a61af66fc99e Initial load
duke
parents:
diff changeset
363
a61af66fc99e Initial load
duke
parents:
diff changeset
364 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
365 ReferenceProcessorSpanMutator(ReferenceProcessor* rp,
a61af66fc99e Initial load
duke
parents:
diff changeset
366 MemRegion span):
a61af66fc99e Initial load
duke
parents:
diff changeset
367 _rp(rp) {
a61af66fc99e Initial load
duke
parents:
diff changeset
368 _saved_span = _rp->span();
a61af66fc99e Initial load
duke
parents:
diff changeset
369 _rp->set_span(span);
a61af66fc99e Initial load
duke
parents:
diff changeset
370 }
a61af66fc99e Initial load
duke
parents:
diff changeset
371
a61af66fc99e Initial load
duke
parents:
diff changeset
372 ~ReferenceProcessorSpanMutator() {
a61af66fc99e Initial load
duke
parents:
diff changeset
373 _rp->set_span(_saved_span);
a61af66fc99e Initial load
duke
parents:
diff changeset
374 }
a61af66fc99e Initial load
duke
parents:
diff changeset
375 };
a61af66fc99e Initial load
duke
parents:
diff changeset
376
a61af66fc99e Initial load
duke
parents:
diff changeset
377 // A utility class to temporarily change the MT'ness of
a61af66fc99e Initial load
duke
parents:
diff changeset
378 // reference discovery for the given ReferenceProcessor
a61af66fc99e Initial load
duke
parents:
diff changeset
379 // in the scope that contains it.
a61af66fc99e Initial load
duke
parents:
diff changeset
380 class ReferenceProcessorMTMutator: StackObj {
a61af66fc99e Initial load
duke
parents:
diff changeset
381 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
382 ReferenceProcessor* _rp;
a61af66fc99e Initial load
duke
parents:
diff changeset
383 bool _saved_mt;
a61af66fc99e Initial load
duke
parents:
diff changeset
384
a61af66fc99e Initial load
duke
parents:
diff changeset
385 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
386 ReferenceProcessorMTMutator(ReferenceProcessor* rp,
a61af66fc99e Initial load
duke
parents:
diff changeset
387 bool mt):
a61af66fc99e Initial load
duke
parents:
diff changeset
388 _rp(rp) {
a61af66fc99e Initial load
duke
parents:
diff changeset
389 _saved_mt = _rp->discovery_is_mt();
a61af66fc99e Initial load
duke
parents:
diff changeset
390 _rp->set_mt_discovery(mt);
a61af66fc99e Initial load
duke
parents:
diff changeset
391 }
a61af66fc99e Initial load
duke
parents:
diff changeset
392
a61af66fc99e Initial load
duke
parents:
diff changeset
393 ~ReferenceProcessorMTMutator() {
a61af66fc99e Initial load
duke
parents:
diff changeset
394 _rp->set_mt_discovery(_saved_mt);
a61af66fc99e Initial load
duke
parents:
diff changeset
395 }
a61af66fc99e Initial load
duke
parents:
diff changeset
396 };
a61af66fc99e Initial load
duke
parents:
diff changeset
397
a61af66fc99e Initial load
duke
parents:
diff changeset
398
a61af66fc99e Initial load
duke
parents:
diff changeset
399 // A utility class to temporarily change the disposition
a61af66fc99e Initial load
duke
parents:
diff changeset
400 // of the "is_alive_non_header" closure field of the
a61af66fc99e Initial load
duke
parents:
diff changeset
401 // given ReferenceProcessor in the scope that contains it.
a61af66fc99e Initial load
duke
parents:
diff changeset
402 class ReferenceProcessorIsAliveMutator: StackObj {
a61af66fc99e Initial load
duke
parents:
diff changeset
403 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
404 ReferenceProcessor* _rp;
a61af66fc99e Initial load
duke
parents:
diff changeset
405 BoolObjectClosure* _saved_cl;
a61af66fc99e Initial load
duke
parents:
diff changeset
406
a61af66fc99e Initial load
duke
parents:
diff changeset
407 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
408 ReferenceProcessorIsAliveMutator(ReferenceProcessor* rp,
a61af66fc99e Initial load
duke
parents:
diff changeset
409 BoolObjectClosure* cl):
a61af66fc99e Initial load
duke
parents:
diff changeset
410 _rp(rp) {
a61af66fc99e Initial load
duke
parents:
diff changeset
411 _saved_cl = _rp->is_alive_non_header();
a61af66fc99e Initial load
duke
parents:
diff changeset
412 _rp->set_is_alive_non_header(cl);
a61af66fc99e Initial load
duke
parents:
diff changeset
413 }
a61af66fc99e Initial load
duke
parents:
diff changeset
414
a61af66fc99e Initial load
duke
parents:
diff changeset
415 ~ReferenceProcessorIsAliveMutator() {
a61af66fc99e Initial load
duke
parents:
diff changeset
416 _rp->set_is_alive_non_header(_saved_cl);
a61af66fc99e Initial load
duke
parents:
diff changeset
417 }
a61af66fc99e Initial load
duke
parents:
diff changeset
418 };
a61af66fc99e Initial load
duke
parents:
diff changeset
419
a61af66fc99e Initial load
duke
parents:
diff changeset
420 // A utility class to temporarily change the disposition
a61af66fc99e Initial load
duke
parents:
diff changeset
421 // of the "discovery_is_atomic" field of the
a61af66fc99e Initial load
duke
parents:
diff changeset
422 // given ReferenceProcessor in the scope that contains it.
a61af66fc99e Initial load
duke
parents:
diff changeset
423 class ReferenceProcessorAtomicMutator: StackObj {
a61af66fc99e Initial load
duke
parents:
diff changeset
424 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
425 ReferenceProcessor* _rp;
a61af66fc99e Initial load
duke
parents:
diff changeset
426 bool _saved_atomic_discovery;
a61af66fc99e Initial load
duke
parents:
diff changeset
427
a61af66fc99e Initial load
duke
parents:
diff changeset
428 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
429 ReferenceProcessorAtomicMutator(ReferenceProcessor* rp,
a61af66fc99e Initial load
duke
parents:
diff changeset
430 bool atomic):
a61af66fc99e Initial load
duke
parents:
diff changeset
431 _rp(rp) {
a61af66fc99e Initial load
duke
parents:
diff changeset
432 _saved_atomic_discovery = _rp->discovery_is_atomic();
a61af66fc99e Initial load
duke
parents:
diff changeset
433 _rp->set_atomic_discovery(atomic);
a61af66fc99e Initial load
duke
parents:
diff changeset
434 }
a61af66fc99e Initial load
duke
parents:
diff changeset
435
a61af66fc99e Initial load
duke
parents:
diff changeset
436 ~ReferenceProcessorAtomicMutator() {
a61af66fc99e Initial load
duke
parents:
diff changeset
437 _rp->set_atomic_discovery(_saved_atomic_discovery);
a61af66fc99e Initial load
duke
parents:
diff changeset
438 }
a61af66fc99e Initial load
duke
parents:
diff changeset
439 };
a61af66fc99e Initial load
duke
parents:
diff changeset
440
a61af66fc99e Initial load
duke
parents:
diff changeset
441
a61af66fc99e Initial load
duke
parents:
diff changeset
442 // A utility class to temporarily change the MT processing
a61af66fc99e Initial load
duke
parents:
diff changeset
443 // disposition of the given ReferenceProcessor instance
a61af66fc99e Initial load
duke
parents:
diff changeset
444 // in the scope that contains it.
a61af66fc99e Initial load
duke
parents:
diff changeset
445 class ReferenceProcessorMTProcMutator: StackObj {
a61af66fc99e Initial load
duke
parents:
diff changeset
446 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
447 ReferenceProcessor* _rp;
a61af66fc99e Initial load
duke
parents:
diff changeset
448 bool _saved_mt;
a61af66fc99e Initial load
duke
parents:
diff changeset
449
a61af66fc99e Initial load
duke
parents:
diff changeset
450 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
451 ReferenceProcessorMTProcMutator(ReferenceProcessor* rp,
a61af66fc99e Initial load
duke
parents:
diff changeset
452 bool mt):
a61af66fc99e Initial load
duke
parents:
diff changeset
453 _rp(rp) {
a61af66fc99e Initial load
duke
parents:
diff changeset
454 _saved_mt = _rp->processing_is_mt();
a61af66fc99e Initial load
duke
parents:
diff changeset
455 _rp->set_mt_processing(mt);
a61af66fc99e Initial load
duke
parents:
diff changeset
456 }
a61af66fc99e Initial load
duke
parents:
diff changeset
457
a61af66fc99e Initial load
duke
parents:
diff changeset
458 ~ReferenceProcessorMTProcMutator() {
a61af66fc99e Initial load
duke
parents:
diff changeset
459 _rp->set_mt_processing(_saved_mt);
a61af66fc99e Initial load
duke
parents:
diff changeset
460 }
a61af66fc99e Initial load
duke
parents:
diff changeset
461 };
a61af66fc99e Initial load
duke
parents:
diff changeset
462
a61af66fc99e Initial load
duke
parents:
diff changeset
463
a61af66fc99e Initial load
duke
parents:
diff changeset
464 // This class is an interface used to implement task execution for the
a61af66fc99e Initial load
duke
parents:
diff changeset
465 // reference processing.
a61af66fc99e Initial load
duke
parents:
diff changeset
466 class AbstractRefProcTaskExecutor {
a61af66fc99e Initial load
duke
parents:
diff changeset
467 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
468
a61af66fc99e Initial load
duke
parents:
diff changeset
469 // Abstract tasks to execute.
a61af66fc99e Initial load
duke
parents:
diff changeset
470 class ProcessTask;
a61af66fc99e Initial load
duke
parents:
diff changeset
471 class EnqueueTask;
a61af66fc99e Initial load
duke
parents:
diff changeset
472
a61af66fc99e Initial load
duke
parents:
diff changeset
473 // Executes a task using worker threads.
a61af66fc99e Initial load
duke
parents:
diff changeset
474 virtual void execute(ProcessTask& task) = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
475 virtual void execute(EnqueueTask& task) = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
476
a61af66fc99e Initial load
duke
parents:
diff changeset
477 // Switch to single threaded mode.
a61af66fc99e Initial load
duke
parents:
diff changeset
478 virtual void set_single_threaded_mode() { };
a61af66fc99e Initial load
duke
parents:
diff changeset
479 };
a61af66fc99e Initial load
duke
parents:
diff changeset
480
a61af66fc99e Initial load
duke
parents:
diff changeset
481 // Abstract reference processing task to execute.
a61af66fc99e Initial load
duke
parents:
diff changeset
482 class AbstractRefProcTaskExecutor::ProcessTask {
a61af66fc99e Initial load
duke
parents:
diff changeset
483 protected:
a61af66fc99e Initial load
duke
parents:
diff changeset
484 ProcessTask(ReferenceProcessor& ref_processor,
a61af66fc99e Initial load
duke
parents:
diff changeset
485 DiscoveredList refs_lists[],
a61af66fc99e Initial load
duke
parents:
diff changeset
486 bool marks_oops_alive)
a61af66fc99e Initial load
duke
parents:
diff changeset
487 : _ref_processor(ref_processor),
a61af66fc99e Initial load
duke
parents:
diff changeset
488 _refs_lists(refs_lists),
a61af66fc99e Initial load
duke
parents:
diff changeset
489 _marks_oops_alive(marks_oops_alive)
a61af66fc99e Initial load
duke
parents:
diff changeset
490 { }
a61af66fc99e Initial load
duke
parents:
diff changeset
491
a61af66fc99e Initial load
duke
parents:
diff changeset
492 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
493 virtual void work(unsigned int work_id, BoolObjectClosure& is_alive,
a61af66fc99e Initial load
duke
parents:
diff changeset
494 OopClosure& keep_alive,
a61af66fc99e Initial load
duke
parents:
diff changeset
495 VoidClosure& complete_gc) = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
496
a61af66fc99e Initial load
duke
parents:
diff changeset
497 // Returns true if a task marks some oops as alive.
a61af66fc99e Initial load
duke
parents:
diff changeset
498 bool marks_oops_alive() const
a61af66fc99e Initial load
duke
parents:
diff changeset
499 { return _marks_oops_alive; }
a61af66fc99e Initial load
duke
parents:
diff changeset
500
a61af66fc99e Initial load
duke
parents:
diff changeset
501 protected:
a61af66fc99e Initial load
duke
parents:
diff changeset
502 ReferenceProcessor& _ref_processor;
a61af66fc99e Initial load
duke
parents:
diff changeset
503 DiscoveredList* _refs_lists;
a61af66fc99e Initial load
duke
parents:
diff changeset
504 const bool _marks_oops_alive;
a61af66fc99e Initial load
duke
parents:
diff changeset
505 };
a61af66fc99e Initial load
duke
parents:
diff changeset
506
a61af66fc99e Initial load
duke
parents:
diff changeset
507 // Abstract reference processing task to execute.
a61af66fc99e Initial load
duke
parents:
diff changeset
508 class AbstractRefProcTaskExecutor::EnqueueTask {
a61af66fc99e Initial load
duke
parents:
diff changeset
509 protected:
a61af66fc99e Initial load
duke
parents:
diff changeset
510 EnqueueTask(ReferenceProcessor& ref_processor,
a61af66fc99e Initial load
duke
parents:
diff changeset
511 DiscoveredList refs_lists[],
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
512 HeapWord* pending_list_addr,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
513 oop sentinel_ref,
a61af66fc99e Initial load
duke
parents:
diff changeset
514 int n_queues)
a61af66fc99e Initial load
duke
parents:
diff changeset
515 : _ref_processor(ref_processor),
a61af66fc99e Initial load
duke
parents:
diff changeset
516 _refs_lists(refs_lists),
a61af66fc99e Initial load
duke
parents:
diff changeset
517 _pending_list_addr(pending_list_addr),
a61af66fc99e Initial load
duke
parents:
diff changeset
518 _sentinel_ref(sentinel_ref),
a61af66fc99e Initial load
duke
parents:
diff changeset
519 _n_queues(n_queues)
a61af66fc99e Initial load
duke
parents:
diff changeset
520 { }
a61af66fc99e Initial load
duke
parents:
diff changeset
521
a61af66fc99e Initial load
duke
parents:
diff changeset
522 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
523 virtual void work(unsigned int work_id) = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
524
a61af66fc99e Initial load
duke
parents:
diff changeset
525 protected:
a61af66fc99e Initial load
duke
parents:
diff changeset
526 ReferenceProcessor& _ref_processor;
a61af66fc99e Initial load
duke
parents:
diff changeset
527 DiscoveredList* _refs_lists;
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
528 HeapWord* _pending_list_addr;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
529 oop _sentinel_ref;
a61af66fc99e Initial load
duke
parents:
diff changeset
530 int _n_queues;
a61af66fc99e Initial load
duke
parents:
diff changeset
531 };