@@ -63,7 +63,7 @@ export function getMaxOldSpaceSizeFlag(): number {
6363 _maxOldSpaceSizeFlag = Math . floor (
6464 // Total system memory in MiB.
6565 ( os . totalmem ( ) / 1024 / 1024 ) *
66- // Set 75% of total memory (safe buffer to avoid system pressure)
66+ // Set 75% of total memory (safe buffer to avoid system pressure).
6767 0.75 ,
6868 )
6969 }
@@ -87,22 +87,42 @@ export function getMaxSemiSpaceSizeFlag(): number {
8787 }
8888 if ( ! _maxSemiSpaceSizeFlag ) {
8989 const maxOldSpaceSize = getMaxOldSpaceSizeFlag ( )
90- // Dynamically scale semi-space size based on max-old-space-size
90+ // Dynamically scale semi-space size based on max-old-space-size.
9191 // https://nodejs.org/api/cli.html#--max-semi-space-sizesize-in-mib
92- if ( maxOldSpaceSize <= 512 ) {
93- _maxSemiSpaceSizeFlag = 4
94- } else if ( maxOldSpaceSize <= 1024 ) {
95- _maxSemiSpaceSizeFlag = 8
96- } else if ( maxOldSpaceSize <= 2048 ) {
97- _maxSemiSpaceSizeFlag = 16
98- } else if ( maxOldSpaceSize <= 4096 ) {
99- _maxSemiSpaceSizeFlag = 32
100- } else if ( maxOldSpaceSize <= 8192 ) {
101- _maxSemiSpaceSizeFlag = 64
102- } else if ( maxOldSpaceSize <= 16384 ) {
103- _maxSemiSpaceSizeFlag = 128
92+ if ( maxOldSpaceSize <= 8192 ) {
93+ // Use tiered values for smaller heaps to avoid excessive young
94+ // generation size. This helps stay within safe memory limits on
95+ // constrained systems or CI.
96+ if ( maxOldSpaceSize <= 512 ) {
97+ _maxSemiSpaceSizeFlag = 4
98+ } else if ( maxOldSpaceSize <= 1024 ) {
99+ _maxSemiSpaceSizeFlag = 8
100+ } else if ( maxOldSpaceSize <= 2048 ) {
101+ _maxSemiSpaceSizeFlag = 16
102+ } else if ( maxOldSpaceSize <= 4096 ) {
103+ _maxSemiSpaceSizeFlag = 32
104+ } else {
105+ _maxSemiSpaceSizeFlag = 64
106+ }
104107 } else {
105- _maxSemiSpaceSizeFlag = 256
108+ // For large heaps (> 8 GiB), compute semi-space size using a log-scaled
109+ // function.
110+ //
111+ // The idea:
112+ // - log2(16384 MiB) = 14 → semi = 14 * 8 = 112
113+ // - log2(32768 MiB) = 15 → semi = 15 * 8 = 120
114+ // - Scales gradually as heap increases, avoiding overly large jumps
115+ //
116+ // Each 1 MiB of semi-space adds ~3 MiB to the total young generation
117+ // (V8 uses 3 spaces). So this keeps semi-space proportional, without
118+ // over committing.
119+ //
120+ // Also note: V8 won’t benefit much from >256 MiB semi-space unless
121+ // you’re allocating large short-lived objects very frequently
122+ // (e.g. large arrays, buffers).
123+ const log2OldSpace = Math . log2 ( maxOldSpaceSize )
124+ const scaledSemiSpace = Math . floor ( log2OldSpace ) * 8
125+ _maxSemiSpaceSizeFlag = scaledSemiSpace
106126 }
107127 }
108128 }
0 commit comments