src/hotspot/share/gc/g1/g1RegionMarkStatsCache.hpp
author manc
Mon, 14 Oct 2019 18:48:10 -0700
changeset 58652 9b67dd88a931
parent 53244 9807daeb47c4
permissions -rw-r--r--
8232232: G1RemSetSummary::_rs_threads_vtimes is not initialized to zero Summary: Fix error in "Concurrent refinement threads times" in GC log and cleanup. Reviewed-by: tschatzl, kbarrett
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
49606
9ae8719efcae 8197850: Calculate liveness in regions during marking
tschatzl
parents:
diff changeset
     1
/*
53244
9807daeb47c4 8216167: Update include guards to reflect correct directories
coleenp
parents: 49606
diff changeset
     2
 * Copyright (c) 2018, 2019, Oracle and/or its affiliates. All rights reserved.
49606
9ae8719efcae 8197850: Calculate liveness in regions during marking
tschatzl
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
9ae8719efcae 8197850: Calculate liveness in regions during marking
tschatzl
parents:
diff changeset
     4
 *
9ae8719efcae 8197850: Calculate liveness in regions during marking
tschatzl
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
9ae8719efcae 8197850: Calculate liveness in regions during marking
tschatzl
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
9ae8719efcae 8197850: Calculate liveness in regions during marking
tschatzl
parents:
diff changeset
     7
 * published by the Free Software Foundation.
9ae8719efcae 8197850: Calculate liveness in regions during marking
tschatzl
parents:
diff changeset
     8
 *
9ae8719efcae 8197850: Calculate liveness in regions during marking
tschatzl
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
9ae8719efcae 8197850: Calculate liveness in regions during marking
tschatzl
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
9ae8719efcae 8197850: Calculate liveness in regions during marking
tschatzl
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
9ae8719efcae 8197850: Calculate liveness in regions during marking
tschatzl
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
9ae8719efcae 8197850: Calculate liveness in regions during marking
tschatzl
parents:
diff changeset
    13
 * accompanied this code).
9ae8719efcae 8197850: Calculate liveness in regions during marking
tschatzl
parents:
diff changeset
    14
 *
9ae8719efcae 8197850: Calculate liveness in regions during marking
tschatzl
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
9ae8719efcae 8197850: Calculate liveness in regions during marking
tschatzl
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
9ae8719efcae 8197850: Calculate liveness in regions during marking
tschatzl
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
9ae8719efcae 8197850: Calculate liveness in regions during marking
tschatzl
parents:
diff changeset
    18
 *
9ae8719efcae 8197850: Calculate liveness in regions during marking
tschatzl
parents:
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
9ae8719efcae 8197850: Calculate liveness in regions during marking
tschatzl
parents:
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
9ae8719efcae 8197850: Calculate liveness in regions during marking
tschatzl
parents:
diff changeset
    21
 * questions.
9ae8719efcae 8197850: Calculate liveness in regions during marking
tschatzl
parents:
diff changeset
    22
 *
9ae8719efcae 8197850: Calculate liveness in regions during marking
tschatzl
parents:
diff changeset
    23
 */
9ae8719efcae 8197850: Calculate liveness in regions during marking
tschatzl
parents:
diff changeset
    24
53244
9807daeb47c4 8216167: Update include guards to reflect correct directories
coleenp
parents: 49606
diff changeset
    25
#ifndef SHARE_GC_G1_G1REGIONMARKSTATSCACHE_HPP
9807daeb47c4 8216167: Update include guards to reflect correct directories
coleenp
parents: 49606
diff changeset
    26
#define SHARE_GC_G1_G1REGIONMARKSTATSCACHE_HPP
49606
9ae8719efcae 8197850: Calculate liveness in regions during marking
tschatzl
parents:
diff changeset
    27
9ae8719efcae 8197850: Calculate liveness in regions during marking
tschatzl
parents:
diff changeset
    28
#include "memory/allocation.hpp"
9ae8719efcae 8197850: Calculate liveness in regions during marking
tschatzl
parents:
diff changeset
    29
#include "utilities/debug.hpp"
9ae8719efcae 8197850: Calculate liveness in regions during marking
tschatzl
parents:
diff changeset
    30
#include "utilities/globalDefinitions.hpp"
9ae8719efcae 8197850: Calculate liveness in regions during marking
tschatzl
parents:
diff changeset
    31
#include "utilities/pair.hpp"
9ae8719efcae 8197850: Calculate liveness in regions during marking
tschatzl
parents:
diff changeset
    32
9ae8719efcae 8197850: Calculate liveness in regions during marking
tschatzl
parents:
diff changeset
    33
// Per-Region statistics gathered during marking.
9ae8719efcae 8197850: Calculate liveness in regions during marking
tschatzl
parents:
diff changeset
    34
