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

Print this page
rev 4561 : 7176479: G1: JVM crashes on T5-8 system with 1.5 TB heap
Summary: Refactor G1's hot card cache and card counts table into their own files. Simplify the card counts table, including removing the encoding of the card index in each entry. The card counts table now has a 1:1 correspondence with the cards spanned by heap. Space for the card counts table is reserved from virtual memory (rather than C heap) during JVM startup and is committed/expanded when the heap is expanded. Changes were also reviewed-by Vitaly Davidovich.
Reviewed-by:
   1 /*
   2  * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.
   8  *
   9  * This code is distributed in the hope that it will be useful, but WITHOUT
  10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  12  * version 2 for more details (a copy is included in the LICENSE file that
  13  * accompanied this code).
  14  *
  15  * You should have received a copy of the GNU General Public License version
  16  * 2 along with this work; if not, write to the Free Software Foundation,
  17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  18  *
  19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  20  * or visit www.oracle.com if you need additional information or have any
  21  * questions.
  22  *


 116   WorkerDataArray<double> _last_gc_worker_start_times_ms;
 117   WorkerDataArray<double> _last_ext_root_scan_times_ms;
 118   WorkerDataArray<double> _last_satb_filtering_times_ms;
 119   WorkerDataArray<double> _last_update_rs_times_ms;
 120   WorkerDataArray<int>    _last_update_rs_processed_buffers;
 121   WorkerDataArray<double> _last_scan_rs_times_ms;
 122   WorkerDataArray<double> _last_obj_copy_times_ms;
 123   WorkerDataArray<double> _last_termination_times_ms;
 124   WorkerDataArray<size_t> _last_termination_attempts;
 125   WorkerDataArray<double> _last_gc_worker_end_times_ms;
 126   WorkerDataArray<double> _last_gc_worker_times_ms;
 127   WorkerDataArray<double> _last_gc_worker_other_times_ms;
 128 
 129   double _cur_collection_par_time_ms;
 130   double _cur_collection_code_root_fixup_time_ms;
 131 
 132   double _cur_clear_ct_time_ms;
 133   double _cur_ref_proc_time_ms;
 134   double _cur_ref_enq_time_ms;
 135 
 136   // Card Table Count Cache stats
 137   double _min_clear_cc_time_ms;         // min
 138   double _max_clear_cc_time_ms;         // max
 139   double _cur_clear_cc_time_ms;         // clearing time during current pause
 140   double _cum_clear_cc_time_ms;         // cummulative clearing time
 141   jlong  _num_cc_clears;                // number of times the card count cache has been cleared
 142 
 143   double _cur_collection_start_sec;
 144   double _root_region_scan_wait_time_ms;
 145 
 146   double _recorded_young_cset_choice_time_ms;
 147   double _recorded_non_young_cset_choice_time_ms;
 148 
 149   double _recorded_young_free_cset_time_ms;
 150   double _recorded_non_young_free_cset_time_ms;
 151 
 152   double _cur_verify_before_time_ms;
 153   double _cur_verify_after_time_ms;
 154 
 155   // Helper methods for detailed logging
 156   void print_stats(int level, const char* str, double value);
 157   void print_stats(int level, const char* str, double value, int workers);
 158 
 159  public:
 160   G1GCPhaseTimes(uint max_gc_threads);
 161   void note_gc_start(uint active_gc_threads);
 162   void note_gc_end();


 210   void record_par_time(double ms) {
 211     _cur_collection_par_time_ms = ms;
 212   }
 213 
 214   void record_code_root_fixup_time(double ms) {
 215     _cur_collection_code_root_fixup_time_ms = ms;
 216   }
 217 
 218   void record_ref_proc_time(double ms) {
 219     _cur_ref_proc_time_ms = ms;
 220   }
 221 
 222   void record_ref_enq_time(double ms) {
 223     _cur_ref_enq_time_ms = ms;
 224   }
 225 
 226   void record_root_region_scan_wait_time(double time_ms) {
 227     _root_region_scan_wait_time_ms = time_ms;
 228   }
 229 
 230   void record_cc_clear_time_ms(double ms);
 231 
 232   void record_young_free_cset_time_ms(double time_ms) {
 233     _recorded_young_free_cset_time_ms = time_ms;
 234   }
 235 
 236   void record_non_young_free_cset_time_ms(double time_ms) {
 237     _recorded_non_young_free_cset_time_ms = time_ms;
 238   }
 239 
 240   void record_young_cset_choice_time_ms(double time_ms) {
 241     _recorded_young_cset_choice_time_ms = time_ms;
 242   }
 243 
 244   void record_non_young_cset_choice_time_ms(double time_ms) {
 245     _recorded_non_young_cset_choice_time_ms = time_ms;
 246   }
 247 
 248   void record_cur_collection_start_sec(double time_ms) {
 249     _cur_collection_start_sec = time_ms;
 250   }
 251 


   1 /*
   2  * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.
   8  *
   9  * This code is distributed in the hope that it will be useful, but WITHOUT
  10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  12  * version 2 for more details (a copy is included in the LICENSE file that
  13  * accompanied this code).
  14  *
  15  * You should have received a copy of the GNU General Public License version
  16  * 2 along with this work; if not, write to the Free Software Foundation,
  17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  18  *
  19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  20  * or visit www.oracle.com if you need additional information or have any
  21  * questions.
  22  *


 116   WorkerDataArray<double> _last_gc_worker_start_times_ms;
 117   WorkerDataArray<double> _last_ext_root_scan_times_ms;
 118   WorkerDataArray<double> _last_satb_filtering_times_ms;
 119   WorkerDataArray<double> _last_update_rs_times_ms;
 120   WorkerDataArray<int>    _last_update_rs_processed_buffers;
 121   WorkerDataArray<double> _last_scan_rs_times_ms;
 122   WorkerDataArray<double> _last_obj_copy_times_ms;
 123   WorkerDataArray<double> _last_termination_times_ms;
 124   WorkerDataArray<size_t> _last_termination_attempts;
 125   WorkerDataArray<double> _last_gc_worker_end_times_ms;
 126   WorkerDataArray<double> _last_gc_worker_times_ms;
 127   WorkerDataArray<double> _last_gc_worker_other_times_ms;
 128 
 129   double _cur_collection_par_time_ms;
 130   double _cur_collection_code_root_fixup_time_ms;
 131 
 132   double _cur_clear_ct_time_ms;
 133   double _cur_ref_proc_time_ms;
 134   double _cur_ref_enq_time_ms;
 135 







 136   double _cur_collection_start_sec;
 137   double _root_region_scan_wait_time_ms;
 138 
 139   double _recorded_young_cset_choice_time_ms;
 140   double _recorded_non_young_cset_choice_time_ms;
 141 
 142   double _recorded_young_free_cset_time_ms;
 143   double _recorded_non_young_free_cset_time_ms;
 144 
 145   double _cur_verify_before_time_ms;
 146   double _cur_verify_after_time_ms;
 147 
 148   // Helper methods for detailed logging
 149   void print_stats(int level, const char* str, double value);
 150   void print_stats(int level, const char* str, double value, int workers);
 151 
 152  public:
 153   G1GCPhaseTimes(uint max_gc_threads);
 154   void note_gc_start(uint active_gc_threads);
 155   void note_gc_end();


 203   void record_par_time(double ms) {
 204     _cur_collection_par_time_ms = ms;
 205   }
 206 
 207   void record_code_root_fixup_time(double ms) {
 208     _cur_collection_code_root_fixup_time_ms = ms;
 209   }
 210 
 211   void record_ref_proc_time(double ms) {
 212     _cur_ref_proc_time_ms = ms;
 213   }
 214 
 215   void record_ref_enq_time(double ms) {
 216     _cur_ref_enq_time_ms = ms;
 217   }
 218 
 219   void record_root_region_scan_wait_time(double time_ms) {
 220     _root_region_scan_wait_time_ms = time_ms;
 221   }
 222 


 223   void record_young_free_cset_time_ms(double time_ms) {
 224     _recorded_young_free_cset_time_ms = time_ms;
 225   }
 226 
 227   void record_non_young_free_cset_time_ms(double time_ms) {
 228     _recorded_non_young_free_cset_time_ms = time_ms;
 229   }
 230 
 231   void record_young_cset_choice_time_ms(double time_ms) {
 232     _recorded_young_cset_choice_time_ms = time_ms;
 233   }
 234 
 235   void record_non_young_cset_choice_time_ms(double time_ms) {
 236     _recorded_non_young_cset_choice_time_ms = time_ms;
 237   }
 238 
 239   void record_cur_collection_start_sec(double time_ms) {
 240     _cur_collection_start_sec = time_ms;
 241   }
 242