< prev index next >

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

Concurrent class unloading

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()) {
< prev index next >