//
9ae8719efcae 8197850: Calculate liveness in regions during marking
tschatzl
parents:
diff changeset
    35
// This includes
9ae8719efcae 8197850: Calculate liveness in regions during marking
tschatzl
parents:
diff changeset
    36
// * the number of live words gathered during marking for the area from bottom
9ae8719efcae 8197850: Calculate liveness in regions during marking
tschatzl
parents:
diff changeset
    37
// to ntams. This is an exact measure.
9ae8719efcae 8197850: Calculate liveness in regions during marking
tschatzl
parents:
diff changeset
    38
// The code corrects later for the live data between ntams and top.
9ae8719efcae 8197850: Calculate liveness in regions during marking
tschatzl
parents:
diff changeset
    39
struct G1RegionMarkStats {
9ae8719efcae 8197850: Calculate liveness in regions during marking
tschatzl
parents:
diff changeset
    40
  size_t _live_words;
9ae8719efcae 8197850: Calculate liveness in regions during marking
tschatzl
parents:
diff changeset
    41
9ae8719efcae 8197850: Calculate liveness in regions during marking
tschatzl
parents:
diff changeset
    42
  // Clear all members.
9ae8719efcae 8197850: Calculate liveness in regions during marking
tschatzl
parents:
diff changeset
    43
  void clear() {
9ae8719efcae 8197850: Calculate liveness in regions during marking
tschatzl
parents:
diff changeset
    44
    _live_words = 0;
9ae8719efcae 8197850: Calculate liveness in regions during marking
tschatzl
parents:
diff changeset
    45
  }
9ae8719efcae 8197850: Calculate liveness in regions during marking
tschatzl
parents:
diff changeset
    46
  // Clear all members after a marking overflow. Nothing to do as the live words
9ae8719efcae 8197850: Calculate liveness in regions during marking
tschatzl
parents:
diff changeset
    47
  // are updated by the atomic mark. We do not remark objects after overflow.
9ae8719efcae 8197850: Calculate liveness in regions during marking
tschatzl
parents:
diff changeset
    48
  void clear_during_overflow() {
9ae8719efcae 8197850: Calculate liveness in regions during marking
tschatzl
parents:
diff changeset
    49
  }
9ae8719efcae 8197850: Calculate liveness in regions during marking
tschatzl
parents:
diff changeset
    50
9ae8719efcae 8197850: Calculate liveness in regions during marking
tschatzl
parents:
diff changeset
    51
  bool is_clear() const { return _live_words == 0; }
9ae8719efcae 8197850: Calculate liveness in regions during marking
tschatzl
parents:
diff changeset
    52
};
9ae8719efcae 8197850: Calculate liveness in regions during marking
tschatzl
parents:
diff changeset
    53
9ae8719efcae 8197850: Calculate liveness in regions during marking
tschatzl
parents:
diff changeset
    54
// Per-marking thread cache for the region mark statistics.
9ae8719efcae 8197850: Calculate liveness in regions during marking
tschatzl
parents:
diff changeset
    55
//
9ae8719efcae 8197850: Calculate liveness in regions during marking
tschatzl
parents:
diff changeset
    56
// Each cache is a larg'ish map of region-idx -> G1RegionMarkStats entries that cache
9ae8719efcae 8197850: Calculate liveness in regions during marking
tschatzl
parents:
diff changeset
    57
// currently gathered statistics; entries are evicted to the global statistics array
9ae8719efcae 8197850: Calculate liveness in regions during marking
tschatzl
parents:
diff changeset
    58
// on every collision. This minimizes synchronization overhead which would be required
9ae8719efcae 8197850: Calculate liveness in regions during marking
tschatzl
parents:
diff changeset
    59
// every time statistics change, as marking is very localized.
9ae8719efcae 8197850: Calculate liveness in regions during marking
tschatzl
parents:
diff changeset
    60
// The map entry number is a power of two to allow simple and fast hashing using
9ae8719efcae 8197850: Calculate liveness in regions during marking
tschatzl
parents:
diff changeset
    61
// logical and.
9ae8719efcae 8197850: Calculate liveness in regions during marking
tschatzl
parents:
diff changeset
    62
