aoqi@0: /* aoqi@0: * Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved. aoqi@0: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. aoqi@0: * aoqi@0: * This code is free software; you can redistribute it and/or modify it aoqi@0: * under the terms of the GNU General Public License version 2 only, as aoqi@0: * published by the Free Software Foundation. aoqi@0: * aoqi@0: * This code is distributed in the hope that it will be useful, but WITHOUT aoqi@0: * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or aoqi@0: * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License aoqi@0: * version 2 for more details (a copy is included in the LICENSE file that aoqi@0: * accompanied this code). aoqi@0: * aoqi@0: * You should have received a copy of the GNU General Public License version aoqi@0: * 2 along with this work; if not, write to the Free Software Foundation, aoqi@0: * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. aoqi@0: * aoqi@0: * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA aoqi@0: * or visit www.oracle.com if you need additional information or have any aoqi@0: * questions. aoqi@0: * aoqi@0: */ aoqi@0: aoqi@0: #ifndef SHARE_VM_GC_IMPLEMENTATION_G1_SURVRATEGROUP_HPP aoqi@0: #define SHARE_VM_GC_IMPLEMENTATION_G1_SURVRATEGROUP_HPP aoqi@0: aoqi@0: #include "utilities/numberSeq.hpp" aoqi@0: aoqi@0: class G1CollectorPolicy; aoqi@0: aoqi@0: class SurvRateGroup : public CHeapObj { aoqi@0: private: aoqi@0: G1CollectorPolicy* _g1p; aoqi@0: const char* _name; aoqi@0: aoqi@0: size_t _stats_arrays_length; aoqi@0: double* _surv_rate; aoqi@0: double* _accum_surv_rate_pred; aoqi@0: double _last_pred; aoqi@0: double _accum_surv_rate; aoqi@0: TruncatedSeq** _surv_rate_pred; aoqi@0: NumberSeq** _summary_surv_rates; aoqi@0: size_t _summary_surv_rates_len; aoqi@0: size_t _summary_surv_rates_max_len; aoqi@0: aoqi@0: int _all_regions_allocated; aoqi@0: size_t _region_num; aoqi@0: size_t _setup_seq_num; aoqi@0: aoqi@0: public: aoqi@0: SurvRateGroup(G1CollectorPolicy* g1p, aoqi@0: const char* name, aoqi@0: size_t summary_surv_rates_len); aoqi@0: void reset(); aoqi@0: void start_adding_regions(); aoqi@0: void stop_adding_regions(); aoqi@0: void record_surviving_words(int age_in_group, size_t surv_words); aoqi@0: void all_surviving_words_recorded(bool propagate); aoqi@0: const char* name() { return _name; } aoqi@0: aoqi@0: size_t region_num() { return _region_num; } aoqi@0: double accum_surv_rate_pred(int age) { aoqi@0: assert(age >= 0, "must be"); aoqi@0: if ((size_t)age < _stats_arrays_length) aoqi@0: return _accum_surv_rate_pred[age]; aoqi@0: else { aoqi@0: double diff = (double) (age - _stats_arrays_length + 1); aoqi@0: return _accum_surv_rate_pred[_stats_arrays_length-1] + diff * _last_pred; aoqi@0: } aoqi@0: } aoqi@0: aoqi@0: double accum_surv_rate(size_t adjustment); aoqi@0: aoqi@0: TruncatedSeq* get_seq(size_t age) { aoqi@0: if (age >= _setup_seq_num) { aoqi@0: guarantee( _setup_seq_num > 0, "invariant" ); aoqi@0: age = _setup_seq_num-1; aoqi@0: } aoqi@0: TruncatedSeq* seq = _surv_rate_pred[age]; aoqi@0: guarantee( seq != NULL, "invariant" ); aoqi@0: return seq; aoqi@0: } aoqi@0: aoqi@0: int next_age_index(); aoqi@0: int age_in_group(int age_index) { aoqi@0: int ret = (int) (_all_regions_allocated - age_index); aoqi@0: assert( ret >= 0, "invariant" ); aoqi@0: return ret; aoqi@0: } aoqi@0: void finished_recalculating_age_indexes() { aoqi@0: _all_regions_allocated = 0; aoqi@0: } aoqi@0: aoqi@0: #ifndef PRODUCT aoqi@0: void print(); aoqi@0: void print_surv_rate_summary(); aoqi@0: #endif // PRODUCT aoqi@0: }; aoqi@0: aoqi@0: #endif // SHARE_VM_GC_IMPLEMENTATION_G1_SURVRATEGROUP_HPP