3333#include " logging/log.hpp"
3434#include " runtime/atomicAccess.hpp"
3535#include " runtime/globals_extension.hpp"
36+ #include " runtime/java.hpp"
3637#include " runtime/os.hpp"
3738#include " utilities/debug.hpp"
3839#include " utilities/globalDefinitions.hpp"
@@ -45,6 +46,7 @@ bool ZAdaptiveHeap::_can_adapt;
4546bool ZAdaptiveHeap::_initialized;
4647bool ZAdaptiveHeap::_initialized_generation_data;
4748ZAdaptiveHeap::ZIntensitySmoother ZAdaptiveHeap::_gc_intensities;
49+ ZBooleanStability ZAdaptiveHeap::_machine_memory_info_valid;
4850
4951Atomic<double > ZAdaptiveHeap::_young_to_old_gc_time (0.0 );
5052double ZAdaptiveHeap::_accumulated_young_gc_time = 0.0 ;
@@ -57,6 +59,21 @@ static double calculate_progression(double availability, double from, double to)
5759 return 1.0 - (availability - to) / (from - to);
5860}
5961
62+ bool ZBooleanStability::record_and_check_stability (bool observed) {
63+ const ValidityState observed_state = observed ? ValidityState::ObservedTrue : ValidityState::ObservedFalse;
64+
65+ ValidityState expected_state = _expected_state.load_relaxed ();
66+ if (expected_state == ValidityState::Uninitialized) {
67+ expected_state = _expected_state.compare_exchange (ValidityState::Uninitialized, observed_state);
68+ if (expected_state == ValidityState::Uninitialized) {
69+ // This is the first observation, so nothing to compare against
70+ return true ;
71+ }
72+ }
73+
74+ return expected_state == observed_state;
75+ }
76+
6077void ZAdaptiveHeap::ZIntensitySmoother::initialize () {
6178 _lock = new ZLock ();
6279}
@@ -285,6 +302,13 @@ ZMemoryPressureMetrics ZAdaptiveHeap::memory_pressure_metrics() {
285302
286303 const ZMachineMemoryInfo machine_memory_info = ZAdaptiveHeap::machine_memory_info ();
287304
305+ if (!_machine_memory_info_valid.record_and_check_stability (machine_memory_info._is_valid )) {
306+ log_warning (gc)(" The data source for machine_memory_info is unstable (expected _is_valid to be %s, got %s). "
307+ " This behavior is unsupported for Automatic Heap Sizing. Please run without Automatic Heap Sizing using -XX:ZGCIntensity=0" ,
308+ BOOL_TO_STR (!machine_memory_info._is_valid ), BOOL_TO_STR (machine_memory_info._is_valid ));
309+ vm_exit (1 );
310+ }
311+
288312 const physical_memory_size_type machine_max_memory = machine_memory_info._physical_memory ;
289313
290314 const physical_memory_size_type machine_used_memory = machine_memory_info._is_valid
0 commit comments