src: assert memory calc for max-old-space-size-percentage

Add validation to ensure that --max-old-space-size-percentage cannot
be used when available memory cannot be calculated, preventing
undefined behavior when memory detection fails.

Also enhance test-process-constrained-memory.js to support testing
in constrained environments where memory calculation may fail.

PR-URL: https://github.com/nodejs/node/pull/59460
Reviewed-By: theanarkh <theratliter@gmail.com>
Reviewed-By: Moshe Atlow <moshe@atlow.co.il>
This commit is contained in:
Asaf Federman
2025-08-18 09:51:48 +03:00
committed by GitHub
parent bac083304d
commit f5e6ba3d7c
2 changed files with 13 additions and 3 deletions

View File

@@ -138,6 +138,11 @@ void PerIsolateOptions::HandleMaxOldSpaceSizePercentage(
? constrained_memory
: total_memory;
if (available_memory == 0) {
errors->push_back("the available memory can not be calculated");
return;
}
// Convert to MB and calculate the percentage
uint64_t memory_mb = available_memory / (1024 * 1024);
uint64_t calculated_mb = static_cast<size_t>(memory_mb * percentage / 100.0);

View File

@@ -119,14 +119,19 @@ assert(
// Validate heap sizes against system memory
const totalMemoryMB = Math.floor(os.totalmem() / 1024 / 1024);
const margin = 10; // 5% margin
const uint64Max = 2 ** 64 - 1;
const constrainedMemory = process.constrainedMemory();
const constrainedMemoryMB = Math.floor(constrainedMemory / 1024 / 1024);
const effectiveMemoryMB =
constrainedMemory > 0 && constrainedMemory !== uint64Max ? constrainedMemoryMB : totalMemoryMB;
const margin = 10; // 10% margin
testPercentages.forEach((percentage) => {
const upperLimit = totalMemoryMB * ((percentage + margin) / 100);
const upperLimit = effectiveMemoryMB * ((percentage + margin) / 100);
assert(
heapSizes[percentage] <= upperLimit,
`Heap size for ${percentage}% (${heapSizes[percentage]} MB) should not exceed upper limit (${upperLimit} MB)`
);
const lowerLimit = totalMemoryMB * ((percentage - margin) / 100);
const lowerLimit = effectiveMemoryMB * ((percentage - margin) / 100);
assert(
heapSizes[percentage] >= lowerLimit,
`Heap size for ${percentage}% (${heapSizes[percentage]} MB) should not be less than lower limit (${lowerLimit} MB)`