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),
|