src/share/vm/gc_implementation/g1/g1CollectedHeap.hpp

Print this page
rev 2896 : 6484965: G1: piggy-back liveness accounting phase on marking
Summary: Remove the separate counting phase of concurrent marking by tracking the amount of marked bytes and the cards spanned by marked objects in marking task/worker thread local data structures, which are updated as individual objects are marked.
Reviewed-by: brutisso

@@ -860,11 +860,12 @@
   // structures.
   void finalize_for_evac_failure();
 
   // An attempt to evacuate "obj" has failed; take necessary steps.
   oop handle_evacuation_failure_par(OopsInHeapRegionClosure* cl, oop obj,
-                                    bool should_mark_root);
+                                    bool should_mark_root,
+                                    int worker_i);
   void handle_evacuation_failure_common(oop obj, markOop m);
 
   // ("Weak") Reference processing support.
   //
   // G1 has 2 instances of the referece processor class. One

@@ -1728,10 +1729,11 @@
     // starts from the middle of the bitmap, we need to add enough
     // space (i.e. up to a bitmap word) to ensure that we have
     // enough bits in the bitmap.
     return bits_in_bitmap + BitsPerWord - 1;
   }
+
 public:
   GCLabBitMap(HeapWord* heap_start, size_t gclab_word_size)
     : BitMap(bitmap_size_in_bits(gclab_word_size)),
       _cm(G1CollectedHeap::heap()->concurrent_mark()),
       _shifter(shifter()),

@@ -1817,34 +1819,11 @@
     GCLabBitMapClosure cl(_cm, this);
     iterate(&cl);
   }
 #endif // PRODUCT
 
-  void retire() {
-    guarantee(use_local_bitmaps, "invariant");
-    assert(fields_well_formed(), "invariant");
-
-    if (_start_word != NULL) {
-      CMBitMap*       mark_bitmap = _cm->nextMarkBitMap();
-
-      // this means that the bitmap was set up for the GCLab
-      assert(_real_start_word != NULL && _real_end_word != NULL, "invariant");
-
-      mark_bitmap->mostly_disjoint_range_union(this,
-                                0, // always start from the start of the bitmap
-                                _start_word,
-                                gclab_real_word_size());
-      _cm->grayRegionIfNecessary(MemRegion(_real_start_word, _real_end_word));
-
-#ifndef PRODUCT
-      if (use_local_bitmaps && verify_local_bitmaps)
-        verify();
-#endif // PRODUCT
-    } else {
-      assert(_real_start_word == NULL && _real_end_word == NULL, "invariant");
-    }
-  }
+  void retire(int worker_i);
 
   size_t bitmap_size_in_words() const {
     return (bitmap_size_in_bits(gclab_word_size()) + BitsPerWord - 1) / BitsPerWord;
   }
 

@@ -1853,13 +1832,14 @@
 class G1ParGCAllocBuffer: public ParGCAllocBuffer {
 private:
   bool        _retired;
   bool        _should_mark_objects;
   GCLabBitMap _bitmap;
+  int         _worker_i;
 
 public:
-  G1ParGCAllocBuffer(size_t gclab_word_size);
+  G1ParGCAllocBuffer(size_t gclab_word_size, int worker_i);
 
   inline bool mark(HeapWord* addr) {
     guarantee(use_local_bitmaps, "invariant");
     assert(_should_mark_objects, "invariant");
     return _bitmap.mark(addr);

@@ -1875,11 +1855,11 @@
 
   inline void retire(bool end_of_gc, bool retain) {
     if (_retired)
       return;
     if (use_local_bitmaps && _should_mark_objects) {
-      _bitmap.retire();
+      _bitmap.retire(_worker_i);
     }
     ParGCAllocBuffer::retire(end_of_gc, retain);
     _retired = true;
   }
 };