diff --git a/src/node_options.cc b/src/node_options.cc index dd68166b1656a5..48dcf8f7a3e468 100644 --- a/src/node_options.cc +++ b/src/node_options.cc @@ -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(memory_mb * percentage / 100.0); diff --git a/test/parallel/test-max-old-space-size-percentage.js b/test/parallel/test-max-old-space-size-percentage.js index 511a10109f9d2b..e55c426d7ee1a8 100644 --- a/test/parallel/test-max-old-space-size-percentage.js +++ b/test/parallel/test-max-old-space-size-percentage.js @@ -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)`