Repository navigation
TSC Regression causing crash (Heap OOM) between version 4.8.4 & 4.9.3 in large project #53087
Description
Bug Report
When updating typescript within our project from version 4.7.3 to a more recent version, our project began experiencing OOM issues.
Specifically, it is completely unable to build via tsc or even tsc --noEmit.
Ours is a somewhat large project, so I couldn't point to a minimal reproduction (sorry!).
I have 16GB of RAM so I doubt its a "classic" memory error, seems more likely something started infinitely using memory during a version upgrade.
<--- Last few GCs --->
[7915:0x5f6b230] 32781 ms: Mark-sweep (reduce) 2041.6 (2082.5) -> 2040.8 (2083.0) MB, 492.6 / 0.0 ms (average mu = 0.088, current mu = 0.038) allocation failure; scavenge might not succeed
[7915:0x5f6b230] 33342 ms: Mark-sweep (reduce) 2041.9 (2083.0) -> 2041.1 (2083.2) MB, 556.2 / 0.0 ms (average mu = 0.047, current mu = 0.009) allocation failure; scavenge might not succeed
<--- JS stacktrace --->
FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memory
1: 0xb6d470 node::Abort() [node]
2: 0xa7e0a8 [node]
3: 0xd46ee0 v8::Utils::ReportOOMFailure(v8::internal::Isolate*, char const*, bool) [node]
4: 0xd47287 v8::internal::V8::FatalProcessOutOfMemory(v8::internal::Isolate*, char const*, bool) [node]
5: 0xf24645 [node]
6: 0xf25548 v8::internal::Heap::RecomputeLimits(v8::internal::GarbageCollector) [node]
7: 0xf35a53 [node]
8: 0xf368c8 v8::internal::Heap::CollectGarbage(v8::internal::AllocationSpace, v8::internal::GarbageCollectionReason, v8::GCCallbackFlags) [node]
9: 0xf1122e v8::internal::HeapAllocator::AllocateRawWithLightRetrySlowPath(int, v8::internal::AllocationType, v8::internal::AllocationOrigin, v8::internal::AllocationAlignment) [node]
10: 0xf125f7 v8::internal::HeapAllocator::AllocateRawWithRetryOrFailSlowPath(int, v8::internal::AllocationType, v8::internal::AllocationOrigin, v8::internal::AllocationAlignment) [node]
11: 0xef37ca v8::internal::Factory::NewFillerObject(int, v8::internal::AllocationAlignment, v8::internal::AllocationType, v8::internal::AllocationOrigin) [node]
12: 0x12b6d6f v8::internal::Runtime_AllocateInYoungGeneration(int, unsigned long*, v8::internal::Isolate*) [node]
13: 0x16e89b9 [node]
[1] 7915 abort tsc --noEmit
🔎 Search Terms
tsc 4.9 4.9.5 Out of Memory Heap Out of Memory Crash Killed Silent Error
(Am i doing this right?)
🕗 Version & Regression Information
Error began occuring when updating from typescript 4.7.3 to any 4.9.3^ version.
Issue persists into Version 5.1.0-dev.20230303 (nightly at time of testing).
Issue is NOT present in v4.8.4, or any prior version we tried (that satisfied our dependencies, anyways.)
- This is a crash
- This changed between versions 4.8.4 and 4.9.3
💻 Code
Branch state is: https://github.com/Eranziel/foundryvtt-lancer/tree/oom
Was unable to produce a minimally viable reproduction, as the OOM error gives next to no context as to where the issue occurs or why. Sorry. More than willing to provide more investigative information, but I don't really know what there is to provide.
🙁 Actual behavior
It crashes on more recent versions for no clear reason.
🙂 Expected behavior
I'd rather it didn't.
Activity
liuxingbaoyu commentedon Mar 5, 2023
FYI: You can try https://github.com/microsoft/TypeScript/wiki/Performance-Tracing, it helped us locate the problem in #50515.
whitespine commentedon Mar 5, 2023
I will attempt this as soon as i have recruited someone with enough ram to run it without crashing :)
whitespine commentedon Mar 5, 2023
4.8.4 Diagnostic information:
5.1.0-dev.20230305 Diagnostic information:
Notably there is an about 5x increase in memory usage, as well as a >5x increase in the "Types" and "Symbols".
Now that I can actually build on v10 there several new errors, most interesting among them the following:
src/module/item/license-sheet.ts:37:23 - error TS2590: Expression produces a union type that is too complex to represent.The line is ```TS
for (let d of docs as LancerItem[])
Where
docsis of type:docs: StoredDocument<LancerActor | Scene | LancerItem | JournalEntry | Macro | Playlist | RollTable>[].Here's where "it's a big project" sort of bites us, in that I can't really minimally represent these types here in this comment. Each is a unique class, all with a shared parent class.
Maybe this is indicative of large union types being the root of our problem?
...
Observing the trace, the file

src/module/comp-builder.tsis responsible for an entire 53 SECONDS of the total 57 second Check Time. It produces no errors.Unsure how to proceed from here.
ritschwumm commentedon Mar 5, 2023
i had a quite similar issue recently after upgrading typescript. i can't remember the details, but it seems the problem was that under some circumstances tsc started creating a lot of types internally when asked to infer the type of a (typewise) complicated function. in the end, writing
const foo:FunctionType = (it) => ...instead ofconst foo = (it:FunctionArgs):FunctionReturn => ...solved the issue. maybe something similar is happening here?Raynos commentedon Mar 15, 2023
Ran into this issue myself today on a large project.
arlyon commentedon Mar 17, 2023
Similar regression on 5.0.2. For me, 4.8.3 is ok.
thanks for the exceptional bug report Jade Henry (@whitespine)!
karlhorky commentedon Mar 17, 2023
jakebailey commentedon Mar 18, 2023
Raynos commentedon Mar 20, 2023
I was able to solve the OOM issue for myself with
JarekToro commentedon Mar 28, 2023
Since Jake Verbaten (@Raynos) solution is really just a stop gap. What is needed to further this ticket. We also have a large project that works fine on
4.8.4but cant upgrade to 4.9 or 5.0 because tsc gets an OOM errorJarekToro commentedon Mar 28, 2023
Here is what I have gathered from running some test.
Test Ran with
NODE_OPTIONS=--max-old-space-size=8192 tsc --noEmit --diagnostics --extendedDiagnostics --incremental falseHere is 4.8
Here is 4.9
I also generated a trace

From looking into the trace. It seems to be stuck in a loop related to the
i18next&react-i18nextThis is basically the part that loops (if I followed the trace right)
That lib is for sure complicated typewise. But it worked as it should in 4.8 and breaks compilation in 4.9 and 5.0
Anything else I can provide? Jake Bailey (@jakebailey)
jakebailey commentedon Mar 28, 2023
We've made some improvements recently that feel like this issue; can you try the nightly build?
29 remaining items
esetnik commentedon Jul 11, 2023
Dominik Urban (@ashylen) unfortunately the latest versions of i18next didn't resolve the issue for me. See reproducible example here i18next/i18next#1921 (comment)
stephenasuncionDEV commentedon Aug 22, 2023
Still getting this issue. I'm getting the following error:
when running
tsc --pretty --noEmiteven if I set the space size like the following:wakaztahir commentedon Sep 8, 2023
Typescript compiler
4.8.4works, I downgraded to build my projectjakebailey commentedon Oct 12, 2023
This thread has lots and lots of people with likely different issues; I've recently published a tool which makes it easy to bisect issues in TypeScript without knowing how to build TypeScript itself: https://www.npmjs.com/package/every-ts#bisecting
It'd be extremely helpful for those who know which versions do and don't work to use this tool to identify which change in particular broke things; doing so will allow us to categorize these issues.
felixmeziere commentedon Mar 14, 2024
We have the same issue as original and it is also with
i18next, it's been blocking us from upgrading the library for almost a year :/jakebailey commentedon Mar 14, 2024
Do you have a repo that can be cloned and tested consistently?
felixmeziere commentedon Apr 4, 2024
Hi, I didn't manage to create a repo reproducing the error but I have found a fix for the issue in i18next, I will report back there with a PR in 2-3 weeks if everything has worked as expected in the meantime, and link it here so that you can analyse wether it's something ts could get better at.
Basically the issue has to do with values and inferences within conditional types being computed when they shouldn't (moving a ternary up the type stack and doing some type caching with const fixed the issue (not sure what I say strictly makes sense as I'm a noob in typing jargon but you get the idea)).
i18next/i18next#2138 (comment)
felixmeziere commentedon Apr 4, 2024
In the meantime here is what seems to do the trick, in case someone wants to have a look i18next/i18next@master...GreenGoTech:i18next:master
fix: Typescript OOM (microsoft/TypeScript#53087)
NomanGul commentedon Aug 16, 2024
doing this helped me trace the actual problem. I had some recursive types in my code that were causing this issue.