108 if (log.is_enabled()) {
109 log.print("Mark Worker/Stripe Distribution");
110 for (uint worker_id = 0; worker_id < _nworkers; worker_id++) {
111 const ZMarkStripe* const stripe = _stripes.stripe_for_worker(_nworkers, worker_id);
112 const size_t stripe_id = _stripes.stripe_id(stripe);
113 log.print(" Worker %u(%u) -> Stripe " SIZE_FORMAT "(" SIZE_FORMAT ")",
114 worker_id, _nworkers, stripe_id, nstripes);
115 }
116 }
117 }
118
119 class ZMarkRootsTask : public ZTask {
120 private:
121 ZMark* const _mark;
122 ZRootsIterator _roots;
123
124 public:
125 ZMarkRootsTask(ZMark* mark) :
126 ZTask("ZMarkRootsTask"),
127 _mark(mark),
128 _roots() {}
129
130 virtual void work() {
131 ZMarkRootOopClosure cl;
132 _roots.oops_do(&cl);
133
134 // Flush and free worker stacks. Needed here since
135 // the set of workers executing during root scanning
136 // can be different from the set of workers executing
137 // during mark.
138 _mark->flush_and_free();
139 }
140 };
141
142 void ZMark::start() {
143 // Verification
144 if (ZVerifyMarking) {
145 verify_all_stacks_empty();
146 }
147
|
108 if (log.is_enabled()) {
109 log.print("Mark Worker/Stripe Distribution");
110 for (uint worker_id = 0; worker_id < _nworkers; worker_id++) {
111 const ZMarkStripe* const stripe = _stripes.stripe_for_worker(_nworkers, worker_id);
112 const size_t stripe_id = _stripes.stripe_id(stripe);
113 log.print(" Worker %u(%u) -> Stripe " SIZE_FORMAT "(" SIZE_FORMAT ")",
114 worker_id, _nworkers, stripe_id, nstripes);
115 }
116 }
117 }
118
119 class ZMarkRootsTask : public ZTask {
120 private:
121 ZMark* const _mark;
122 ZRootsIterator _roots;
123
124 public:
125 ZMarkRootsTask(ZMark* mark) :
126 ZTask("ZMarkRootsTask"),
127 _mark(mark),
128 _roots(ClassUnloading) {}
129
130 virtual void work() {
131 ZMarkRootOopClosure cl;
132 _roots.oops_do(&cl);
133
134 // Flush and free worker stacks. Needed here since
135 // the set of workers executing during root scanning
136 // can be different from the set of workers executing
137 // during mark.
138 _mark->flush_and_free();
139 }
140 };
141
142 void ZMark::start() {
143 // Verification
144 if (ZVerifyMarking) {
145 verify_all_stacks_empty();
146 }
147
|
235 const uintptr_t leading_addr = start;
236 const size_t leading_size = middle_start - start;
237 follow_small_array(leading_addr, leading_size, finalizable);
238 }
239
240 void ZMark::follow_array(uintptr_t addr, size_t size, bool finalizable) {
241 if (size <= ZMarkPartialArrayMinSize) {
242 follow_small_array(addr, size, finalizable);
243 } else {
244 follow_large_array(addr, size, finalizable);
245 }
246 }
247
248 void ZMark::follow_partial_array(ZMarkStackEntry entry, bool finalizable) {
249 const uintptr_t addr = ZAddress::good(entry.partial_array_offset() << ZMarkPartialArrayMinSizeShift);
250 const size_t size = entry.partial_array_length() * oopSize;
251
252 follow_array(addr, size, finalizable);
253 }
254
255 void ZMark::follow_array_object(objArrayOop obj, bool finalizable) {
256 const uintptr_t addr = (uintptr_t)obj->base();
257 const size_t size = (size_t)obj->length() * oopSize;
258
259 follow_array(addr, size, finalizable);
260 }
261
262 void ZMark::follow_object(oop obj, bool finalizable) {
263 if (finalizable) {
264 ZMarkBarrierOopClosure<true /* finalizable */> cl;
265 obj->oop_iterate(&cl);
266 } else {
267 ZMarkBarrierOopClosure<false /* finalizable */> cl;
268 obj->oop_iterate(&cl);
269 }
270 }
271
272 bool ZMark::try_mark_object(ZMarkCache* cache, uintptr_t addr, bool finalizable) {
273 ZPage* const page = _pagetable->get(addr);
274 if (page->is_allocating()) {
|
235 const uintptr_t leading_addr = start;
236 const size_t leading_size = middle_start - start;
237 follow_small_array(leading_addr, leading_size, finalizable);
238 }
239
240 void ZMark::follow_array(uintptr_t addr, size_t size, bool finalizable) {
241 if (size <= ZMarkPartialArrayMinSize) {
242 follow_small_array(addr, size, finalizable);
243 } else {
244 follow_large_array(addr, size, finalizable);
245 }
246 }
247
248 void ZMark::follow_partial_array(ZMarkStackEntry entry, bool finalizable) {
249 const uintptr_t addr = ZAddress::good(entry.partial_array_offset() << ZMarkPartialArrayMinSizeShift);
250 const size_t size = entry.partial_array_length() * oopSize;
251
252 follow_array(addr, size, finalizable);
253 }
254
255 void ZMark::follow_klass(Klass* klass, bool finalizable) {
256 ClassLoaderData* cld = klass->class_loader_data();
257 if (!cld->claim(finalizable)) {
258 return;
259 }
260
261 oop holder = cld->holder_no_keepalive();
262 if (holder == NULL) {
263 return;
264 }
265
266 if (finalizable) {
267 ZHeap::heap()->mark_object<true, false>(ZOop::to_address(holder));
268 } else {
269 ZHeap::heap()->mark_object<false, false>(ZOop::to_address(holder));
270 }
271 }
272
273 void ZMark::follow_array_object(objArrayOop obj, bool finalizable) {
274 if (ClassUnloading) {
275 follow_klass(obj->klass(), finalizable);
276 }
277
278 const uintptr_t addr = (uintptr_t)obj->base();
279 const size_t size = (size_t)obj->length() * oopSize;
280
281 follow_array(addr, size, finalizable);
282 }
283
284 void ZMark::follow_object(oop obj, bool finalizable) {
285 if (finalizable) {
286 ZMarkBarrierOopClosure<true /* finalizable */> cl;
287 obj->oop_iterate(&cl);
288 } else {
289 ZMarkBarrierOopClosure<false /* finalizable */> cl;
290 obj->oop_iterate(&cl);
291 }
292 }
293
294 bool ZMark::try_mark_object(ZMarkCache* cache, uintptr_t addr, bool finalizable) {
295 ZPage* const page = _pagetable->get(addr);
296 if (page->is_allocating()) {
|