109 lines
4.4 KiB
Diff
109 lines
4.4 KiB
Diff
From bdff9eab4eb0bc16ebdbe908cc6237e0a70d53e6 Mon Sep 17 00:00:00 2001
|
|
Date: Sat, 26 Dec 2020 11:22:37 +0800
|
|
Subject: Use atomic operation when G1Uncommit
|
|
|
|
Summary: <g1>: <Use atomic operation when G1Uncommit>
|
|
LLT: jtreg
|
|
Patch Type: huawei
|
|
---
|
|
.../vm/gc_implementation/g1/g1BiasedArray.hpp | 5 ++++
|
|
.../g1/g1RegionToSpaceMapper.cpp | 11 ++++-----
|
|
.../vm/gc_implementation/g1/heapRegion.cpp | 24 +++++++++++++++++++
|
|
3 files changed, 33 insertions(+), 7 deletions(-)
|
|
|
|
diff --git a/hotspot/src/share/vm/gc_implementation/g1/g1BiasedArray.hpp b/hotspot/src/share/vm/gc_implementation/g1/g1BiasedArray.hpp
|
|
index 88a673574..e13c3fe8d 100644
|
|
--- a/hotspot/src/share/vm/gc_implementation/g1/g1BiasedArray.hpp
|
|
+++ b/hotspot/src/share/vm/gc_implementation/g1/g1BiasedArray.hpp
|
|
@@ -109,6 +109,11 @@ public:
|
|
return this->base()[index];
|
|
}
|
|
|
|
+ T* get_address_by_index(idx_t index) const {
|
|
+ verify_index(index);
|
|
+ return this->base() + index;
|
|
+ }
|
|
+
|
|
// Set the element of the given array at the given index to the
|
|
// given value. Assume the index is valid. This is a convenience
|
|
// method that does sanity checking on the index.
|
|
diff --git a/hotspot/src/share/vm/gc_implementation/g1/g1RegionToSpaceMapper.cpp b/hotspot/src/share/vm/gc_implementation/g1/g1RegionToSpaceMapper.cpp
|
|
index 0c26b783e..51b2bd8ad 100644
|
|
--- a/hotspot/src/share/vm/gc_implementation/g1/g1RegionToSpaceMapper.cpp
|
|
+++ b/hotspot/src/share/vm/gc_implementation/g1/g1RegionToSpaceMapper.cpp
|
|
@@ -115,12 +115,11 @@ class G1RegionsSmallerThanCommitSizeMapper : public G1RegionToSpaceMapper {
|
|
for (uint i = start_idx; i < start_idx + num_regions; i++) {
|
|
assert(!_commit_map.at(i), err_msg("Trying to commit storage at region %u that is already committed", i));
|
|
size_t idx = region_idx_to_page_idx(i);
|
|
- uint old_refcount = _refcounts.get_by_index(idx);
|
|
+ uint new_refcount = Atomic::add(1, (volatile jint*)_refcounts.get_address_by_index(idx));
|
|
bool zero_filled = false;
|
|
- if (old_refcount == 0) {
|
|
+ if (new_refcount == 1) {
|
|
zero_filled = _storage.commit(idx, 1);
|
|
}
|
|
- _refcounts.set_by_index(idx, old_refcount + 1);
|
|
_commit_map.set_bit(i);
|
|
fire_on_commit(i, 1, zero_filled);
|
|
}
|
|
@@ -130,12 +129,10 @@ class G1RegionsSmallerThanCommitSizeMapper : public G1RegionToSpaceMapper {
|
|
for (uint i = start_idx; i < start_idx + num_regions; i++) {
|
|
assert(_commit_map.at(i), err_msg("Trying to uncommit storage at region %u that is not committed", i));
|
|
size_t idx = region_idx_to_page_idx(i);
|
|
- uint old_refcount = _refcounts.get_by_index(idx);
|
|
- assert(old_refcount > 0, "must be");
|
|
- if (old_refcount == 1) {
|
|
+ uint new_refcount = Atomic::add(-1, (volatile jint*)_refcounts.get_address_by_index(idx));
|
|
+ if (new_refcount == 0) {
|
|
_storage.uncommit(idx, 1);
|
|
}
|
|
- _refcounts.set_by_index(idx, old_refcount - 1);
|
|
_commit_map.clear_bit(i);
|
|
}
|
|
}
|
|
diff --git a/hotspot/src/share/vm/gc_implementation/g1/heapRegion.cpp b/hotspot/src/share/vm/gc_implementation/g1/heapRegion.cpp
|
|
index 32f8b1985..987d2c138 100644
|
|
--- a/hotspot/src/share/vm/gc_implementation/g1/heapRegion.cpp
|
|
+++ b/hotspot/src/share/vm/gc_implementation/g1/heapRegion.cpp
|
|
@@ -322,6 +322,29 @@ HeapRegion::HeapRegion(uint hrm_index,
|
|
}
|
|
|
|
void HeapRegion::initialize(MemRegion mr, bool clear_space, bool mangle_space) {
|
|
+ _humongous_start_region = NULL;
|
|
+ _in_collection_set = false;
|
|
+ _next_in_special_set = NULL;
|
|
+ _orig_end = NULL;
|
|
+ _claimed = InitialClaimValue;
|
|
+ _evacuation_failed = false;
|
|
+ _prev_marked_bytes = 0;
|
|
+ _next_marked_bytes = 0;
|
|
+ _gc_efficiency = 0.0;
|
|
+ _next_young_region = NULL;
|
|
+ _next_dirty_cards_region = NULL;
|
|
+ _next = NULL;
|
|
+ _prev = NULL;
|
|
+#ifdef ASSERT
|
|
+ _containing_set = NULL;
|
|
+#endif // ASSERT
|
|
+ _in_uncommit_list = false;
|
|
+ _young_index_in_cset = -1;
|
|
+ _surv_rate_group = NULL;
|
|
+ _age_index = -1;
|
|
+ _recorded_rs_length = 0;
|
|
+ _predicted_elapsed_time_ms = 0;
|
|
+ _predicted_bytes_to_copy = 0;
|
|
assert(_rem_set->is_empty(), "Remembered set must be empty");
|
|
|
|
G1OffsetTableContigSpace::initialize(mr, clear_space, mangle_space);
|
|
@@ -1161,6 +1184,7 @@ G1OffsetTableContigSpace(G1BlockOffsetSharedArray* sharedOffsetArray,
|
|
|
|
void G1OffsetTableContigSpace::initialize(MemRegion mr, bool clear_space, bool mangle_space) {
|
|
CompactibleSpace::initialize(mr, clear_space, mangle_space);
|
|
+ _gc_time_stamp = 0;
|
|
_top = bottom();
|
|
_scan_top = bottom();
|
|
set_saved_mark_word(NULL);
|
|
--
|
|
2.19.0
|
|
|