Skip to content

Commit 974c0f6

Browse files
committed
Tweak maxSemiSpaceSizeFlag calculation
1 parent 7e96928 commit 974c0f6

1 file changed

Lines changed: 35 additions & 15 deletions

File tree

src/flags.mts

Lines changed: 35 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)