Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
misc improvement.
  • Loading branch information
Hamlin-Li committed Mar 16, 2021
1 parent 51325ed commit 278326e
Show file tree
Hide file tree
Showing 8 changed files with 18 additions and 37 deletions.
2 changes: 1 addition & 1 deletion src/hotspot/share/gc/g1/g1ConcurrentMark.cpp
Expand Up @@ -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),
Expand Down
4 changes: 0 additions & 4 deletions src/hotspot/share/gc/g1/g1ConcurrentMark.hpp
Expand Up @@ -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;
Expand Down
7 changes: 0 additions & 7 deletions src/hotspot/share/gc/g1/g1FullCollector.cpp
Expand Up @@ -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);
}

{
Expand Down
4 changes: 2 additions & 2 deletions src/hotspot/share/gc/g1/g1FullGCMarker.cpp
Expand Up @@ -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();
}
Expand Down
9 changes: 4 additions & 5 deletions src/hotspot/share/gc/g1/g1FullGCMarker.hpp
Expand Up @@ -65,9 +65,6 @@ class G1FullGCMarker : public CHeapObj<mtGC> {


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);
Expand All @@ -80,8 +77,10 @@ class G1FullGCMarker : public CHeapObj<mtGC> {
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
Expand Down
18 changes: 5 additions & 13 deletions src/hotspot/share/gc/g1/g1RegionMarkStatsCache.cpp
Expand Up @@ -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<size_t, size_t> G1RegionMarkStatsCache::evict_all() {
for (uint i = 0; i < _num_cache_entries; i++) {
Expand All @@ -64,12 +53,15 @@ Pair<size_t, size_t> G1RegionMarkStatsCache::evict_all() {
return Pair<size_t,size_t>(_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);
}
}
10 changes: 6 additions & 4 deletions src/hotspot/share/gc/g1/g1RegionMarkStatsCache.hpp
Expand Up @@ -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();
}

Expand Down Expand Up @@ -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;
Expand Down
1 change: 0 additions & 1 deletion src/hotspot/share/gc/g1/heapRegion.hpp
Expand Up @@ -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"
Expand Down

0 comments on commit 278326e

Please sign in to comment.