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

Wed, 02 Sep 2009 00:04:29 -0700

author
ysr
date
Wed, 02 Sep 2009 00:04:29 -0700
changeset 1376
8b46c4d82093
parent 1370
05f89f00a864
child 1428
54b3b351d6f9
permissions
-rw-r--r--

4957990: Perm heap bloat in JVM
Summary: Treat ProfileData in MDO's as a source of weak, not strong, roots. Fixes the bug for stop-world collection -- the case of concurrent collection will be fixed separately.
Reviewed-by: jcoomes, jmasa, kvn, never

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 const bool _should_do_nmethods;
coleenp@548 51 protected:
coleenp@548 52 DO_OOP_WORK_DEFN
duke@435 53 public:
duke@435 54 MarkRefsIntoClosure(MemRegion span, CMSBitMap* bitMap,
duke@435 55 bool should_do_nmethods);
coleenp@548 56 virtual void do_oop(oop* p);
coleenp@548 57 virtual void do_oop(narrowOop* p);
coleenp@548 58 inline void do_oop_nv(oop* p) { MarkRefsIntoClosure::do_oop_work(p); }
coleenp@548 59 inline void do_oop_nv(narrowOop* p) { MarkRefsIntoClosure::do_oop_work(p); }
duke@435 60 bool do_header() { return true; }
duke@435 61 virtual const bool do_nmethods() const {
duke@435 62 return _should_do_nmethods;
duke@435 63 }
duke@435 64 Prefetch::style prefetch_style() {
duke@435 65 return Prefetch::do_read;
duke@435 66 }
duke@435 67 };
duke@435 68
duke@435 69 // A variant of the above used in certain kinds of CMS
duke@435 70 // marking verification.
duke@435 71 class MarkRefsIntoVerifyClosure: public OopsInGenClosure {
coleenp@548 72 private:
coleenp@548 73 const MemRegion _span;
coleenp@548 74 CMSBitMap* _verification_bm;
coleenp@548 75 CMSBitMap* _cms_bm;
coleenp@548 76 const bool _should_do_nmethods;
coleenp@548 77 protected:
coleenp@548 78 DO_OOP_WORK_DEFN
duke@435 79 public:
duke@435 80 MarkRefsIntoVerifyClosure(MemRegion span, CMSBitMap* verification_bm,
duke@435 81 CMSBitMap* cms_bm, bool should_do_nmethods);
coleenp@548 82 virtual void do_oop(oop* p);
coleenp@548 83 virtual void do_oop(narrowOop* p);
coleenp@548 84 inline void do_oop_nv(oop* p) { MarkRefsIntoVerifyClosure::do_oop_work(p); }
coleenp@548 85 inline void do_oop_nv(narrowOop* p) { MarkRefsIntoVerifyClosure::do_oop_work(p); }
duke@435 86 bool do_header() { return true; }
duke@435 87 virtual const bool do_nmethods() const {
duke@435 88 return _should_do_nmethods;
duke@435 89 }
duke@435 90 Prefetch::style prefetch_style() {
duke@435 91 return Prefetch::do_read;
duke@435 92 }
duke@435 93 };
duke@435 94
jmasa@1370 95 // KlassRememberingOopClosure is used when marking of the permanent generation
jmasa@1370 96 // is being done. It adds fields to support revisiting of klasses
jmasa@1370 97 // for class unloading. _should_remember_klasses should be set to
jmasa@1370 98 // indicate if klasses should be remembered. Currently that is whenever
jmasa@1370 99 // CMS class unloading is turned on. The _revisit_stack is used
jmasa@1370 100 // to save the klasses for later processing.
jmasa@1370 101 class KlassRememberingOopClosure : public OopClosure {
jmasa@1370 102 protected:
jmasa@1370 103 CMSCollector* _collector;
jmasa@1370 104 CMSMarkStack* _revisit_stack;
jmasa@1370 105 bool const _should_remember_klasses;
jmasa@1370 106 public:
jmasa@1370 107 void check_remember_klasses() const PRODUCT_RETURN;
jmasa@1370 108 virtual const bool should_remember_klasses() const {
jmasa@1370 109 check_remember_klasses();
jmasa@1370 110 return _should_remember_klasses;
jmasa@1370 111 }
jmasa@1370 112 virtual void remember_klass(Klass* k);
jmasa@1370 113
jmasa@1370 114 KlassRememberingOopClosure(CMSCollector* collector,
jmasa@1370 115 ReferenceProcessor* rp,
jmasa@1370 116 CMSMarkStack* revisit_stack);
jmasa@1370 117 };
jmasa@1370 118
jmasa@1370 119 // Similar to KlassRememberingOopClosure for use when multiple
jmasa@1370 120 // GC threads will execute the closure.
jmasa@1370 121
jmasa@1370 122 class Par_KlassRememberingOopClosure : public KlassRememberingOopClosure {
jmasa@1370 123 public:
jmasa@1370 124 Par_KlassRememberingOopClosure(CMSCollector* collector,
jmasa@1370 125 ReferenceProcessor* rp,
jmasa@1370 126 CMSMarkStack* revisit_stack):
jmasa@1370 127 KlassRememberingOopClosure(collector, rp, revisit_stack) {}
jmasa@1370 128 virtual void remember_klass(Klass* k);
jmasa@1370 129 };
jmasa@1370 130
duke@435 131 // The non-parallel version (the parallel version appears further below).
jmasa@1370 132 class PushAndMarkClosure: public KlassRememberingOopClosure {
coleenp@548 133 private:
coleenp@548 134 MemRegion _span;
coleenp@548 135 CMSBitMap* _bit_map;
coleenp@548 136 CMSBitMap* _mod_union_table;
coleenp@548 137 CMSMarkStack* _mark_stack;
coleenp@548 138 bool _concurrent_precleaning;
coleenp@548 139 protected:
coleenp@548 140 DO_OOP_WORK_DEFN
duke@435 141 public:
duke@435 142 PushAndMarkClosure(CMSCollector* collector,
duke@435 143 MemRegion span,
duke@435 144 ReferenceProcessor* rp,
duke@435 145 CMSBitMap* bit_map,
duke@435 146 CMSBitMap* mod_union_table,
coleenp@548 147 CMSMarkStack* mark_stack,
coleenp@548 148 CMSMarkStack* revisit_stack,
coleenp@548 149 bool concurrent_precleaning);
coleenp@548 150 virtual void do_oop(oop* p);
coleenp@548 151 virtual void do_oop(narrowOop* p);
coleenp@548 152 inline void do_oop_nv(oop* p) { PushAndMarkClosure::do_oop_work(p); }
coleenp@548 153 inline void do_oop_nv(narrowOop* p) { PushAndMarkClosure::do_oop_work(p); }
duke@435 154 bool do_header() { return true; }
duke@435 155 Prefetch::style prefetch_style() {
duke@435 156 return Prefetch::do_read;
duke@435 157 }
ysr@1376 158 // In support of class unloading
ysr@1376 159 virtual const bool should_remember_mdo() const {
ysr@1376 160 return false;
ysr@1376 161 // return _should_remember_klasses;
ysr@1376 162 }
ysr@1376 163 virtual void remember_mdo(DataLayout* v);
duke@435 164 };
duke@435 165
duke@435 166 // In the parallel case, the revisit stack, the bit map and the
duke@435 167 // reference processor are currently all shared. Access to
duke@435 168 // these shared mutable structures must use appropriate
duke@435 169 // synchronization (for instance, via CAS). The marking stack
duke@435 170 // used in the non-parallel case above is here replaced with
duke@435 171 // an OopTaskQueue structure to allow efficient work stealing.
jmasa@1370 172 class Par_PushAndMarkClosure: public Par_KlassRememberingOopClosure {
coleenp@548 173 private:
coleenp@548 174 MemRegion _span;
coleenp@548 175 CMSBitMap* _bit_map;
coleenp@548 176 OopTaskQueue* _work_queue;
coleenp@548 177 protected:
coleenp@548 178 DO_OOP_WORK_DEFN
duke@435 179 public:
duke@435 180 Par_PushAndMarkClosure(CMSCollector* collector,
duke@435 181 MemRegion span,
duke@435 182 ReferenceProcessor* rp,
duke@435 183 CMSBitMap* bit_map,
duke@435 184 OopTaskQueue* work_queue,
duke@435 185 CMSMarkStack* revisit_stack);
coleenp@548 186 virtual void do_oop(oop* p);
coleenp@548 187 virtual void do_oop(narrowOop* p);
coleenp@548 188 inline void do_oop_nv(oop* p) { Par_PushAndMarkClosure::do_oop_work(p); }
coleenp@548 189 inline void do_oop_nv(narrowOop* p) { Par_PushAndMarkClosure::do_oop_work(p); }
duke@435 190 bool do_header() { return true; }
duke@435 191 Prefetch::style prefetch_style() {
duke@435 192 return Prefetch::do_read;
duke@435 193 }
ysr@1376 194 // In support of class unloading
ysr@1376 195 virtual const bool should_remember_mdo() const {
ysr@1376 196 return false;
ysr@1376 197 // return _should_remember_klasses;
ysr@1376 198 }
ysr@1376 199 virtual void remember_mdo(DataLayout* v);
duke@435 200 };
duke@435 201
duke@435 202 // The non-parallel version (the parallel version appears further below).
duke@435 203 class MarkRefsIntoAndScanClosure: public OopsInGenClosure {
coleenp@548 204 private:
coleenp@548 205 MemRegion _span;
coleenp@548 206 CMSBitMap* _bit_map;
coleenp@548 207 CMSMarkStack* _mark_stack;
coleenp@548 208 PushAndMarkClosure _pushAndMarkClosure;
coleenp@548 209 CMSCollector* _collector;
coleenp@548 210 Mutex* _freelistLock;
coleenp@548 211 bool _yield;
duke@435 212 // Whether closure is being used for concurrent precleaning
coleenp@548 213 bool _concurrent_precleaning;
coleenp@548 214 protected:
coleenp@548 215 DO_OOP_WORK_DEFN
duke@435 216 public:
duke@435 217 MarkRefsIntoAndScanClosure(MemRegion span,
duke@435 218 ReferenceProcessor* rp,
duke@435 219 CMSBitMap* bit_map,
duke@435 220 CMSBitMap* mod_union_table,
coleenp@548 221 CMSMarkStack* mark_stack,
coleenp@548 222 CMSMarkStack* revisit_stack,
duke@435 223 CMSCollector* collector,
duke@435 224 bool should_yield,
duke@435 225 bool concurrent_precleaning);
coleenp@548 226 virtual void do_oop(oop* p);
coleenp@548 227 virtual void do_oop(narrowOop* p);
coleenp@548 228 inline void do_oop_nv(oop* p) { MarkRefsIntoAndScanClosure::do_oop_work(p); }
coleenp@548 229 inline void do_oop_nv(narrowOop* p) { MarkRefsIntoAndScanClosure::do_oop_work(p); }
duke@435 230 bool do_header() { return true; }
duke@435 231 virtual const bool do_nmethods() const { return true; }
duke@435 232 Prefetch::style prefetch_style() {
duke@435 233 return Prefetch::do_read;
duke@435 234 }
duke@435 235 void set_freelistLock(Mutex* m) {
duke@435 236 _freelistLock = m;
duke@435 237 }
jmasa@1370 238 virtual const bool should_remember_klasses() const {
jmasa@1370 239 return _pushAndMarkClosure.should_remember_klasses();
jmasa@1370 240 }
jmasa@1370 241 virtual void remember_klass(Klass* k) {
jmasa@1370 242 _pushAndMarkClosure.remember_klass(k);
jmasa@1370 243 }
duke@435 244
duke@435 245 private:
duke@435 246 inline void do_yield_check();
duke@435 247 void do_yield_work();
duke@435 248 bool take_from_overflow_list();
duke@435 249 };
duke@435 250
duke@435 251 // Tn this, the parallel avatar of MarkRefsIntoAndScanClosure, the revisit
duke@435 252 // stack and the bitMap are shared, so access needs to be suitably
duke@435 253 // sycnhronized. An OopTaskQueue structure, supporting efficient
duke@435 254 // workstealing, replaces a CMSMarkStack for storing grey objects.
duke@435 255 class Par_MarkRefsIntoAndScanClosure: public OopsInGenClosure {
coleenp@548 256 private:
coleenp@548 257 MemRegion _span;
coleenp@548 258 CMSBitMap* _bit_map;
coleenp@548 259 OopTaskQueue* _work_queue;
coleenp@548 260 const uint _low_water_mark;
coleenp@548 261 Par_PushAndMarkClosure _par_pushAndMarkClosure;
coleenp@548 262 protected:
coleenp@548 263 DO_OOP_WORK_DEFN
duke@435 264 public:
duke@435 265 Par_MarkRefsIntoAndScanClosure(CMSCollector* collector,
duke@435 266 MemRegion span,
duke@435 267 ReferenceProcessor* rp,
duke@435 268 CMSBitMap* bit_map,
duke@435 269 OopTaskQueue* work_queue,
duke@435 270 CMSMarkStack* revisit_stack);
coleenp@548 271 virtual void do_oop(oop* p);
coleenp@548 272 virtual void do_oop(narrowOop* p);
coleenp@548 273 inline void do_oop_nv(oop* p) { Par_MarkRefsIntoAndScanClosure::do_oop_work(p); }
coleenp@548 274 inline void do_oop_nv(narrowOop* p) { Par_MarkRefsIntoAndScanClosure::do_oop_work(p); }
duke@435 275 bool do_header() { return true; }
duke@435 276 virtual const bool do_nmethods() const { return true; }
jmasa@1370 277 // When ScanMarkedObjectsAgainClosure is used,
jmasa@1370 278 // it passes [Par_]MarkRefsIntoAndScanClosure to oop_oop_iterate(),
jmasa@1370 279 // and this delegation is used.
jmasa@1370 280 virtual const bool should_remember_klasses() const {
jmasa@1370 281 return _par_pushAndMarkClosure.should_remember_klasses();
jmasa@1370 282 }
jmasa@1370 283 // See comment on should_remember_klasses() above.
jmasa@1370 284 virtual void remember_klass(Klass* k) {
jmasa@1370 285 _par_pushAndMarkClosure.remember_klass(k);
jmasa@1370 286 }
duke@435 287 Prefetch::style prefetch_style() {
duke@435 288 return Prefetch::do_read;
duke@435 289 }
duke@435 290 void trim_queue(uint size);
duke@435 291 };
duke@435 292
duke@435 293 // This closure is used during the concurrent marking phase
duke@435 294 // following the first checkpoint. Its use is buried in
duke@435 295 // the closure MarkFromRootsClosure.
jmasa@1370 296 class PushOrMarkClosure: public KlassRememberingOopClosure {
coleenp@548 297 private:
coleenp@548 298 MemRegion _span;
coleenp@548 299 CMSBitMap* _bitMap;
coleenp@548 300 CMSMarkStack* _markStack;
coleenp@548 301 HeapWord* const _finger;
coleenp@548 302 MarkFromRootsClosure* const
coleenp@548 303 _parent;
coleenp@548 304 protected:
coleenp@548 305 DO_OOP_WORK_DEFN
duke@435 306 public:
duke@435 307 PushOrMarkClosure(CMSCollector* cms_collector,
duke@435 308 MemRegion span,
duke@435 309 CMSBitMap* bitMap,
coleenp@548 310 CMSMarkStack* markStack,
coleenp@548 311 CMSMarkStack* revisitStack,
coleenp@548 312 HeapWord* finger,
duke@435 313 MarkFromRootsClosure* parent);
coleenp@548 314 virtual void do_oop(oop* p);
coleenp@548 315 virtual void do_oop(narrowOop* p);
coleenp@548 316 inline void do_oop_nv(oop* p) { PushOrMarkClosure::do_oop_work(p); }
coleenp@548 317 inline void do_oop_nv(narrowOop* p) { PushOrMarkClosure::do_oop_work(p); }
ysr@1376 318 // In support of class unloading
ysr@1376 319 virtual const bool should_remember_mdo() const {
ysr@1376 320 return false;
ysr@1376 321 // return _should_remember_klasses;
ysr@1376 322 }
ysr@1376 323 virtual void remember_mdo(DataLayout* v);
ysr@1376 324
duke@435 325 // Deal with a stack overflow condition
duke@435 326 void handle_stack_overflow(HeapWord* lost);
duke@435 327 private:
duke@435 328 inline void do_yield_check();
duke@435 329 };
duke@435 330
duke@435 331 // A parallel (MT) version of the above.
duke@435 332 // This closure is used during the concurrent marking phase
duke@435 333 // following the first checkpoint. Its use is buried in
duke@435 334 // the closure Par_MarkFromRootsClosure.
jmasa@1370 335 class Par_PushOrMarkClosure: public Par_KlassRememberingOopClosure {
coleenp@548 336 private:
duke@435 337 MemRegion _whole_span;
duke@435 338 MemRegion _span; // local chunk
duke@435 339 CMSBitMap* _bit_map;
duke@435 340 OopTaskQueue* _work_queue;
duke@435 341 CMSMarkStack* _overflow_stack;
duke@435 342 HeapWord* const _finger;
duke@435 343 HeapWord** const _global_finger_addr;
coleenp@548 344 Par_MarkFromRootsClosure* const
coleenp@548 345 _parent;
coleenp@548 346 protected:
coleenp@548 347 DO_OOP_WORK_DEFN
duke@435 348 public:
duke@435 349 Par_PushOrMarkClosure(CMSCollector* cms_collector,
coleenp@548 350 MemRegion span,
coleenp@548 351 CMSBitMap* bit_map,
coleenp@548 352 OopTaskQueue* work_queue,
coleenp@548 353 CMSMarkStack* mark_stack,
coleenp@548 354 CMSMarkStack* revisit_stack,
coleenp@548 355 HeapWord* finger,
coleenp@548 356 HeapWord** global_finger_addr,
coleenp@548 357 Par_MarkFromRootsClosure* parent);
coleenp@548 358 virtual void do_oop(oop* p);
coleenp@548 359 virtual void do_oop(narrowOop* p);
coleenp@548 360 inline void do_oop_nv(oop* p) { Par_PushOrMarkClosure::do_oop_work(p); }
coleenp@548 361 inline void do_oop_nv(narrowOop* p) { Par_PushOrMarkClosure::do_oop_work(p); }
ysr@1376 362 // In support of class unloading
ysr@1376 363 virtual const bool should_remember_mdo() const {
ysr@1376 364 return false;
ysr@1376 365 // return _should_remember_klasses;
ysr@1376 366 }
ysr@1376 367 virtual void remember_mdo(DataLayout* v);
ysr@1376 368
duke@435 369 // Deal with a stack overflow condition
duke@435 370 void handle_stack_overflow(HeapWord* lost);
duke@435 371 private:
duke@435 372 inline void do_yield_check();
duke@435 373 };
duke@435 374
duke@435 375 // For objects in CMS generation, this closure marks
duke@435 376 // given objects (transitively) as being reachable/live.
duke@435 377 // This is currently used during the (weak) reference object
ysr@887 378 // processing phase of the CMS final checkpoint step, as
ysr@887 379 // well as during the concurrent precleaning of the discovered
ysr@887 380 // reference lists.
jmasa@1370 381 class CMSKeepAliveClosure: public KlassRememberingOopClosure {
coleenp@548 382 private:
ysr@578 383 const MemRegion _span;
duke@435 384 CMSMarkStack* _mark_stack;
duke@435 385 CMSBitMap* _bit_map;
ysr@887 386 bool _concurrent_precleaning;
coleenp@548 387 protected:
coleenp@548 388 DO_OOP_WORK_DEFN
duke@435 389 public:
duke@435 390 CMSKeepAliveClosure(CMSCollector* collector, MemRegion span,
ysr@887 391 CMSBitMap* bit_map, CMSMarkStack* mark_stack,
jmasa@1370 392 CMSMarkStack* revisit_stack, bool cpc);
ysr@887 393 bool concurrent_precleaning() const { return _concurrent_precleaning; }
coleenp@548 394 virtual void do_oop(oop* p);
coleenp@548 395 virtual void do_oop(narrowOop* p);
coleenp@548 396 inline void do_oop_nv(oop* p) { CMSKeepAliveClosure::do_oop_work(p); }
coleenp@548 397 inline void do_oop_nv(narrowOop* p) { CMSKeepAliveClosure::do_oop_work(p); }
duke@435 398 };
duke@435 399
jmasa@1370 400 class CMSInnerParMarkAndPushClosure: public Par_KlassRememberingOopClosure {
coleenp@548 401 private:
duke@435 402 MemRegion _span;
duke@435 403 OopTaskQueue* _work_queue;
duke@435 404 CMSBitMap* _bit_map;
coleenp@548 405 protected:
coleenp@548 406 DO_OOP_WORK_DEFN
duke@435 407 public:
duke@435 408 CMSInnerParMarkAndPushClosure(CMSCollector* collector,
duke@435 409 MemRegion span, CMSBitMap* bit_map,
jmasa@1370 410 CMSMarkStack* revisit_stack,
jmasa@1370 411 OopTaskQueue* work_queue);
coleenp@548 412 virtual void do_oop(oop* p);
coleenp@548 413 virtual void do_oop(narrowOop* p);
coleenp@548 414 inline void do_oop_nv(oop* p) { CMSInnerParMarkAndPushClosure::do_oop_work(p); }
coleenp@548 415 inline void do_oop_nv(narrowOop* p) { CMSInnerParMarkAndPushClosure::do_oop_work(p); }
duke@435 416 };
duke@435 417
duke@435 418 // A parallel (MT) version of the above, used when
duke@435 419 // reference processing is parallel; the only difference
duke@435 420 // is in the do_oop method.
jmasa@1370 421 class CMSParKeepAliveClosure: public Par_KlassRememberingOopClosure {
coleenp@548 422 private:
duke@435 423 MemRegion _span;
duke@435 424 OopTaskQueue* _work_queue;
duke@435 425 CMSBitMap* _bit_map;
coleenp@548 426 CMSInnerParMarkAndPushClosure
coleenp@548 427 _mark_and_push;
duke@435 428 const uint _low_water_mark;
duke@435 429 void trim_queue(uint max);
coleenp@548 430 protected:
coleenp@548 431 DO_OOP_WORK_DEFN
duke@435 432 public:
duke@435 433 CMSParKeepAliveClosure(CMSCollector* collector, MemRegion span,
jmasa@1370 434 CMSBitMap* bit_map, CMSMarkStack* revisit_stack,
jmasa@1370 435 OopTaskQueue* work_queue);
coleenp@548 436 virtual void do_oop(oop* p);
coleenp@548 437 virtual void do_oop(narrowOop* p);
coleenp@548 438 inline void do_oop_nv(oop* p) { CMSParKeepAliveClosure::do_oop_work(p); }
coleenp@548 439 inline void do_oop_nv(narrowOop* p) { CMSParKeepAliveClosure::do_oop_work(p); }
duke@435 440 };

mercurial