< prev index next >

src/share/vm/gc/g1/g1CollectedHeap.cpp

Print this page
rev 9312 : 8139424: SIGSEGV, Problematic frame: # V [libjvm.so+0xd0c0cc] void InstanceKlass::oop_oop_iterate_oop_maps_specialized<true,oopDesc*,MarkAndPushClosure>
Summary: The crash was caused by a faulty eager humongous reclaim. The reason for reclaiming a live obejct was that the call to cleanupHRRS was done after dirtying cards and clearing the remembered sets for the humongous object. This could lead to one or many cards being missed.
Reviewed-by:

@@ -3559,10 +3559,13 @@
               *card_ptr = CardTableModRefBS::dirty_card_val();
               _dcq.enqueue(card_ptr);
             }
           }
         }
+        guarantee(r->rem_set()->occupied() == hrrs.n_yielded(),
+                  "All entries should have been handled, occupied: " SIZE_FORMAT " n_yielded: " SIZE_FORMAT,
+                  r->rem_set()->occupied(), hrrs.n_yielded());
         r->rem_set()->clear_locked();
       }
       assert(r->rem_set()->is_empty(), "At this point any humongous candidate remembered set must be empty.");
     }
     _total_humongous++;

@@ -3846,10 +3849,15 @@
         double time_remaining_ms = g1_policy()->finalize_young_cset_part(target_pause_time_ms);
         g1_policy()->finalize_old_cset_part(time_remaining_ms);
 
         evacuation_info.set_collectionset_regions(g1_policy()->cset_region_length());
 
+        // Make sure the remembered sets are up to date. This needs to be
+        // done before register_humongous_regions_with_cset(), otherwise
+        // we might miss some entries that needs to be handled.
+        g1_rem_set()->cleanupHRRS();
+
         register_humongous_regions_with_cset();
 
         assert(check_cset_fast_test(), "Inconsistency in the InCSetState table.");
 
         _cm->note_start_of_gc();
< prev index next >