Since #1405 turned Scope and Export into Xbase / JvmModelInferrer languages, Eclipse builds of large DDK-based workspaces allocate much more, keep more memory alive, and do more work after git branch switches. In a long IDE session this compounds into GC pressure, and the effect seems strongest on Windows with Microsoft Defender scanning every file the builders write.
Measurements
These are headless Eclipse runs on a synthetic downstream-shaped workspace (L: 98 projects, 59 .scope, 59 .export, 939 .xtend), with the stock Xtext builder, alternating git checkout between two branches that differ only in Java/Xtend files. There are 2 runs per variant on macOS. Wall times were too noisy on that machine to quote, so the table shows counters and memory.
|
1e0a5c8 (2026-06-29) |
v19.2.0 |
master + fixes below |
| full build: allocated |
50.5 GB |
75.2 GB (+49%) |
61.2 GB |
| full build: live set afterwards |
402 MB |
634 MB |
398 MB |
| per branch switch: allocated |
6.1 GB |
6.8 GB |
6.1 GB |
per branch switch: .export re-processed |
0 |
2 |
0 |
| live-set growth per switch (20 switches, M workload) |
0.3 MB |
7.9 MB |
0.3 MB |
Causes found and fixes (draft PRs)
- A thread-local leak in
ExportJvmModelInferrer keeps the last export resource's whole builder resource set alive. Fixed in the R12 PR.
- Scope/Export generation rebuilds an all-EPackages type resolver per expression, a project class loader per method body, and uncached genmodel lookups. Fixed in the Tier A PR, with byte-identical output.
- Java-only changes re-queue and regenerate
.export files, because Xbase records the EMF interfaces as imported names. Fixed in the R1 PR, which is for discussion.
- What remains after these fixes is about +20% full-build allocation. That is the inherent cost of Scope/Export being full Xbase languages. Whether they need to be is a separate design question.
A before/after measurement of each PR on the affected Windows machine is in progress. The PRs stay drafts until it is in.
🤖 Generated with Claude Code
https://claude.ai/code/session_01LgVRfQCTxSDwGrN8J5s6fd
Since #1405 turned Scope and Export into Xbase / JvmModelInferrer languages, Eclipse builds of large DDK-based workspaces allocate much more, keep more memory alive, and do more work after git branch switches. In a long IDE session this compounds into GC pressure, and the effect seems strongest on Windows with Microsoft Defender scanning every file the builders write.
Measurements
These are headless Eclipse runs on a synthetic downstream-shaped workspace (L: 98 projects, 59
.scope, 59.export, 939.xtend), with the stock Xtext builder, alternatinggit checkoutbetween two branches that differ only in Java/Xtend files. There are 2 runs per variant on macOS. Wall times were too noisy on that machine to quote, so the table shows counters and memory..exportre-processedCauses found and fixes (draft PRs)
ExportJvmModelInferrerkeeps the last export resource's whole builder resource set alive. Fixed in the R12 PR..exportfiles, because Xbase records the EMF interfaces as imported names. Fixed in the R1 PR, which is for discussion.A before/after measurement of each PR on the affected Windows machine is in progress. The PRs stay drafts until it is in.
🤖 Generated with Claude Code
https://claude.ai/code/session_01LgVRfQCTxSDwGrN8J5s6fd