class G1RegionMarkStatsCache {
9ae8719efcae 8197850: Calculate liveness in regions during marking
tschatzl
parents:
diff changeset
    63
private:
9ae8719efcae 8197850: Calculate liveness in regions during marking
tschatzl
parents:
diff changeset
    64
  // The array of statistics entries to evict to; the global array.
9ae8719efcae 8197850: Calculate liveness in regions during marking
tschatzl
parents:
diff changeset
    65
  G1RegionMarkStats* _target;
9ae8719efcae 8197850: Calculate liveness in regions during marking
tschatzl
parents:
diff changeset
    66
  // Number of entries in the eviction target.
9ae8719efcae 8197850: Calculate liveness in regions during marking
tschatzl
parents:
diff changeset
    67
  uint _num_stats;
9ae8719efcae 8197850: Calculate liveness in regions during marking
tschatzl
parents:
diff changeset
    68
9ae8719efcae 8197850: Calculate liveness in regions during marking
tschatzl
parents:
diff changeset
    69
  // An entry of the statistics cache.
9ae8719efcae 8197850: Calculate liveness in regions during marking
tschatzl
parents:
diff changeset
    70
  struct G1RegionMarkStatsCacheEntry {
9ae8719efcae 8197850: Calculate liveness in regions during marking
tschatzl
parents:
diff changeset
    71
    uint _region_idx;
9ae8719efcae 8197850: Calculate liveness in regions during marking
tschatzl
parents:
diff changeset
    72
    G1RegionMarkStats _stats;
9ae8719efcae 8197850: Calculate liveness in regions during marking
tschatzl
parents:
diff changeset
    73
9ae8719efcae 8197850: Calculate liveness in regions during marking
tschatzl
parents:
diff changeset
    74
    void clear() {
9ae8719efcae 8197850: Calculate liveness in regions during marking
tschatzl
parents:
diff changeset
    75
      _region_idx = 0;
9ae8719efcae 8197850: Calculate liveness in regions during marking
tschatzl
parents:
diff changeset
    76
      _stats.clear();
9ae8719efcae 8197850: Calculate liveness in regions during marking
tschatzl
parents:
diff changeset
    77
    }
9ae8719efcae 8197850: Calculate liveness in regions during marking
tschatzl
parents:
diff changeset
    78
9ae8719efcae 8197850: Calculate liveness in regions during marking
tschatzl
parents:
diff changeset
    79
    bool is_clear() const {
9ae8719efcae 8197850: Calculate liveness in regions during marking
tschatzl
parents:
diff changeset
    80
      return _region_idx == 0 && _stats.is_clear();
9ae8719efcae 8197850: Calculate liveness in regions during marking
tschatzl
parents:
diff changeset
    81
    }
9ae8719efcae 8197850: Calculate liveness in regions during marking
tschatzl
parents:
diff changeset
    82
  };
9ae8719efcae 8197850: Calculate liveness in regions during marking
tschatzl
parents:
diff changeset
    83
9ae8719efcae 8197850: Calculate liveness in regions during marking
tschatzl
parents:
diff changeset
    84
  // The actual cache and its number of entries.
9ae8719efcae 8197850: Calculate liveness in regions during marking
tschatzl
parents:
diff changeset
    85
  G1RegionMarkStatsCacheEntry* _cache;
9ae8719efcae 8197850: Calculate liveness in regions during marking
tschatzl
parents:
diff changeset
    86
  uint _num_cache_entries;
9ae8719efcae 8197850: Calculate liveness in regions during marking
tschatzl
parents:
diff changeset
    87
9ae8719efcae 8197850: Calculate liveness in regions during marking
tschatzl
parents:
diff changeset
    88
  // Cache hits/miss counters.
9ae8719efcae 8197850: Calculate liveness in regions during marking
tschatzl
parents:
diff changeset
    89
  size_t _cache_hits;
9ae8719efcae 8197850: Calculate liveness in regions during marking
tschatzl
parents:
diff changeset
    90
  size_t _cache_misses;
9ae8719efcae 8197850: Calculate liveness in regions during marking
tschatzl
parents:
diff changeset
    91
9ae8719efcae 8197850: Calculate liveness in regions during marking
tschatzl
parents:
diff changeset
    92
  // Evict a given element of the statistics cache.
9ae8719efcae 8197850: Calculate liveness in regions during marking
tschatzl
parents:
diff changeset
    93
  void evict(uint idx);
9ae8719efcae 8197850: Calculate liveness in regions during marking
tschatzl
parents:
diff changeset
    94
9ae8719efcae 8197850: Calculate liveness in regions during marking
tschatzl
parents:
diff changeset
    95
  size_t _num_cache_entries_mask;
9ae8719efcae 8197850: Calculate liveness in regions during marking
tschatzl
parents:
diff changeset
    96
9ae8719efcae 8197850: Calculate liveness in regions during marking
tschatzl
parents:
diff changeset
    97
  uint hash(uint idx) {
9ae8719efcae 8197850: Calculate liveness in regions during marking
tschatzl
parents:
diff changeset
    98
    return idx & _num_cache_entries_mask;
9ae8719efcae 8197850: Calculate liveness in regions during marking
tschatzl
parents:
diff changeset
    99
  }
9ae8719efcae 8197850: Calculate liveness in regions during marking
tschatzl
parents:
diff changeset
   100
9ae8719efcae 8197850: Calculate liveness in regions during marking
tschatzl
parents:
diff changeset
   101
  G1RegionMarkStatsCacheEntry* find_for_add(uint region_idx);
9ae8719efcae 8197850: Calculate liveness in regions during marking
tschatzl
parents:
diff changeset
   102
public:
9ae8719efcae 8197850: Calculate liveness in regions during marking
tschatzl
parents:
diff changeset
   103
  G1RegionMarkStatsCache(G1RegionMarkStats* target, uint max_regions, uint num_cache_entries);
9ae8719efcae 8197850: Calculate liveness in regions during marking
tschatzl
parents:
diff changeset
   104
9ae8719efcae 8197850: Calculate liveness in regions during marking
tschatzl
parents:
diff changeset
   105
  ~G1RegionMarkStatsCache();
9ae8719efcae 8197850: Calculate liveness in regions during marking
tschatzl
parents:
diff changeset
   106
9ae8719efcae 8197850: Calculate liveness in regions during marking
tschatzl
parents:
diff changeset
   107
  void add_live_words(uint region_idx, size_t live_words) {
9ae8719efcae 8197850: Calculate liveness in regions during marking
tschatzl
parents:
diff changeset
   108
    G1RegionMarkStatsCacheEntry* const cur = find_for_add(region_idx);
9ae8719efcae 8197850: Calculate liveness in regions during marking
tschatzl
parents:
diff changeset
   109
    cur->_stats._live_words += live_words;
9ae8719efcae 8197850: Calculate liveness in regions during marking
tschatzl
parents:
diff changeset
   110
  }
9ae8719efcae 8197850: Calculate liveness in regions during marking
tschatzl
parents:
diff changeset
   111
9ae8719efcae 8197850: Calculate liveness in regions during marking
tschatzl
parents:
diff changeset
   112
  void reset(uint region_idx) {
9ae8719efcae 8197850: Calculate liveness in regions during marking
tschatzl
parents:
diff changeset
   113
    uint const cache_idx = hash(region_idx);
9ae8719efcae 8197850: Calculate liveness in regions during marking
tschatzl
parents:
diff changeset
   114
    G1RegionMarkStatsCacheEntry* cur = &_cache[cache_idx];
9ae8719efcae 8197850: Calculate liveness in regions during marking
tschatzl
parents:
diff changeset
   115
    if (cur->_region_idx == region_idx) {
9ae8719efcae 8197850: Calculate liveness in regions during marking
tschatzl
parents:
diff changeset
   116
      _cache[cache_idx].clear();
9ae8719efcae 8197850: Calculate liveness in regions during marking
tschatzl
parents:
diff changeset
   117
    }
9ae8719efcae 8197850: Calculate liveness in regions during marking
tschatzl
parents:
diff changeset
   118
  }
9ae8719efcae 8197850: Calculate liveness in regions during marking
tschatzl
parents:
diff changeset
   119
9ae8719efcae 8197850: Calculate liveness in regions during marking
tschatzl
parents:
diff changeset
   120
  // Evict all remaining statistics, returning cache hits and misses.
9ae8719efcae 8197850: Calculate liveness in regions during marking
tschatzl
parents:
diff changeset
   121
  Pair<size_t, size_t> evict_all();
9ae8719efcae 8197850: Calculate liveness in regions during marking
tschatzl
parents:
diff changeset
   122
9ae8719efcae 8197850: Calculate liveness in regions during marking
tschatzl
parents:
diff changeset
   123
  // Reset all cache entries to their default values.
9ae8719efcae 8197850: Calculate liveness in regions during marking
tschatzl
parents:
diff changeset
   124
  void reset();
9ae8719efcae 8197850: Calculate liveness in regions during marking
tschatzl
parents:
diff changeset
   125
9ae8719efcae 8197850: Calculate liveness in regions during marking
tschatzl
parents:
diff changeset
   126
  size_t hits() const { return _cache_hits; }
9ae8719efcae 8197850: Calculate liveness in regions during marking
tschatzl
parents:
diff changeset
   127
  size_t misses() const { return _cache_misses; }
9ae8719efcae 8197850: Calculate liveness in regions during marking
tschatzl
parents:
diff changeset
   128
};
9ae8719efcae 8197850: Calculate liveness in regions during marking
tschatzl
parents:
diff changeset
   129
53244
9807daeb47c4 8216167: Update include guards to reflect correct directories
coleenp
parents: 49606
diff changeset
   130
#endif // SHARE_GC_G1_G1REGIONMARKSTATSCACHE_HPP