Print this page
Abort concurrent mark

@@ -346,11 +346,14 @@
   // structures is detected
   volatile bool           _has_overflown;
   // True: marking is concurrent, false: we're in remark
   volatile bool           _concurrent;
   // Set at the end of a Full GC so that marking aborts
-  volatile bool           _has_aborted;
+  volatile bool           _aborted_by_fullgc;
+  // Set at the end of a inital mark young GC if doesn't need to do concurrent mark
+  // so that marking aborts
+  volatile bool           _aborted_by_initial_mark;
 
   // Used when remark aborts due to an overflow to indicate that
   // another concurrent marking phase should start
   volatile bool           _restart_for_overflow;
 

@@ -507,13 +510,15 @@
 
   G1CMRootMemRegions* root_regions() { return &_root_regions; }
 
   void concurrent_cycle_start();
   // Abandon current marking iteration due to a Full GC.
-  void concurrent_cycle_abort();
+  void concurrent_cycle_abort_by_fullgc();
   void concurrent_cycle_end();
 
+  void concurrent_cycle_abort_by_initial_mark();
+
   void update_accum_task_vtime(int i, double vtime) {
     _accum_task_vtime[i] += vtime;
   }
 
   double all_task_accum_vtime() {

@@ -586,11 +591,13 @@
   // If marking is not in progress, it's a no-op.
   void verify_no_collection_set_oops() PRODUCT_RETURN;
 
   inline bool do_yield_check();
 
-  bool has_aborted()      { return _has_aborted; }
+  bool aborted_by_fullgc()             { return _aborted_by_fullgc; }
+  bool aborted_by_initial_mark()       { return _aborted_by_initial_mark; }
+  bool has_aborted()                   { return aborted_by_fullgc() || aborted_by_initial_mark(); }
 
   void print_summary_info();
 
   void print_worker_threads_on(outputStream* st) const;
   void threads_do(ThreadClosure* tc) const;