diff --git a/src/hotspot/share/gc/g1/g1ConcurrentMark.cpp b/src/hotspot/share/gc/g1/g1ConcurrentMark.cpp index 0c5002285cb90..39f79e9a6d08a 100644 --- a/src/hotspot/share/gc/g1/g1ConcurrentMark.cpp +++ b/src/hotspot/share/gc/g1/g1ConcurrentMark.cpp @@ -2842,7 +2842,7 @@ G1CMTask::G1CMTask(uint worker_id, _cm(cm), _next_mark_bitmap(NULL), _task_queue(task_queue), - _mark_stats_cache(mark_stats, RegionMarkStatsCacheSize), + _mark_stats_cache(mark_stats, G1RegionMarkStatsCache::RegionMarkStatsCacheSize), _calls(0), _time_target_ms(0.0), _start_time_ms(0.0), diff --git a/src/hotspot/share/gc/g1/g1ConcurrentMark.hpp b/src/hotspot/share/gc/g1/g1ConcurrentMark.hpp index 2e0171a72eeda..eadad2d9adbad 100644 --- a/src/hotspot/share/gc/g1/g1ConcurrentMark.hpp +++ b/src/hotspot/share/gc/g1/g1ConcurrentMark.hpp @@ -617,10 +617,6 @@ class G1CMTask : public TerminatorTerminator { init_hash_seed = 17 }; - // Number of entries in the per-task stats entry. This seems enough to have a very - // low cache miss rate. - static const uint RegionMarkStatsCacheSize = 1024; - G1CMObjArrayProcessor _objArray_processor; uint _worker_id; diff --git a/src/hotspot/share/gc/g1/g1FullCollector.cpp b/src/hotspot/share/gc/g1/g1FullCollector.cpp index 990aeddfb5171..26290197bda20 100644 --- a/src/hotspot/share/gc/g1/g1FullCollector.cpp +++ b/src/hotspot/share/gc/g1/g1FullCollector.cpp @@ -245,13 +245,6 @@ void G1FullCollector::phase1_mark_live_objects() { // Do the actual marking. G1FullGCMarkTask marking_task(this); run_task(&marking_task); - - // collect live bytes. - size_t sum = 0; - for (uint j = 0; j < _heap->max_regions(); j++) { - sum += _live_stats[j]._live_words; - } - _heap->set_used(sum * HeapWordSize); } { diff --git a/src/hotspot/share/gc/g1/g1FullGCMarker.cpp b/src/hotspot/share/gc/g1/g1FullGCMarker.cpp index 443da8cc429ee..2959a5e1826e3 100644 --- a/src/hotspot/share/gc/g1/g1FullGCMarker.cpp +++ b/src/hotspot/share/gc/g1/g1FullGCMarker.cpp @@ -45,8 +45,8 @@ G1FullGCMarker::G1FullGCMarker(G1FullCollector* collector, _verify_closure(VerifyOption_G1UseFullMarking), _stack_closure(this), _cld_closure(mark_closure(), ClassLoaderData::_claim_strong), - _mark_region_cache(mark_stats, RegionMarkStatsCacheSize) { - _mark_region_cache.initialize(); + _mark_region_cache(mark_stats, G1RegionMarkStatsCache::RegionMarkStatsCacheSize) { + _mark_region_cache.reset(); _oop_stack.initialize(); _objarray_stack.initialize(); } diff --git a/src/hotspot/share/gc/g1/g1FullGCMarker.hpp b/src/hotspot/share/gc/g1/g1FullGCMarker.hpp index 734a5ca0befb3..21b3906199f8b 100644 --- a/src/hotspot/share/gc/g1/g1FullGCMarker.hpp +++ b/src/hotspot/share/gc/g1/g1FullGCMarker.hpp @@ -65,9 +65,6 @@ class G1FullGCMarker : public CHeapObj { G1RegionMarkStatsCache _mark_region_cache; - // Number of entries in the per-task stats entry. This seems enough to have a very - // low cache miss rate. - static const uint RegionMarkStatsCacheSize = 1024; inline bool is_empty(); inline bool pop_object(oop& obj); @@ -80,8 +77,10 @@ class G1FullGCMarker : public CHeapObj { inline void follow_array(objArrayOop array); inline void follow_array_chunk(objArrayOop array, int index); public: - G1FullGCMarker(G1FullCollector* collector, uint worker_id, - PreservedMarks* preserved_stack, G1RegionMarkStats* mark_stats); + G1FullGCMarker(G1FullCollector* collector, + uint worker_id, + PreservedMarks* preserved_stack, + G1RegionMarkStats* mark_stats); ~G1FullGCMarker(); // Stack getters diff --git a/src/hotspot/share/gc/g1/g1RegionMarkStatsCache.cpp b/src/hotspot/share/gc/g1/g1RegionMarkStatsCache.cpp index a4d0ba7211c22..c8b9b2fd0ba04 100644 --- a/src/hotspot/share/gc/g1/g1RegionMarkStatsCache.cpp +++ b/src/hotspot/share/gc/g1/g1RegionMarkStatsCache.cpp @@ -45,17 +45,6 @@ G1RegionMarkStatsCache::~G1RegionMarkStatsCache() { FREE_C_HEAP_ARRAY(G1RegionMarkStatsCacheEntry, _cache); } -// cache size is equal to or bigger than region size to intialize region_index -void G1RegionMarkStatsCache::initialize() { - _cache_hits = 0; - _cache_misses = 0; - - for (uint i = 0; i < _num_cache_entries; i++) { - _cache[i].clear(); - _cache[i]._region_idx = i; - } -} - // Evict all remaining statistics, returning cache hits and misses. Pair G1RegionMarkStatsCache::evict_all() { for (uint i = 0; i < _num_cache_entries; i++) { @@ -64,12 +53,15 @@ Pair G1RegionMarkStatsCache::evict_all() { return Pair(_cache_hits, _cache_misses); } -// Reset all cache entries to their default values. +// Reset liveness of all cache entries to their default values, +// initialize _region_idx to avoid initial cache miss. void G1RegionMarkStatsCache::reset() { _cache_hits = 0; _cache_misses = 0; for (uint i = 0; i < _num_cache_entries; i++) { - _cache[i].clear(); + // Avoid the initial cache miss and eviction by setting the i'th's cache + // region_idx to the region_idx due to how the hash is calculated. + _cache[i].clear(i); } } diff --git a/src/hotspot/share/gc/g1/g1RegionMarkStatsCache.hpp b/src/hotspot/share/gc/g1/g1RegionMarkStatsCache.hpp index 98926bad7abbb..509b6a93f7574 100644 --- a/src/hotspot/share/gc/g1/g1RegionMarkStatsCache.hpp +++ b/src/hotspot/share/gc/g1/g1RegionMarkStatsCache.hpp @@ -69,8 +69,8 @@ class G1RegionMarkStatsCache { uint _region_idx; G1RegionMarkStats _stats; - void clear() { - _region_idx = 0; + void clear(uint idx = 0) { + _region_idx = idx; _stats.clear(); } @@ -98,12 +98,14 @@ class G1RegionMarkStatsCache { G1RegionMarkStatsCacheEntry* find_for_add(uint region_idx); public: + // Number of entries in the per-task stats entry. This seems enough to have a very + // low cache miss rate. + static const uint RegionMarkStatsCacheSize = 1024; + G1RegionMarkStatsCache(G1RegionMarkStats* target, uint num_cache_entries); ~G1RegionMarkStatsCache(); - void initialize(); - void add_live_words(uint region_idx, size_t live_words) { G1RegionMarkStatsCacheEntry* const cur = find_for_add(region_idx); cur->_stats._live_words += live_words; diff --git a/src/hotspot/share/gc/g1/heapRegion.hpp b/src/hotspot/share/gc/g1/heapRegion.hpp index 7de1ea57601a0..482aa7d554f2b 100644 --- a/src/hotspot/share/gc/g1/heapRegion.hpp +++ b/src/hotspot/share/gc/g1/heapRegion.hpp @@ -27,7 +27,6 @@ #include "gc/g1/g1BlockOffsetTable.hpp" #include "gc/g1/g1HeapRegionTraceType.hpp" -#include "gc/g1/g1RegionMarkStatsCache.hpp" #include "gc/g1/g1SurvRateGroup.hpp" #include "gc/g1/heapRegionTracer.hpp" #include "gc/g1/heapRegionType.hpp"