src/share/vm/gc_implementation/concurrentMarkSweep/cmsOopClosures.hpp

Wed, 23 Dec 2009 09:23:54 -0800

author
ysr
date
Wed, 23 Dec 2009 09:23:54 -0800
changeset 1580
e018e6884bd8
parent 1429
753cf9794df9
child 1907
c18cbe5936b8
permissions
-rw-r--r--

6631166: CMS: better heuristics when combatting fragmentation
Summary: Autonomic per-worker free block cache sizing, tunable coalition policies, fixes to per-size block statistics, retuned gain and bandwidth of some feedback loop filters to allow quicker reactivity to abrupt changes in ambient demand, and other heuristics to reduce fragmentation of the CMS old gen. Also tightened some assertions, including those related to locking.
Reviewed-by: jmasa

duke@435 1 /*
duke@435 2 * Copyright (c) 2007 Sun Microsystems, Inc. All Rights Reserved.
duke@435 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
duke@435 4 *
duke@435 5 * This code is free software; you can redistribute it and/or modify it
duke@435 6 * under the terms of the GNU General Public License version 2 only, as
duke@435 7 * published by the Free Software Foundation.
duke@435 8 *
duke@435 9 * This code is distributed in the hope that it will be useful, but WITHOUT
duke@435 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
duke@435 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
duke@435 12 * version 2 for more details (a copy is included in the LICENSE file that
duke@435 13 * accompanied this code).
duke@435 14 *
duke@435 15 * You should have received a copy of the GNU General Public License version
duke@435 16 * 2 along with this work; if not, write to the Free Software Foundation,
duke@435 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
duke@435 18 *
duke@435 19 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
duke@435 20 * CA 95054 USA or visit www.sun.com if you need additional information or
duke@435 21 * have any questions.
duke@435 22 *
duke@435 23 */
duke@435 24
duke@435 25 /////////////////////////////////////////////////////////////////
duke@435 26 // Closures used by ConcurrentMarkSweepGeneration's collector
duke@435 27 /////////////////////////////////////////////////////////////////
duke@435 28 class ConcurrentMarkSweepGeneration;
duke@435 29 class CMSBitMap;
duke@435 30 class CMSMarkStack;
duke@435 31 class CMSCollector;
duke@435 32 class MarkFromRootsClosure;
duke@435 33 class Par_MarkFromRootsClosure;
duke@435 34
coleenp@548 35 // Decode the oop and call do_oop on it.
coleenp@548 36 #define DO_OOP_WORK_DEFN \
coleenp@548 37 void do_oop(oop obj); \
coleenp@548 38 template <class T> inline void do_oop_work(T* p) { \
coleenp@548 39 T heap_oop = oopDesc::load_heap_oop(p); \
coleenp@548 40 if (!oopDesc::is_null(heap_oop)) { \
coleenp@548 41 oop obj = oopDesc::decode_heap_oop_not_null(heap_oop); \
coleenp@548 42 do_oop(obj); \
coleenp@548 43 } \
coleenp@548 44 }
coleenp@548 45
duke@435 46 class MarkRefsIntoClosure: public OopsInGenClosure {
coleenp@548 47 private:
coleenp@548 48 const MemRegion _span;
coleenp@548 49 CMSBitMap* _bitMap;
coleenp@548 50 protected:
coleenp@548 51 DO_OOP_WORK_DEFN
duke@435 52 public:
jrose@1429 53 MarkRefsIntoClosure(MemRegion span, CMSBitMap* bitMap);
coleenp@548 54 virtual void do_oop(oop* p);
coleenp@548 55 virtual void do_oop(narrowOop* p);
coleenp@548 56 inline void do_oop_nv(oop* p) { MarkRefsIntoClosure::do_oop_work(p); }
coleenp@548 57 inline void do_oop_nv(narrowOop* p) { MarkRefsIntoClosure::do_oop_work(p); }
duke@435 58 bool do_header() { return true; }
duke@435 59 Prefetch::style prefetch_style() {
duke@435 60 return Prefetch::do_read;
duke@435 61 }
duke@435 62 };
duke@435 63
duke@435 64 // A variant of the above used in certain kinds of CMS
duke@435 65 // marking verification.
duke@435 66 class MarkRefsIntoVerifyClosure: public OopsInGenClosure {
coleenp@548 67 private:
coleenp@548 68 const MemRegion _span;
coleenp@548 69 CMSBitMap* _verification_bm;
coleenp@548 70 CMSBitMap* _cms_bm;
coleenp@548 71 protected:
coleenp@548 72 DO_OOP_WORK_DEFN
duke@435 73 public:
duke@435 74 MarkRefsIntoVerifyClosure(MemRegion span, CMSBitMap* verification_bm,
jrose@1429 75 CMSBitMap* cms_bm);
coleenp@548 76 virtual void do_oop(oop* p);
coleenp@548 77 virtual void do_oop(narrowOop* p);
coleenp@548 78 inline void do_oop_nv(oop* p) { MarkRefsIntoVerifyClosure::do_oop_work(p); }
coleenp@548 79 inline void do_oop_nv(narrowOop* p) { MarkRefsIntoVerifyClosure::do_oop_work(p); }
duke@435 80 bool do_header() { return true; }
duke@435 81 Prefetch::style prefetch_style() {
duke@435 82 return Prefetch::do_read;
duke@435 83 }
duke@435 84 };
duke@435 85
jmasa@1370 86 // KlassRememberingOopClosure is used when marking of the permanent generation
jmasa@1370 87 // is being done. It adds fields to support revisiting of klasses
jmasa@1370 88 // for class unloading. _should_remember_klasses should be set to
jmasa@1370 89 // indicate if klasses should be remembered. Currently that is whenever
jmasa@1370 90 // CMS class unloading is turned on. The _revisit_stack is used
jmasa@1370 91 // to save the klasses for later processing.
jmasa@1370 92 class KlassRememberingOopClosure : public OopClosure {
jmasa@1370 93 protected:
jmasa@1370 94 CMSCollector* _collector;
jmasa@1370 95 CMSMarkStack* _revisit_stack;
jmasa@1370 96 bool const _should_remember_klasses;
jmasa@1370 97 public:
jmasa@1370 98 void check_remember_klasses() const PRODUCT_RETURN;
jmasa@1370 99 virtual const bool should_remember_klasses() const {
jmasa@1370 100 check_remember_klasses();
jmasa@1370 101 return _should_remember_klasses;
jmasa@1370 102 }
jmasa@1370 103 virtual void remember_klass(Klass* k);
jmasa@1370 104
jmasa@1370 105 KlassRememberingOopClosure(CMSCollector* collector,
jmasa@1370 106 ReferenceProcessor* rp,
jmasa@1370 107 CMSMarkStack* revisit_stack);
jmasa@1370 108 };
jmasa@1370 109
jmasa@1370 110 // Similar to KlassRememberingOopClosure for use when multiple
jmasa@1370 111 // GC threads will execute the closure.
jmasa@1370 112
jmasa@1370 113 class Par_KlassRememberingOopClosure : public KlassRememberingOopClosure {
jmasa@1370 114 public:
jmasa@1370 115 Par_KlassRememberingOopClosure(CMSCollector* collector,
jmasa@1370 116 ReferenceProcessor* rp,
jmasa@1370 117 CMSMarkStack* revisit_stack):
jmasa@1370 118 KlassRememberingOopClosure(collector, rp, revisit_stack) {}
jmasa@1370 119 virtual void remember_klass(Klass* k);
jmasa@1370 120 };
jmasa@1370 121
duke@435 122 // The non-parallel version (the parallel version appears further below).
jmasa@1370 123 class PushAndMarkClosure: public KlassRememberingOopClosure {
coleenp@548 124 private:
coleenp@548 125 MemRegion _span;
coleenp@548 126 CMSBitMap* _bit_map;
coleenp@548 127 CMSBitMap* _mod_union_table;
coleenp@548 128 CMSMarkStack* _mark_stack;
coleenp@548 129 bool _concurrent_precleaning;
coleenp@548 130 protected:
coleenp@548 131 DO_OOP_WORK_DEFN
duke@435 132 public:
duke@435 133 PushAndMarkClosure(CMSCollector* collector,
duke@435 134 MemRegion span,
duke@435 135 ReferenceProcessor* rp,
duke@435 136 CMSBitMap* bit_map,
duke@435 137 CMSBitMap* mod_union_table,
coleenp@548 138 CMSMarkStack* mark_stack,
coleenp@548 139 CMSMarkStack* revisit_stack,
coleenp@548 140 bool concurrent_precleaning);
coleenp@548 141 virtual void do_oop(oop* p);
coleenp@548 142 virtual void do_oop(narrowOop* p);
coleenp@548 143 inline void do_oop_nv(oop* p) { PushAndMarkClosure::do_oop_work(p); }
coleenp@548 144 inline void do_oop_nv(narrowOop* p) { PushAndMarkClosure::do_oop_work(p); }
duke@435 145 bool do_header() { return true; }
duke@435 146 Prefetch::style prefetch_style() {
duke@435 147 return Prefetch::do_read;
duke@435 148 }
ysr@1376 149 // In support of class unloading
ysr@1376 150 virtual const bool should_remember_mdo() const {
ysr@1376 151 return false;
ysr@1376 152 // return _should_remember_klasses;
ysr@1376 153 }
ysr@1376 154 virtual void remember_mdo(DataLayout* v);
duke@435 155 };
duke@435 156
duke@435 157 // In the parallel case, the revisit stack, the bit map and the
duke@435 158 // reference processor are currently all shared. Access to
duke@435 159 // these shared mutable structures must use appropriate
duke@435 160 // synchronization (for instance, via CAS). The marking stack
duke@435 161 // used in the non-parallel case above is here replaced with
duke@435 162 // an OopTaskQueue structure to allow efficient work stealing.
jmasa@1370 163 class Par_PushAndMarkClosure: public Par_KlassRememberingOopClosure {
coleenp@548 164 private:
coleenp@548 165 MemRegion _span;
coleenp@548 166 CMSBitMap* _bit_map;
coleenp@548 167 OopTaskQueue* _work_queue;
coleenp@548 168 protected:
coleenp@548 169 DO_OOP_WORK_DEFN
duke@435 170 public:
duke@435 171 Par_PushAndMarkClosure(CMSCollector* collector,
duke@435 172 MemRegion span,
duke@435 173 ReferenceProcessor* rp,
duke@435 174 CMSBitMap* bit_map,
duke@435 175 OopTaskQueue* work_queue,
duke@435 176 CMSMarkStack* revisit_stack);
coleenp@548 177 virtual void do_oop(oop* p);
coleenp@548 178 virtual void do_oop(narrowOop* p);
coleenp@548 179 inline void do_oop_nv(oop* p) { Par_PushAndMarkClosure::do_oop_work(p); }
coleenp@548 180 inline void do_oop_nv(narrowOop* p) { Par_PushAndMarkClosure::do_oop_work(p); }
duke@435 181 bool do_header() { return true; }
duke@435 182 Prefetch::style prefetch_style() {
duke@435 183 return Prefetch::do_read;
duke@435 184 }
ysr@1376 185 // In support of class unloading
ysr@1376 186 virtual const bool should_remember_mdo() const {
ysr@1376 187 return false;
ysr@1376 188 // return _should_remember_klasses;
ysr@1376 189 }
ysr@1376 190 virtual void remember_mdo(DataLayout* v);
duke@435 191 };
duke@435 192
duke@435 193 // The non-parallel version (the parallel version appears further below).
duke@435 194 class MarkRefsIntoAndScanClosure: public OopsInGenClosure {
coleenp@548 195 private:
coleenp@548 196 MemRegion _span;
coleenp@548 197 CMSBitMap* _bit_map;
coleenp@548 198 CMSMarkStack* _mark_stack;
coleenp@548 199 PushAndMarkClosure _pushAndMarkClosure;
coleenp@548 200 CMSCollector* _collector;
coleenp@548 201 Mutex* _freelistLock;
coleenp@548 202 bool _yield;
duke@435 203 // Whether closure is being used for concurrent precleaning
coleenp@548 204 bool _concurrent_precleaning;
coleenp@548 205 protected:
coleenp@548 206 DO_OOP_WORK_DEFN
duke@435 207 public:
duke@435 208 MarkRefsIntoAndScanClosure(MemRegion span,
duke@435 209 ReferenceProcessor* rp,
duke@435 210 CMSBitMap* bit_map,
duke@435 211 CMSBitMap* mod_union_table,
coleenp@548 212 CMSMarkStack* mark_stack,
coleenp@548 213 CMSMarkStack* revisit_stack,
duke@435 214 CMSCollector* collector,
duke@435 215 bool should_yield,
duke@435 216 bool concurrent_precleaning);
coleenp@548 217 virtual void do_oop(oop* p);
coleenp@548 218 virtual void do_oop(narrowOop* p);
coleenp@548 219 inline void do_oop_nv(oop* p) { MarkRefsIntoAndScanClosure::do_oop_work(p); }
coleenp@548 220 inline void do_oop_nv(narrowOop* p) { MarkRefsIntoAndScanClosure::do_oop_work(p); }
duke@435 221 bool do_header() { return true; }
duke@435 222 Prefetch::style prefetch_style() {
duke@435 223 return Prefetch::do_read;
duke@435 224 }
duke@435 225 void set_freelistLock(Mutex* m) {
duke@435 226 _freelistLock = m;
duke@435 227 }
jmasa@1370 228 virtual const bool should_remember_klasses() const {
jmasa@1370 229 return _pushAndMarkClosure.should_remember_klasses();
jmasa@1370 230 }
jmasa@1370 231 virtual void remember_klass(Klass* k) {
jmasa@1370 232 _pushAndMarkClosure.remember_klass(k);
jmasa@1370 233 }
duke@435 234
duke@435 235 private:
duke@435 236 inline void do_yield_check();
duke@435 237 void do_yield_work();
duke@435 238 bool take_from_overflow_list();
duke@435 239 };
duke@435 240
duke@435 241 // Tn this, the parallel avatar of MarkRefsIntoAndScanClosure, the revisit
duke@435 242 // stack and the bitMap are shared, so access needs to be suitably
duke@435 243 // sycnhronized. An OopTaskQueue structure, supporting efficient
duke@435 244 // workstealing, replaces a CMSMarkStack for storing grey objects.
duke@435 245 class Par_MarkRefsIntoAndScanClosure: public OopsInGenClosure {
coleenp@548 246 private:
coleenp@548 247 MemRegion _span;
coleenp@548 248 CMSBitMap* _bit_map;
coleenp@548 249 OopTaskQueue* _work_queue;
coleenp@548 250 const uint _low_water_mark;
coleenp@548 251 Par_PushAndMarkClosure _par_pushAndMarkClosure;
coleenp@548 252 protected:
coleenp@548 253 DO_OOP_WORK_DEFN
duke@435 254 public:
duke@435 255 Par_MarkRefsIntoAndScanClosure(CMSCollector* collector,
duke@435 256 MemRegion span,
duke@435 257 ReferenceProcessor* rp,
duke@435 258 CMSBitMap* bit_map,
duke@435 259 OopTaskQueue* work_queue,
duke@435 260 CMSMarkStack* revisit_stack);
coleenp@548 261 virtual void do_oop(oop* p);
coleenp@548 262 virtual void do_oop(narrowOop* p);
coleenp@548 263 inline void do_oop_nv(oop* p) { Par_MarkRefsIntoAndScanClosure::do_oop_work(p); }
coleenp@548 264 inline void do_oop_nv(narrowOop* p) { Par_MarkRefsIntoAndScanClosure::do_oop_work(p); }
duke@435 265 bool do_header() { return true; }
jmasa@1370 266 // When ScanMarkedObjectsAgainClosure is used,
jmasa@1370 267 // it passes [Par_]MarkRefsIntoAndScanClosure to oop_oop_iterate(),
jmasa@1370 268 // and this delegation is used.
jmasa@1370 269 virtual const bool should_remember_klasses() const {
jmasa@1370 270 return _par_pushAndMarkClosure.should_remember_klasses();
jmasa@1370 271 }
jmasa@1370 272 // See comment on should_remember_klasses() above.
jmasa@1370 273 virtual void remember_klass(Klass* k) {
jmasa@1370 274 _par_pushAndMarkClosure.remember_klass(k);
jmasa@1370 275 }
duke@435 276 Prefetch::style prefetch_style() {
duke@435 277 return Prefetch::do_read;
duke@435 278 }
duke@435 279 void trim_queue(uint size);
duke@435 280 };
duke@435 281
duke@435 282 // This closure is used during the concurrent marking phase
duke@435 283 // following the first checkpoint. Its use is buried in
duke@435 284 // the closure MarkFromRootsClosure.
jmasa@1370 285 class PushOrMarkClosure: public KlassRememberingOopClosure {
coleenp@548 286 private:
coleenp@548 287 MemRegion _span;
coleenp@548 288 CMSBitMap* _bitMap;
coleenp@548 289 CMSMarkStack* _markStack;
coleenp@548 290 HeapWord* const _finger;
coleenp@548 291 MarkFromRootsClosure* const
coleenp@548 292 _parent;
coleenp@548 293 protected:
coleenp@548 294 DO_OOP_WORK_DEFN
duke@435 295 public:
duke@435 296 PushOrMarkClosure(CMSCollector* cms_collector,
duke@435 297 MemRegion span,
duke@435 298 CMSBitMap* bitMap,
coleenp@548 299 CMSMarkStack* markStack,
coleenp@548 300 CMSMarkStack* revisitStack,
coleenp@548 301 HeapWord* finger,
duke@435 302 MarkFromRootsClosure* parent);
coleenp@548 303 virtual void do_oop(oop* p);
coleenp@548 304 virtual void do_oop(narrowOop* p);
coleenp@548 305 inline void do_oop_nv(oop* p) { PushOrMarkClosure::do_oop_work(p); }
coleenp@548 306 inline void do_oop_nv(narrowOop* p) { PushOrMarkClosure::do_oop_work(p); }
ysr@1376 307 // In support of class unloading
ysr@1376 308 virtual const bool should_remember_mdo() const {
ysr@1376 309 return false;
ysr@1376 310 // return _should_remember_klasses;
ysr@1376 311 }
ysr@1376 312 virtual void remember_mdo(DataLayout* v);
ysr@1376 313
duke@435 314 // Deal with a stack overflow condition
duke@435 315 void handle_stack_overflow(HeapWord* lost);
duke@435 316 private:
duke@435 317 inline void do_yield_check();
duke@435 318 };
duke@435 319
duke@435 320 // A parallel (MT) version of the above.
duke@435 321 // This closure is used during the concurrent marking phase
duke@435 322 // following the first checkpoint. Its use is buried in
duke@435 323 // the closure Par_MarkFromRootsClosure.
jmasa@1370 324 class Par_PushOrMarkClosure: public Par_KlassRememberingOopClosure {
coleenp@548 325 private:
duke@435 326 MemRegion _whole_span;
duke@435 327 MemRegion _span; // local chunk
duke@435 328 CMSBitMap* _bit_map;
duke@435 329 OopTaskQueue* _work_queue;
duke@435 330 CMSMarkStack* _overflow_stack;
duke@435 331 HeapWord* const _finger;
duke@435 332 HeapWord** const _global_finger_addr;
coleenp@548 333 Par_MarkFromRootsClosure* const
coleenp@548 334 _parent;
coleenp@548 335 protected:
coleenp@548 336 DO_OOP_WORK_DEFN
duke@435 337 public:
duke@435 338 Par_PushOrMarkClosure(CMSCollector* cms_collector,
coleenp@548 339 MemRegion span,
coleenp@548 340 CMSBitMap* bit_map,
coleenp@548 341 OopTaskQueue* work_queue,
coleenp@548 342 CMSMarkStack* mark_stack,
coleenp@548 343 CMSMarkStack* revisit_stack,
coleenp@548 344 HeapWord* finger,
coleenp@548 345 HeapWord** global_finger_addr,
coleenp@548 346 Par_MarkFromRootsClosure* parent);
coleenp@548 347 virtual void do_oop(oop* p);
coleenp@548 348 virtual void do_oop(narrowOop* p);
coleenp@548 349 inline void do_oop_nv(oop* p) { Par_PushOrMarkClosure::do_oop_work(p); }
coleenp@548 350 inline void do_oop_nv(narrowOop* p) { Par_PushOrMarkClosure::do_oop_work(p); }
ysr@1376 351 // In support of class unloading
ysr@1376 352 virtual const bool should_remember_mdo() const {
ysr@1376 353 return false;
ysr@1376 354 // return _should_remember_klasses;
ysr@1376 355 }
ysr@1376 356 virtual void remember_mdo(DataLayout* v);
ysr@1376 357
duke@435 358 // Deal with a stack overflow condition
duke@435 359 void handle_stack_overflow(HeapWord* lost);
duke@435 360 private:
duke@435 361 inline void do_yield_check();
duke@435 362 };
duke@435 363
duke@435 364 // For objects in CMS generation, this closure marks
duke@435 365 // given objects (transitively) as being reachable/live.
duke@435 366 // This is currently used during the (weak) reference object
ysr@887 367 // processing phase of the CMS final checkpoint step, as
ysr@887 368 // well as during the concurrent precleaning of the discovered
ysr@887 369 // reference lists.
jmasa@1370 370 class CMSKeepAliveClosure: public KlassRememberingOopClosure {
coleenp@548 371 private:
ysr@578 372 const MemRegion _span;
duke@435 373 CMSMarkStack* _mark_stack;
duke@435 374 CMSBitMap* _bit_map;
ysr@887 375 bool _concurrent_precleaning;
coleenp@548 376 protected:
coleenp@548 377 DO_OOP_WORK_DEFN
duke@435 378 public:
duke@435 379 CMSKeepAliveClosure(CMSCollector* collector, MemRegion span,
ysr@887 380 CMSBitMap* bit_map, CMSMarkStack* mark_stack,
jmasa@1370 381 CMSMarkStack* revisit_stack, bool cpc);
ysr@887 382 bool concurrent_precleaning() const { return _concurrent_precleaning; }
coleenp@548 383 virtual void do_oop(oop* p);
coleenp@548 384 virtual void do_oop(narrowOop* p);
coleenp@548 385 inline void do_oop_nv(oop* p) { CMSKeepAliveClosure::do_oop_work(p); }
coleenp@548 386 inline void do_oop_nv(narrowOop* p) { CMSKeepAliveClosure::do_oop_work(p); }
duke@435 387 };
duke@435 388
jmasa@1370 389 class CMSInnerParMarkAndPushClosure: public Par_KlassRememberingOopClosure {
coleenp@548 390 private:
duke@435 391 MemRegion _span;
duke@435 392 OopTaskQueue* _work_queue;
duke@435 393 CMSBitMap* _bit_map;
coleenp@548 394 protected:
coleenp@548 395 DO_OOP_WORK_DEFN
duke@435 396 public:
duke@435 397 CMSInnerParMarkAndPushClosure(CMSCollector* collector,
duke@435 398 MemRegion span, CMSBitMap* bit_map,
jmasa@1370 399 CMSMarkStack* revisit_stack,
jmasa@1370 400 OopTaskQueue* work_queue);
coleenp@548 401 virtual void do_oop(oop* p);
coleenp@548 402 virtual void do_oop(narrowOop* p);
coleenp@548 403 inline void do_oop_nv(oop* p) { CMSInnerParMarkAndPushClosure::do_oop_work(p); }
coleenp@548 404 inline void do_oop_nv(narrowOop* p) { CMSInnerParMarkAndPushClosure::do_oop_work(p); }
duke@435 405 };
duke@435 406
duke@435 407 // A parallel (MT) version of the above, used when
duke@435 408 // reference processing is parallel; the only difference
duke@435 409 // is in the do_oop method.
jmasa@1370 410 class CMSParKeepAliveClosure: public Par_KlassRememberingOopClosure {
coleenp@548 411 private:
duke@435 412 MemRegion _span;
duke@435 413 OopTaskQueue* _work_queue;
duke@435 414 CMSBitMap* _bit_map;
coleenp@548 415 CMSInnerParMarkAndPushClosure
coleenp@548 416 _mark_and_push;
duke@435 417 const uint _low_water_mark;
duke@435 418 void trim_queue(uint max);
coleenp@548 419 protected:
coleenp@548 420 DO_OOP_WORK_DEFN
duke@435 421 public:
duke@435 422 CMSParKeepAliveClosure(CMSCollector* collector, MemRegion span,
jmasa@1370 423 CMSBitMap* bit_map, CMSMarkStack* revisit_stack,
jmasa@1370 424 OopTaskQueue* work_queue);
coleenp@548 425 virtual void do_oop(oop* p);
coleenp@548 426 virtual void do_oop(narrowOop* p);
coleenp@548 427 inline void do_oop_nv(oop* p) { CMSParKeepAliveClosure::do_oop_work(p); }
coleenp@548 428 inline void do_oop_nv(narrowOop* p) { CMSParKeepAliveClosure::do_oop_work(p); }
duke@435 429 };

mercurial