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 }
|