Skip to content

Commit c5b7a93

Browse files
committed
Work in progress for decoupling memory_pressure_metrics and recording of high usage
1 parent 92fbb20 commit c5b7a93

7 files changed

Lines changed: 39 additions & 21 deletions

File tree

src/hotspot/share/gc/z/zAdaptiveHeap.cpp

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -372,15 +372,6 @@ ZMemoryPressureMetrics ZAdaptiveHeap::memory_pressure_metrics() {
372372
container_critical_threshold = machine_critical_threshold;
373373
}
374374

375-
// Record sampled memory usage so we can measure memory stability
376-
const double machine_usage = double(machine_used_memory) / double(machine_max_memory);
377-
ZStatSystemMemoryUsage::record_machine_usage(machine_usage);
378-
379-
if (is_containerized) {
380-
const double container_usage = double(container_used_memory) / double(container_max_memory);
381-
ZStatSystemMemoryUsage::record_container_usage(container_usage);
382-
}
383-
384375
return {
385376
unscaled_gc_intensity,
386377
is_containerized,
@@ -825,6 +816,7 @@ size_t ZAdaptiveHeap::compute_heap_size(ZHeapResizeMetrics* heap_metrics, ZGener
825816

826817
// System memory load
827818
ZMemoryPressureMetrics mem_metrics = memory_pressure_metrics();
819+
ZStatSystemMemoryUsage::record(mem_metrics);
828820

829821
// System CPU load
830822
ZCpuPressureMetrics cpu_metrics = cpu_pressure_metrics(generation);
@@ -1096,10 +1088,8 @@ static uint64_t system_uncommit_delay(const ZSystemMemoryPressureMetrics& metric
10961088
// How long to wait until it is time to uncommit memory. This goes towards
10971089
// infinity when there is no concerning memory pressure, then from ZUncommitDelay
10981090
// when concerning down to 500 when high, and eventually 0 when critically low.
1099-
uint64_t ZAdaptiveHeap::uncommit_delay() {
1091+
uint64_t ZAdaptiveHeap::uncommit_delay(const ZMemoryPressureMetrics& metrics, size_t capacity) {
11001092
precond(_initialized);
1101-
ZMemoryPressureMetrics metrics = memory_pressure_metrics();
1102-
const size_t capacity = ZHeap::heap()->capacity();
11031093

11041094
const uint64_t machine_uncommit_delay = system_uncommit_delay(metrics._machine, capacity);
11051095

@@ -1111,6 +1101,17 @@ uint64_t ZAdaptiveHeap::uncommit_delay() {
11111101
return MIN2(machine_uncommit_delay, container_uncommit_delay);
11121102
}
11131103

1104+
uint64_t ZAdaptiveHeap::uncommit_delay() {
1105+
precond(_initialized);
1106+
1107+
ZMemoryPressureMetrics mem_metrics = memory_pressure_metrics();
1108+
ZStatSystemMemoryUsage::record(mem_metrics);
1109+
1110+
const size_t capacity = ZHeap::heap()->capacity();
1111+
1112+
return uncommit_delay(mem_metrics, capacity);
1113+
}
1114+
11141115
uint64_t ZAdaptiveHeap::soft_ref_delay() {
11151116
precond(_initialized);
11161117
ZStatHeap* const stats = ZGeneration::old()->stat_heap();

src/hotspot/share/gc/z/zAdaptiveHeap.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,7 @@ class ZAdaptiveHeap : public AllStatic {
150150
static uint64_t no_uncommit_delay();
151151
static uint64_t urgent_uncommit_delay();
152152
static uint64_t critical_uncommit_delay();
153+
static uint64_t uncommit_delay(const ZMemoryPressureMetrics& metrics, size_t capacity);
153154
static uint64_t uncommit_delay();
154155

155156
static uint64_t soft_ref_delay();

src/hotspot/share/gc/z/zMemoryWorker.cpp

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -253,10 +253,8 @@ bool ZMemoryWorker::has_uncommit_matured(Ticks now, uint64_t uncommit_delay, siz
253253
return elapsed >= uncommit_delay;
254254
}
255255

256-
void ZMemoryWorker::wake_up_if_uncommit_matured() {
256+
void ZMemoryWorker::wake_up_if_uncommit_matured(uint64_t uncommit_delay) {
257257
Ticks now = Ticks::now();
258-
const uint64_t uncommit_delay = ZAdaptiveHeap::uncommit_delay();
259-
260258
ZLocker<ZConditionLock> locker(&_lock);
261259
if (has_uncommit_matured(now, uncommit_delay, _target_uncommit_capacity.load_relaxed())) {
262260
_lock.notify_all();

src/hotspot/share/gc/z/zMemoryWorker.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ class ZMemoryWorker : public ZThread {
104104
void request_grow_capacity(size_t requested_capacity);
105105
void request_shrink_capacity(size_t requested_capacity);
106106
void request_shrink_capacity_granule();
107-
void wake_up_if_uncommit_matured();
107+
void wake_up_if_uncommit_matured(uint64_t uncommit_delay);
108108

109109
// Heating requests
110110
void register_heating_request(const ZVirtualMemory& vmem);

src/hotspot/share/gc/z/zPageAllocator.cpp

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1766,25 +1766,31 @@ void ZPageAllocator::heap_truncated(size_t selected_capacity) {
17661766
}
17671767

17681768
void ZPageAllocator::adjust_capacity(size_t used_soon) {
1769-
const ZMemoryPressureMetrics mem_pressure = ZAdaptiveHeap::memory_pressure_metrics();
1769+
const ZMemoryPressureMetrics mem_metrics = ZAdaptiveHeap::memory_pressure_metrics();
1770+
ZStatSystemMemoryUsage::record(mem_metrics);
1771+
1772+
const size_t total_capacity = capacity();
1773+
const uint64_t uncommit_delay = ZAdaptiveHeap::uncommit_delay(mem_metrics, total_capacity);
1774+
17701775
ZPerNUMAIterator<ZPartition> iter = partition_iterator();
17711776

17721777
for (ZPartition* partition; iter.next(&partition);) {
17731778
ZMemoryWorker& mem_worker = partition->memory_worker();
1774-
const size_t cap = partition->capacity();
1779+
const size_t partition_capacity = partition->capacity();
17751780

1776-
if (ZAdaptiveHeap::is_memory_pressure_high(mem_pressure)) {
1781+
if (ZAdaptiveHeap::is_memory_pressure_high(mem_metrics)) {
17771782
// When memory usage is high, request uncommitting if possible
17781783
mem_worker.request_shrink_capacity_granule();
17791784
} else {
17801785
// When memory pressure is not high, try to commit memory ahead of mutators.
17811786
const uint32_t numa_id = partition->numa_id();
17821787
const size_t used_soon_share = ZNUMA::calculate_share(numa_id, used_soon);
1783-
if (used_soon_share > cap) {
1788+
if (used_soon_share > partition_capacity) {
17841789
mem_worker.request_grow_capacity(used_soon_share);
17851790
}
17861791
}
1787-
mem_worker.wake_up_if_uncommit_matured();
1792+
1793+
mem_worker.wake_up_if_uncommit_matured(uncommit_delay);
17881794
}
17891795
}
17901796

src/hotspot/share/gc/z/zStat.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1066,6 +1066,16 @@ void ZStatSystemMemoryUsage::ZSystemMemoryUsage::sample_and_collect() {
10661066
_memory_stability.store_relaxed(sd);
10671067
}
10681068

1069+
void ZStatSystemMemoryUsage::record(const ZMemoryPressureMetrics& metrics) {
1070+
const double machine_usage = double(metrics._machine._used_memory) / double(metrics._machine._max_memory);
1071+
record_machine_usage(machine_usage);
1072+
1073+
if (metrics._is_containerized) {
1074+
const double container_usage = double(metrics._container._used_memory) / double(metrics._container._max_memory);
1075+
record_container_usage(container_usage);
1076+
}
1077+
}
1078+
10691079
void ZStatSystemMemoryUsage::record_container_usage(double usage) {
10701080
_container_usage.record_usage(usage);
10711081
}

src/hotspot/share/gc/z/zStat.hpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040

4141
class GCTracer;
4242
class ZGeneration;
43+
struct ZMemoryPressureMetrics;
4344
class ZPage;
4445
class ZPageAllocatorStats;
4546
class ZRelocationSetSelectorGroupStats;
@@ -403,6 +404,7 @@ class ZStatSystemMemoryUsage : public AllStatic {
403404
static ZSystemMemoryUsage _machine_usage;
404405

405406
public:
407+
static void record(const ZMemoryPressureMetrics& metrics);
406408
static void record_container_usage(double usage);
407409
static void record_machine_usage(double usage);
408410

0 commit comments

Comments
 (0)