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

changeset 1428
54b3b351d6f9
parent 1424
148e5441d916
parent 1376
8b46c4d82093
child 1429
753cf9794df9
     1.1 --- a/src/share/vm/gc_implementation/concurrentMarkSweep/cmsOopClosures.hpp	Fri Sep 18 09:57:47 2009 -0700
     1.2 +++ b/src/share/vm/gc_implementation/concurrentMarkSweep/cmsOopClosures.hpp	Wed Sep 23 23:56:15 2009 -0700
     1.3 @@ -88,17 +88,50 @@
     1.4    }
     1.5  };
     1.6  
     1.7 +// KlassRememberingOopClosure is used when marking of the permanent generation
     1.8 +// is being done.  It adds fields to support revisiting of klasses
     1.9 +// for class unloading.  _should_remember_klasses should be set to
    1.10 +// indicate if klasses should be remembered.  Currently that is whenever
    1.11 +// CMS class unloading is turned on.  The _revisit_stack is used
    1.12 +// to save the klasses for later processing.
    1.13 +class KlassRememberingOopClosure : public OopClosure {
    1.14 + protected:
    1.15 +  CMSCollector* _collector;
    1.16 +  CMSMarkStack* _revisit_stack;
    1.17 +  bool const    _should_remember_klasses;
    1.18 + public:
    1.19 +  void check_remember_klasses() const PRODUCT_RETURN;
    1.20 +  virtual const bool should_remember_klasses() const {
    1.21 +    check_remember_klasses();
    1.22 +    return _should_remember_klasses;
    1.23 +  }
    1.24 +  virtual void remember_klass(Klass* k);
    1.25 +
    1.26 +  KlassRememberingOopClosure(CMSCollector* collector,
    1.27 +                             ReferenceProcessor* rp,
    1.28 +                             CMSMarkStack* revisit_stack);
    1.29 +};
    1.30 +
    1.31 +// Similar to KlassRememberingOopClosure for use when multiple
    1.32 +// GC threads will execute the closure.
    1.33 +
    1.34 +class Par_KlassRememberingOopClosure : public KlassRememberingOopClosure {
    1.35 + public:
    1.36 +  Par_KlassRememberingOopClosure(CMSCollector* collector,
    1.37 +                                 ReferenceProcessor* rp,
    1.38 +                                 CMSMarkStack* revisit_stack):
    1.39 +    KlassRememberingOopClosure(collector, rp, revisit_stack) {}
    1.40 +  virtual void remember_klass(Klass* k);
    1.41 +};
    1.42 +
    1.43  // The non-parallel version (the parallel version appears further below).
    1.44 -class PushAndMarkClosure: public OopClosure {
    1.45 +class PushAndMarkClosure: public KlassRememberingOopClosure {
    1.46   private:
    1.47 -  CMSCollector* _collector;
    1.48    MemRegion     _span;
    1.49    CMSBitMap*    _bit_map;
    1.50    CMSBitMap*    _mod_union_table;
    1.51    CMSMarkStack* _mark_stack;
    1.52 -  CMSMarkStack* _revisit_stack;
    1.53    bool          _concurrent_precleaning;
    1.54 -  bool const    _should_remember_klasses;
    1.55   protected:
    1.56    DO_OOP_WORK_DEFN
    1.57   public:
    1.58 @@ -118,10 +151,12 @@
    1.59    Prefetch::style prefetch_style() {
    1.60      return Prefetch::do_read;
    1.61    }
    1.62 -  virtual const bool should_remember_klasses() const {
    1.63 -    return _should_remember_klasses;
    1.64 +  // In support of class unloading
    1.65 +  virtual const bool should_remember_mdo() const {
    1.66 +    return false;
    1.67 +    // return _should_remember_klasses;
    1.68    }
    1.69 -  virtual void remember_klass(Klass* k);
    1.70 +  virtual void remember_mdo(DataLayout* v);
    1.71  };
    1.72  
    1.73  // In the parallel case, the revisit stack, the bit map and the
    1.74 @@ -130,14 +165,11 @@
    1.75  // synchronization (for instance, via CAS). The marking stack
    1.76  // used in the non-parallel case above is here replaced with
    1.77  // an OopTaskQueue structure to allow efficient work stealing.
    1.78 -class Par_PushAndMarkClosure: public OopClosure {
    1.79 +class Par_PushAndMarkClosure: public Par_KlassRememberingOopClosure {
    1.80   private:
    1.81 -  CMSCollector* _collector;
    1.82    MemRegion     _span;
    1.83    CMSBitMap*    _bit_map;
    1.84    OopTaskQueue* _work_queue;
    1.85 -  CMSMarkStack* _revisit_stack;
    1.86 -  bool const    _should_remember_klasses;
    1.87   protected:
    1.88    DO_OOP_WORK_DEFN
    1.89   public:
    1.90 @@ -155,10 +187,12 @@
    1.91    Prefetch::style prefetch_style() {
    1.92      return Prefetch::do_read;
    1.93    }
    1.94 -  virtual const bool should_remember_klasses() const {
    1.95 -    return _should_remember_klasses;
    1.96 +  // In support of class unloading
    1.97 +  virtual const bool should_remember_mdo() const {
    1.98 +    return false;
    1.99 +    // return _should_remember_klasses;
   1.100    }
   1.101 -  virtual void remember_klass(Klass* k);
   1.102 +  virtual void remember_mdo(DataLayout* v);
   1.103  };
   1.104  
   1.105  // The non-parallel version (the parallel version appears further below).
   1.106 @@ -196,6 +230,12 @@
   1.107    void set_freelistLock(Mutex* m) {
   1.108      _freelistLock = m;
   1.109    }
   1.110 +  virtual const bool should_remember_klasses() const {
   1.111 +    return _pushAndMarkClosure.should_remember_klasses();
   1.112 +  }
   1.113 +  virtual void remember_klass(Klass* k) {
   1.114 +    _pushAndMarkClosure.remember_klass(k);
   1.115 +  }
   1.116  
   1.117   private:
   1.118    inline void do_yield_check();
   1.119 @@ -229,6 +269,16 @@
   1.120    inline void do_oop_nv(narrowOop* p) { Par_MarkRefsIntoAndScanClosure::do_oop_work(p); }
   1.121    bool do_header() { return true; }
   1.122    virtual const bool do_nmethods() const { return true; }
   1.123 +  // When ScanMarkedObjectsAgainClosure is used,
   1.124 +  // it passes [Par_]MarkRefsIntoAndScanClosure to oop_oop_iterate(),
   1.125 +  // and this delegation is used.
   1.126 +  virtual const bool should_remember_klasses() const {
   1.127 +    return _par_pushAndMarkClosure.should_remember_klasses();
   1.128 +  }
   1.129 +  // See comment on should_remember_klasses() above.
   1.130 +  virtual void remember_klass(Klass* k) {
   1.131 +    _par_pushAndMarkClosure.remember_klass(k);
   1.132 +  }
   1.133    Prefetch::style prefetch_style() {
   1.134      return Prefetch::do_read;
   1.135    }
   1.136 @@ -238,17 +288,14 @@
   1.137  // This closure is used during the concurrent marking phase
   1.138  // following the first checkpoint. Its use is buried in
   1.139  // the closure MarkFromRootsClosure.
   1.140 -class PushOrMarkClosure: public OopClosure {
   1.141 +class PushOrMarkClosure: public KlassRememberingOopClosure {
   1.142   private:
   1.143 -  CMSCollector*   _collector;
   1.144    MemRegion       _span;
   1.145    CMSBitMap*      _bitMap;
   1.146    CMSMarkStack*   _markStack;
   1.147 -  CMSMarkStack*   _revisitStack;
   1.148    HeapWord* const _finger;
   1.149    MarkFromRootsClosure* const
   1.150                    _parent;
   1.151 -  bool const      _should_remember_klasses;
   1.152   protected:
   1.153    DO_OOP_WORK_DEFN
   1.154   public:
   1.155 @@ -263,10 +310,13 @@
   1.156    virtual void do_oop(narrowOop* p);
   1.157    inline void do_oop_nv(oop* p)       { PushOrMarkClosure::do_oop_work(p); }
   1.158    inline void do_oop_nv(narrowOop* p) { PushOrMarkClosure::do_oop_work(p); }
   1.159 -  virtual const bool should_remember_klasses() const {
   1.160 -    return _should_remember_klasses;
   1.161 +  // In support of class unloading
   1.162 +  virtual const bool should_remember_mdo() const {
   1.163 +    return false;
   1.164 +    // return _should_remember_klasses;
   1.165    }
   1.166 -  virtual void remember_klass(Klass* k);
   1.167 +  virtual void remember_mdo(DataLayout* v);
   1.168 +
   1.169    // Deal with a stack overflow condition
   1.170    void handle_stack_overflow(HeapWord* lost);
   1.171   private:
   1.172 @@ -277,20 +327,17 @@
   1.173  // This closure is used during the concurrent marking phase
   1.174  // following the first checkpoint. Its use is buried in
   1.175  // the closure Par_MarkFromRootsClosure.
   1.176 -class Par_PushOrMarkClosure: public OopClosure {
   1.177 +class Par_PushOrMarkClosure: public Par_KlassRememberingOopClosure {
   1.178   private:
   1.179 -  CMSCollector*    _collector;
   1.180    MemRegion        _whole_span;
   1.181    MemRegion        _span;        // local chunk
   1.182    CMSBitMap*       _bit_map;
   1.183    OopTaskQueue*    _work_queue;
   1.184    CMSMarkStack*    _overflow_stack;
   1.185 -  CMSMarkStack*    _revisit_stack;
   1.186    HeapWord*  const _finger;
   1.187    HeapWord** const _global_finger_addr;
   1.188    Par_MarkFromRootsClosure* const
   1.189                     _parent;
   1.190 -  bool const       _should_remember_klasses;
   1.191   protected:
   1.192    DO_OOP_WORK_DEFN
   1.193   public:
   1.194 @@ -307,10 +354,13 @@
   1.195    virtual void do_oop(narrowOop* p);
   1.196    inline void do_oop_nv(oop* p)       { Par_PushOrMarkClosure::do_oop_work(p); }
   1.197    inline void do_oop_nv(narrowOop* p) { Par_PushOrMarkClosure::do_oop_work(p); }
   1.198 -  virtual const bool should_remember_klasses() const {
   1.199 -    return _should_remember_klasses;
   1.200 +  // In support of class unloading
   1.201 +  virtual const bool should_remember_mdo() const {
   1.202 +    return false;
   1.203 +    // return _should_remember_klasses;
   1.204    }
   1.205 -  virtual void remember_klass(Klass* k);
   1.206 +  virtual void remember_mdo(DataLayout* v);
   1.207 +
   1.208    // Deal with a stack overflow condition
   1.209    void handle_stack_overflow(HeapWord* lost);
   1.210   private:
   1.211 @@ -323,9 +373,8 @@
   1.212  // processing phase of the CMS final checkpoint step, as
   1.213  // well as during the concurrent precleaning of the discovered
   1.214  // reference lists.
   1.215 -class CMSKeepAliveClosure: public OopClosure {
   1.216 +class CMSKeepAliveClosure: public KlassRememberingOopClosure {
   1.217   private:
   1.218 -  CMSCollector* _collector;
   1.219    const MemRegion _span;
   1.220    CMSMarkStack* _mark_stack;
   1.221    CMSBitMap*    _bit_map;
   1.222 @@ -335,14 +384,7 @@
   1.223   public:
   1.224    CMSKeepAliveClosure(CMSCollector* collector, MemRegion span,
   1.225                        CMSBitMap* bit_map, CMSMarkStack* mark_stack,
   1.226 -                      bool cpc):
   1.227 -    _collector(collector),
   1.228 -    _span(span),
   1.229 -    _bit_map(bit_map),
   1.230 -    _mark_stack(mark_stack),
   1.231 -    _concurrent_precleaning(cpc) {
   1.232 -    assert(!_span.is_empty(), "Empty span could spell trouble");
   1.233 -  }
   1.234 +                      CMSMarkStack* revisit_stack, bool cpc);
   1.235    bool    concurrent_precleaning() const { return _concurrent_precleaning; }
   1.236    virtual void do_oop(oop* p);
   1.237    virtual void do_oop(narrowOop* p);
   1.238 @@ -350,9 +392,8 @@
   1.239    inline void do_oop_nv(narrowOop* p) { CMSKeepAliveClosure::do_oop_work(p); }
   1.240  };
   1.241  
   1.242 -class CMSInnerParMarkAndPushClosure: public OopClosure {
   1.243 +class CMSInnerParMarkAndPushClosure: public Par_KlassRememberingOopClosure {
   1.244   private:
   1.245 -  CMSCollector* _collector;
   1.246    MemRegion     _span;
   1.247    OopTaskQueue* _work_queue;
   1.248    CMSBitMap*    _bit_map;
   1.249 @@ -361,11 +402,8 @@
   1.250   public:
   1.251    CMSInnerParMarkAndPushClosure(CMSCollector* collector,
   1.252                                  MemRegion span, CMSBitMap* bit_map,
   1.253 -                                OopTaskQueue* work_queue):
   1.254 -    _collector(collector),
   1.255 -    _span(span),
   1.256 -    _bit_map(bit_map),
   1.257 -    _work_queue(work_queue) { }
   1.258 +                                CMSMarkStack* revisit_stack,
   1.259 +                                OopTaskQueue* work_queue);
   1.260    virtual void do_oop(oop* p);
   1.261    virtual void do_oop(narrowOop* p);
   1.262    inline void do_oop_nv(oop* p)       { CMSInnerParMarkAndPushClosure::do_oop_work(p); }
   1.263 @@ -375,9 +413,8 @@
   1.264  // A parallel (MT) version of the above, used when
   1.265  // reference processing is parallel; the only difference
   1.266  // is in the do_oop method.
   1.267 -class CMSParKeepAliveClosure: public OopClosure {
   1.268 +class CMSParKeepAliveClosure: public Par_KlassRememberingOopClosure {
   1.269   private:
   1.270 -  CMSCollector* _collector;
   1.271    MemRegion     _span;
   1.272    OopTaskQueue* _work_queue;
   1.273    CMSBitMap*    _bit_map;
   1.274 @@ -389,7 +426,8 @@
   1.275    DO_OOP_WORK_DEFN
   1.276   public:
   1.277    CMSParKeepAliveClosure(CMSCollector* collector, MemRegion span,
   1.278 -                         CMSBitMap* bit_map, OopTaskQueue* work_queue);
   1.279 +                         CMSBitMap* bit_map, CMSMarkStack* revisit_stack,
   1.280 +                         OopTaskQueue* work_queue);
   1.281    virtual void do_oop(oop* p);
   1.282    virtual void do_oop(narrowOop* p);
   1.283    inline void do_oop_nv(oop* p)       { CMSParKeepAliveClosure::do_oop_work(p); }

mercurial