< prev index next >

src/hotspot/share/gc/parallel/psParallelCompact.cpp

8211447_01: revision due to comments from StefanJ and Thomas

8211447: Replace oop_pc_update_pointers with oop_iterate and closure

2185     // Delete entries for dead interned strings.                                                                           
2186     StringTable::unlink(is_alive_closure());                                                                               
2187   }                                                                                                                        
2188 
2189   {                                                                                                                        
2190     GCTraceTime(Debug, gc, phases) t("Scrub Symbol Table", &_gc_timer);                                                    
2191     // Clean up unreferenced symbols in symbol table.                                                                      
2192     SymbolTable::unlink();                                                                                                 
2193   }                                                                                                                        
2194 
2195   _gc_tracer.report_object_count_after_gc(is_alive_closure());                                                             
2196 }                                                                                                                          
2197 
2198 void PSParallelCompact::adjust_roots(ParCompactionManager* cm) {                                                           
2199   // Adjust the pointers to reflect the new locations                                                                      
2200   GCTraceTime(Info, gc, phases) tm("Adjust Roots", &_gc_timer);                                                            
2201 
2202   // Need new claim bits when tracing through and adjusting pointers.                                                      
2203   ClassLoaderDataGraph::clear_claimed_marks();                                                                             
2204 
2205   PSParallelCompact::AdjustPointerClosure oop_closure(cm);                                                                 
2206 
2207   // General strong roots.                                                                                                 
2208   Universe::oops_do(&oop_closure);                                                                                         
2209   JNIHandles::oops_do(&oop_closure);   // Global (strong) JNI handles                                                      
2210   Threads::oops_do(&oop_closure, NULL);                                                                                    
2211   ObjectSynchronizer::oops_do(&oop_closure);                                                                               
2212   Management::oops_do(&oop_closure);                                                                                       
2213   JvmtiExport::oops_do(&oop_closure);                                                                                      
2214   SystemDictionary::oops_do(&oop_closure);                                                                                 
2215   CLDToOopClosure cld_closure(&oop_closure);                                                                               
2216   ClassLoaderDataGraph::cld_do(&cld_closure);                                                                              
2217 
2218   // Now adjust pointers in remaining weak roots.  (All of which should                                                    
2219   // have been cleared if they pointed to non-surviving objects.)                                                          
2220   WeakProcessor::oops_do(&oop_closure);                                                                                    
2221 
2222   CodeBlobToOopClosure adjust_from_blobs(&oop_closure, CodeBlobToOopClosure::FixRelocations);                              
2223   CodeCache::blobs_do(&adjust_from_blobs);                                                                                 
2224   AOTLoader::oops_do(&oop_closure);                                                                                        

2185     // Delete entries for dead interned strings.
2186     StringTable::unlink(is_alive_closure());
2187   }
2188 
2189   {
2190     GCTraceTime(Debug, gc, phases) t("Scrub Symbol Table", &_gc_timer);
2191     // Clean up unreferenced symbols in symbol table.
2192     SymbolTable::unlink();
2193   }
2194 
2195   _gc_tracer.report_object_count_after_gc(is_alive_closure());
2196 }
2197 
2198 void PSParallelCompact::adjust_roots(ParCompactionManager* cm) {
2199   // Adjust the pointers to reflect the new locations
2200   GCTraceTime(Info, gc, phases) tm("Adjust Roots", &_gc_timer);
2201 
2202   // Need new claim bits when tracing through and adjusting pointers.
2203   ClassLoaderDataGraph::clear_claimed_marks();
2204 
2205   PCAdjustPointerClosure oop_closure(cm);
2206 
2207   // General strong roots.
2208   Universe::oops_do(&oop_closure);
2209   JNIHandles::oops_do(&oop_closure);   // Global (strong) JNI handles
2210   Threads::oops_do(&oop_closure, NULL);
2211   ObjectSynchronizer::oops_do(&oop_closure);
2212   Management::oops_do(&oop_closure);
2213   JvmtiExport::oops_do(&oop_closure);
2214   SystemDictionary::oops_do(&oop_closure);
2215   CLDToOopClosure cld_closure(&oop_closure);
2216   ClassLoaderDataGraph::cld_do(&cld_closure);
2217 
2218   // Now adjust pointers in remaining weak roots.  (All of which should
2219   // have been cleared if they pointed to non-surviving objects.)
2220   WeakProcessor::oops_do(&oop_closure);
2221 
2222   CodeBlobToOopClosure adjust_from_blobs(&oop_closure, CodeBlobToOopClosure::FixRelocations);
2223   CodeCache::blobs_do(&adjust_from_blobs);
2224   AOTLoader::oops_do(&oop_closure);

3076   return ParMarkBitMap::full;                                                                                              
3077 }                                                                                                                          
3078 
3079 void MoveAndUpdateClosure::copy_partial_obj()                                                                              
3080 {                                                                                                                          
3081   size_t words = words_remaining();                                                                                        
3082 
3083   HeapWord* const range_end = MIN2(source() + words, bitmap()->region_end());                                              
3084   HeapWord* const end_addr = bitmap()->find_obj_end(source(), range_end);                                                  
3085   if (end_addr < range_end) {                                                                                              
3086     words = bitmap()->obj_size(source(), end_addr);                                                                        
3087   }                                                                                                                        
3088 
3089   // This test is necessary; if omitted, the pointer updates to a partial object                                           
3090   // that crosses the dense prefix boundary could be overwritten.                                                          
3091   if (source() != destination()) {                                                                                         
3092     DEBUG_ONLY(PSParallelCompact::check_new_location(source(), destination());)                                            
3093     Copy::aligned_conjoint_words(source(), destination(), words);                                                          
3094   }                                                                                                                        
3095   update_state(words);                                                                                                     
3096 }                                                                                                                          
3097                                                                                                                            
3098 void InstanceKlass::oop_pc_update_pointers(oop obj, ParCompactionManager* cm) {                                            
3099   PSParallelCompact::AdjustPointerClosure closure(cm);                                                                     
3100   if (UseCompressedOops) {                                                                                                 
3101     oop_oop_iterate_oop_maps<narrowOop>(obj, &closure);                                                                    
3102   } else {                                                                                                                 
3103     oop_oop_iterate_oop_maps<oop>(obj, &closure);                                                                          
3104   }                                                                                                                        
3105 }                                                                                                                          
3106                                                                                                                            
3107 void InstanceMirrorKlass::oop_pc_update_pointers(oop obj, ParCompactionManager* cm) {                                      
3108   InstanceKlass::oop_pc_update_pointers(obj, cm);                                                                          
3109                                                                                                                            
3110   PSParallelCompact::AdjustPointerClosure closure(cm);                                                                     
3111   if (UseCompressedOops) {                                                                                                 
3112     oop_oop_iterate_statics<narrowOop>(obj, &closure);                                                                     
3113   } else {                                                                                                                 
3114     oop_oop_iterate_statics<oop>(obj, &closure);                                                                           
3115   }                                                                                                                        
3116 }                                                                                                                          
3117                                                                                                                            
3118 void InstanceClassLoaderKlass::oop_pc_update_pointers(oop obj, ParCompactionManager* cm) {                                 
3119   InstanceKlass::oop_pc_update_pointers(obj, cm);                                                                          
3120 }                                                                                                                          
3121                                                                                                                            
3122 #ifdef ASSERT                                                                                                              
3123 template <class T> static void trace_reference_gc(const char *s, oop obj,                                                  
3124                                                   T* referent_addr,                                                        
3125                                                   T* discovered_addr) {                                                    
3126   log_develop_trace(gc, ref)("%s obj " PTR_FORMAT, s, p2i(obj));                                                           
3127   log_develop_trace(gc, ref)("     referent_addr/* " PTR_FORMAT " / " PTR_FORMAT,                                          
3128                              p2i(referent_addr), referent_addr ? p2i((oop)RawAccess<>::oop_load(referent_addr)) : NULL);   
3129   log_develop_trace(gc, ref)("     discovered_addr/* " PTR_FORMAT " / " PTR_FORMAT,                                        
3130                              p2i(discovered_addr), discovered_addr ? p2i((oop)RawAccess<>::oop_load(discovered_addr)) : NUL
3131 }                                                                                                                          
3132 #endif                                                                                                                     
3133                                                                                                                            
3134 template <class T>                                                                                                         
3135 static void oop_pc_update_pointers_specialized(oop obj, ParCompactionManager* cm) {                                        
3136   T* referent_addr = (T*)java_lang_ref_Reference::referent_addr_raw(obj);                                                  
3137   PSParallelCompact::adjust_pointer(referent_addr, cm);                                                                    
3138   T* discovered_addr = (T*)java_lang_ref_Reference::discovered_addr_raw(obj);                                              
3139   PSParallelCompact::adjust_pointer(discovered_addr, cm);                                                                  
3140   debug_only(trace_reference_gc("InstanceRefKlass::oop_update_ptrs", obj,                                                  
3141                                 referent_addr, discovered_addr);)                                                          
3142 }                                                                                                                          
3143                                                                                                                            
3144 void InstanceRefKlass::oop_pc_update_pointers(oop obj, ParCompactionManager* cm) {                                         
3145   InstanceKlass::oop_pc_update_pointers(obj, cm);                                                                          
3146                                                                                                                            
3147   if (UseCompressedOops) {                                                                                                 
3148     oop_pc_update_pointers_specialized<narrowOop>(obj, cm);                                                                
3149   } else {                                                                                                                 
3150     oop_pc_update_pointers_specialized<oop>(obj, cm);                                                                      
3151   }                                                                                                                        
3152 }                                                                                                                          
3153                                                                                                                            
3154 void ObjArrayKlass::oop_pc_update_pointers(oop obj, ParCompactionManager* cm) {                                            
3155   assert(obj->is_objArray(), "obj must be obj array");                                                                     
3156   PSParallelCompact::AdjustPointerClosure closure(cm);                                                                     
3157   if (UseCompressedOops) {                                                                                                 
3158     oop_oop_iterate_elements<narrowOop>(objArrayOop(obj), &closure);                                                       
3159   } else {                                                                                                                 
3160     oop_oop_iterate_elements<oop>(objArrayOop(obj), &closure);                                                             
3161   }                                                                                                                        
3162 }                                                                                                                          
3163                                                                                                                            
3164 void TypeArrayKlass::oop_pc_update_pointers(oop obj, ParCompactionManager* cm) {                                           
3165   assert(obj->is_typeArray(),"must be a type array");                                                                      
3166 }                                                                                                                          
3167 
3168 ParMarkBitMapClosure::IterationStatus                                                                                      
3169 MoveAndUpdateClosure::do_addr(HeapWord* addr, size_t words) {                                                              
3170   assert(destination() != NULL, "sanity");                                                                                 
3171   assert(bitmap()->obj_size(addr) == words, "bad size");                                                                   
3172 
3173   _source = addr;                                                                                                          
3174   assert(PSParallelCompact::summary_data().calc_new_pointer(source(), compaction_manager()) ==                             
3175          destination(), "wrong destination");                                                                              
3176 
3177   if (words > words_remaining()) {                                                                                         
3178     return ParMarkBitMap::would_overflow;                                                                                  
3179   }                                                                                                                        
3180 
3181   // The start_array must be updated even if the object is not moving.                                                     
3182   if (_start_array != NULL) {                                                                                              
3183     _start_array->allocate_block(destination());                                                                           
3184   }                                                                                                                        

3076   return ParMarkBitMap::full;
3077 }
3078 
3079 void MoveAndUpdateClosure::copy_partial_obj()
3080 {
3081   size_t words = words_remaining();
3082 
3083   HeapWord* const range_end = MIN2(source() + words, bitmap()->region_end());
3084   HeapWord* const end_addr = bitmap()->find_obj_end(source(), range_end);
3085   if (end_addr < range_end) {
3086     words = bitmap()->obj_size(source(), end_addr);
3087   }
3088 
3089   // This test is necessary; if omitted, the pointer updates to a partial object
3090   // that crosses the dense prefix boundary could be overwritten.
3091   if (source() != destination()) {
3092     DEBUG_ONLY(PSParallelCompact::check_new_location(source(), destination());)
3093     Copy::aligned_conjoint_words(source(), destination(), words);
3094   }
3095   update_state(words);






































































3096 }
3097 
3098 ParMarkBitMapClosure::IterationStatus
3099 MoveAndUpdateClosure::do_addr(HeapWord* addr, size_t words) {
3100   assert(destination() != NULL, "sanity");
3101   assert(bitmap()->obj_size(addr) == words, "bad size");
3102 
3103   _source = addr;
3104   assert(PSParallelCompact::summary_data().calc_new_pointer(source(), compaction_manager()) ==
3105          destination(), "wrong destination");
3106 
3107   if (words > words_remaining()) {
3108     return ParMarkBitMap::would_overflow;
3109   }
3110 
3111   // The start_array must be updated even if the object is not moving.
3112   if (_start_array != NULL) {
3113     _start_array->allocate_block(destination());
3114   }
< prev index next >