< prev index next >

src/hotspot/share/gc/z/zMark.cpp

Print this page




  15  * You should have received a copy of the GNU General Public License version
  16  * 2 along with this work; if not, write to the Free Software Foundation,
  17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  18  *
  19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  20  * or visit www.oracle.com if you need additional information or have any
  21  * questions.
  22  */
  23 
  24 #include "precompiled.hpp"
  25 #include "gc/z/zBarrier.inline.hpp"
  26 #include "gc/z/zMark.inline.hpp"
  27 #include "gc/z/zMarkCache.inline.hpp"
  28 #include "gc/z/zMarkStack.inline.hpp"
  29 #include "gc/z/zMarkTerminate.inline.hpp"
  30 #include "gc/z/zOopClosures.inline.hpp"
  31 #include "gc/z/zPage.hpp"
  32 #include "gc/z/zPageTable.inline.hpp"
  33 #include "gc/z/zRootsIterator.hpp"
  34 #include "gc/z/zStat.hpp"

  35 #include "gc/z/zTask.hpp"
  36 #include "gc/z/zThread.hpp"
  37 #include "gc/z/zUtils.inline.hpp"
  38 #include "gc/z/zWorkers.inline.hpp"
  39 #include "logging/log.hpp"
  40 #include "memory/iterator.inline.hpp"
  41 #include "oops/objArrayOop.inline.hpp"
  42 #include "oops/oop.inline.hpp"
  43 #include "runtime/atomic.hpp"
  44 #include "runtime/handshake.hpp"
  45 #include "runtime/orderAccess.hpp"
  46 #include "runtime/prefetch.inline.hpp"
  47 #include "runtime/thread.hpp"
  48 #include "utilities/align.hpp"
  49 #include "utilities/globalDefinitions.hpp"
  50 #include "utilities/ticks.hpp"
  51 
  52 static const ZStatSubPhase ZSubPhaseConcurrentMark("Concurrent Mark");
  53 static const ZStatSubPhase ZSubPhaseConcurrentMarkTryFlush("Concurrent Mark Try Flush");
  54 static const ZStatSubPhase ZSubPhaseConcurrentMarkIdle("Concurrent Mark Idle");


 102   _stripes.set_nstripes(nstripes);
 103 
 104   // Update statistics
 105   ZStatMark::set_at_mark_start(nstripes);
 106 
 107   // Print worker/stripe distribution
 108   LogTarget(Debug, gc, marking) log;
 109   if (log.is_enabled()) {
 110     log.print("Mark Worker/Stripe Distribution");
 111     for (uint worker_id = 0; worker_id < _nworkers; worker_id++) {
 112       const ZMarkStripe* const stripe = _stripes.stripe_for_worker(_nworkers, worker_id);
 113       const size_t stripe_id = _stripes.stripe_id(stripe);
 114       log.print("  Worker %u(%u) -> Stripe " SIZE_FORMAT "(" SIZE_FORMAT ")",
 115                 worker_id, _nworkers, stripe_id, nstripes);
 116     }
 117   }
 118 }
 119 
 120 class ZMarkRootsIteratorClosure : public ZRootsIteratorClosure {
 121 public:








 122   virtual void do_thread(Thread* thread) {
 123     ZRootsIteratorClosure::do_thread(thread);
 124 
 125     // Update thread local address bad mask
 126     ZThreadLocalData::set_address_bad_mask(thread, ZAddressBadMask);






 127   }
 128 
 129   virtual void do_oop(oop* p) {
 130     ZBarrier::mark_barrier_on_root_oop_field(p);
 131   }
 132 
 133   virtual void do_oop(narrowOop* p) {
 134     ShouldNotReachHere();
 135   }
 136 };
 137 
 138 class ZMarkRootsTask : public ZTask {
 139 private:
 140   ZMark* const   _mark;
 141   ZRootsIterator _roots;
 142 
 143 public:
 144   ZMarkRootsTask(ZMark* mark) :
 145       ZTask("ZMarkRootsTask"),
 146       _mark(mark),




  15  * You should have received a copy of the GNU General Public License version
  16  * 2 along with this work; if not, write to the Free Software Foundation,
  17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  18  *
  19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  20  * or visit www.oracle.com if you need additional information or have any
  21  * questions.
  22  */
  23 
  24 #include "precompiled.hpp"
  25 #include "gc/z/zBarrier.inline.hpp"
  26 #include "gc/z/zMark.inline.hpp"
  27 #include "gc/z/zMarkCache.inline.hpp"
  28 #include "gc/z/zMarkStack.inline.hpp"
  29 #include "gc/z/zMarkTerminate.inline.hpp"
  30 #include "gc/z/zOopClosures.inline.hpp"
  31 #include "gc/z/zPage.hpp"
  32 #include "gc/z/zPageTable.inline.hpp"
  33 #include "gc/z/zRootsIterator.hpp"
  34 #include "gc/z/zStat.hpp"
  35 #include "gc/z/zStatTLAB.hpp"
  36 #include "gc/z/zTask.hpp"
  37 #include "gc/z/zThread.hpp"
  38 #include "gc/z/zUtils.inline.hpp"
  39 #include "gc/z/zWorkers.inline.hpp"
  40 #include "logging/log.hpp"
  41 #include "memory/iterator.inline.hpp"
  42 #include "oops/objArrayOop.inline.hpp"
  43 #include "oops/oop.inline.hpp"
  44 #include "runtime/atomic.hpp"
  45 #include "runtime/handshake.hpp"
  46 #include "runtime/orderAccess.hpp"
  47 #include "runtime/prefetch.inline.hpp"
  48 #include "runtime/thread.hpp"
  49 #include "utilities/align.hpp"
  50 #include "utilities/globalDefinitions.hpp"
  51 #include "utilities/ticks.hpp"
  52 
  53 static const ZStatSubPhase ZSubPhaseConcurrentMark("Concurrent Mark");
  54 static const ZStatSubPhase ZSubPhaseConcurrentMarkTryFlush("Concurrent Mark Try Flush");
  55 static const ZStatSubPhase ZSubPhaseConcurrentMarkIdle("Concurrent Mark Idle");


 103   _stripes.set_nstripes(nstripes);
 104 
 105   // Update statistics
 106   ZStatMark::set_at_mark_start(nstripes);
 107 
 108   // Print worker/stripe distribution
 109   LogTarget(Debug, gc, marking) log;
 110   if (log.is_enabled()) {
 111     log.print("Mark Worker/Stripe Distribution");
 112     for (uint worker_id = 0; worker_id < _nworkers; worker_id++) {
 113       const ZMarkStripe* const stripe = _stripes.stripe_for_worker(_nworkers, worker_id);
 114       const size_t stripe_id = _stripes.stripe_id(stripe);
 115       log.print("  Worker %u(%u) -> Stripe " SIZE_FORMAT "(" SIZE_FORMAT ")",
 116                 worker_id, _nworkers, stripe_id, nstripes);
 117     }
 118   }
 119 }
 120 
 121 class ZMarkRootsIteratorClosure : public ZRootsIteratorClosure {
 122 public:
 123   ZMarkRootsIteratorClosure() {
 124     ZStatTLAB::reset();
 125   }
 126 
 127   ~ZMarkRootsIteratorClosure() {
 128     ZStatTLAB::publish();
 129   }
 130 
 131   virtual void do_thread(Thread* thread) {
 132     ZRootsIteratorClosure::do_thread(thread);
 133 
 134     // Update thread local address bad mask
 135     ZThreadLocalData::set_address_bad_mask(thread, ZAddressBadMask);
 136 
 137     // Retire TLAB
 138     if (UseTLAB && thread->is_Java_thread()) {
 139       thread->tlab().retire(ZStatTLAB::get());
 140       thread->tlab().resize();
 141     }
 142   }
 143 
 144   virtual void do_oop(oop* p) {
 145     ZBarrier::mark_barrier_on_root_oop_field(p);
 146   }
 147 
 148   virtual void do_oop(narrowOop* p) {
 149     ShouldNotReachHere();
 150   }
 151 };
 152 
 153 class ZMarkRootsTask : public ZTask {
 154 private:
 155   ZMark* const   _mark;
 156   ZRootsIterator _roots;
 157 
 158 public:
 159   ZMarkRootsTask(ZMark* mark) :
 160       ZTask("ZMarkRootsTask"),
 161       _mark(mark),


< prev index next >