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

Print this page




 308                         HeapWord* finger,
 309                         HeapWord** global_finger_addr,
 310                         Par_MarkFromRootsClosure* parent);
 311   virtual void do_oop(oop* p);
 312   virtual void do_oop(narrowOop* p);
 313   inline void do_oop_nv(oop* p)       { Par_PushOrMarkClosure::do_oop_work(p); }
 314   inline void do_oop_nv(narrowOop* p) { Par_PushOrMarkClosure::do_oop_work(p); }
 315   virtual const bool should_remember_klasses() const {
 316     return _should_remember_klasses;
 317   }
 318   virtual void remember_klass(Klass* k);
 319   // Deal with a stack overflow condition
 320   void handle_stack_overflow(HeapWord* lost);
 321  private:
 322   inline void do_yield_check();
 323 };
 324 
 325 // For objects in CMS generation, this closure marks
 326 // given objects (transitively) as being reachable/live.
 327 // This is currently used during the (weak) reference object
 328 // processing phase of the CMS final checkpoint step.


 329 class CMSKeepAliveClosure: public OopClosure {

 330  private:
 331   CMSCollector* _collector;
 332   const MemRegion _span;
 333   CMSMarkStack* _mark_stack;
 334   CMSBitMap*    _bit_map;

 335  protected:
 336   DO_OOP_WORK_DEFN
 337  public:
 338   CMSKeepAliveClosure(CMSCollector* collector, MemRegion span,
 339                       CMSBitMap* bit_map, CMSMarkStack* mark_stack):

 340     _collector(collector),
 341     _span(span),
 342     _bit_map(bit_map),
 343     _mark_stack(mark_stack) {

 344     assert(!_span.is_empty(), "Empty span could spell trouble");
 345   }
 346   virtual void do_oop(oop* p);
 347   virtual void do_oop(narrowOop* p);
 348   inline void do_oop_nv(oop* p)       { CMSKeepAliveClosure::do_oop_work(p); }
 349   inline void do_oop_nv(narrowOop* p) { CMSKeepAliveClosure::do_oop_work(p); }
 350 };
 351 
 352 class CMSInnerParMarkAndPushClosure: public OopClosure {
 353  private:
 354   CMSCollector* _collector;
 355   MemRegion     _span;
 356   OopTaskQueue* _work_queue;
 357   CMSBitMap*    _bit_map;
 358  protected:
 359   DO_OOP_WORK_DEFN
 360  public:
 361   CMSInnerParMarkAndPushClosure(CMSCollector* collector,
 362                                 MemRegion span, CMSBitMap* bit_map,
 363                                 OopTaskQueue* work_queue):




 308                         HeapWord* finger,
 309                         HeapWord** global_finger_addr,
 310                         Par_MarkFromRootsClosure* parent);
 311   virtual void do_oop(oop* p);
 312   virtual void do_oop(narrowOop* p);
 313   inline void do_oop_nv(oop* p)       { Par_PushOrMarkClosure::do_oop_work(p); }
 314   inline void do_oop_nv(narrowOop* p) { Par_PushOrMarkClosure::do_oop_work(p); }
 315   virtual const bool should_remember_klasses() const {
 316     return _should_remember_klasses;
 317   }
 318   virtual void remember_klass(Klass* k);
 319   // Deal with a stack overflow condition
 320   void handle_stack_overflow(HeapWord* lost);
 321  private:
 322   inline void do_yield_check();
 323 };
 324 
 325 // For objects in CMS generation, this closure marks
 326 // given objects (transitively) as being reachable/live.
 327 // This is currently used during the (weak) reference object
 328 // processing phase of the CMS final checkpoint step, as
 329 // well as during the concurrent precleaning of the discovered
 330 // reference lists.
 331 class CMSKeepAliveClosure: public OopClosure {
 332  friend class CMSDrainMarkingStackClosure; // for assertion checking
 333  private:
 334   CMSCollector* _collector;
 335   const MemRegion _span;
 336   CMSMarkStack* _mark_stack;
 337   CMSBitMap*    _bit_map;
 338   bool          _concurrent_precleaning;
 339  protected:
 340   DO_OOP_WORK_DEFN
 341  public:
 342   CMSKeepAliveClosure(CMSCollector* collector, MemRegion span,
 343                       CMSBitMap* bit_map, CMSMarkStack* mark_stack,
 344                       bool concurrent_precleaning):
 345     _collector(collector),
 346     _span(span),
 347     _bit_map(bit_map),
 348     _mark_stack(mark_stack),
 349     _concurrent_precleaning(concurrent_precleaning) {
 350     assert(!_span.is_empty(), "Empty span could spell trouble");
 351   }
 352   virtual void do_oop(oop* p);
 353   virtual void do_oop(narrowOop* p);
 354   inline void do_oop_nv(oop* p)       { CMSKeepAliveClosure::do_oop_work(p); }
 355   inline void do_oop_nv(narrowOop* p) { CMSKeepAliveClosure::do_oop_work(p); }
 356 };
 357 
 358 class CMSInnerParMarkAndPushClosure: public OopClosure {
 359  private:
 360   CMSCollector* _collector;
 361   MemRegion     _span;
 362   OopTaskQueue* _work_queue;
 363   CMSBitMap*    _bit_map;
 364  protected:
 365   DO_OOP_WORK_DEFN
 366  public:
 367   CMSInnerParMarkAndPushClosure(CMSCollector* collector,
 368                                 MemRegion span, CMSBitMap* bit_map,
 369                                 OopTaskQueue* work_queue):