Chuyện gì đang xảy ra
VS Code hiển thị hộp thoại: The window has crashed (reason: 'oom', code: '139'). Editor bị đơ, cửa sổ trắng xóa, đôi khi kéo theo cả workspace. Đây là tình trạng bị kill do hết bộ nhớ (OOM) — hệ điều hành hoặc Electron runtime đã buộc phải tắt renderer process vì đã cạn kiệt heap space.
Monorepo lớn, quá nhiều extension chạy cùng lúc, hoặc project TypeScript với type graph khổng lồ là những nguyên nhân thường gặp. Cách khắc phục xoay quanh hai việc: cấp thêm bộ nhớ cho VS Code và giảm bớt những thứ đang ngốn bộ nhớ đó.
Bước 1 — Xác nhận đúng là lỗi OOM
Đừng vội vàng áp dụng các bản sửa lỗi. Trước tiên, hãy loại trừ khả năng một extension bị lỗi hoặc trạng thái workspace không hợp lệ mới là thủ phạm thực sự.
Mở Process Explorer của VS Code: Help → Open Process Explorer. Theo dõi cột Memory trong lúc tái hiện crash. Nếu renderer process tăng vượt 1–2 GB rồi biến mất, bạn đang gặp vấn đề OOM.
Trên Linux, kiểm tra chéo với log OOM killer của kernel:
dmesg | grep -i 'killed process'
# hoặc
journalctl -k | grep oom
Tìm dòng có đề cập Out of memory: Killed process gắn với binary code hoặc code-oss. Điều đó xác nhận hệ điều hành đã ra tay, không phải lỗi của VS Code.
Bước 2 — Tăng giới hạn heap cho renderer
V8 renderer của Electron khởi động với khoảng 700 MB–1,5 GB heap, tùy nền tảng. Ngưỡng đó dễ bị vượt qua trên các project lớn. Hãy nâng nó lên.
Mở file cấu hình startup flags của VS Code:
Ctrl+Shift+P → "Preferences: Configure Runtime Arguments"
Thêm dòng sau để nâng heap lên 4 GB:
{
"js-flags": "--max-old-space-size=4096"
}
Lưu lại, rồi khởi động lại VS Code hoàn toàn — đóng tất cả cửa sổ, không chỉ reload. Nguyên tắc chung: dùng 4096 cho máy 8 GB RAM, 8192 cho máy 16 GB.
Khởi động từ terminal? Truyền thẳng flag vào lệnh:
code --js-flags="--max-old-space-size=4096" .
Bước 3 — Tìm extension nào đang rò rỉ bộ nhớ
Các extension dùng chung một host process. Một extension viết kém có thể âm thầm ngốn vài gigabyte trong khi mọi thứ khác trông có vẻ vô can. Dùng extension bisect để tìm ra thủ phạm nhanh chóng:
Ctrl+Shift+P → "Start Extension Bisect"
VS Code sẽ vô hiệu hóa một nửa số extension, yêu cầu bạn tái hiện crash, rồi tự động thu hẹp phạm vi — không cần bật tắt thủ công.
Muốn theo cách đơn giản hơn? Khởi động với tất cả extension tắt:
code --disable-extensions .
Nếu crash biến mất, có extension đang là thủ phạm. Những cái tên thường bị nghi ngờ: Pylance trên project Python lớn, ESLint trên codebase JS khổng lồ, GitLens trên repo hàng chục nghìn commit, và các language server nói chung.
Bước 4 — Điều chỉnh bộ nhớ TypeScript cho project lớn
TypeScript language server luôn nằm trong top những thứ ngốn bộ nhớ nhiều nhất trong VS Code. Giới hạn mặc định của nó là 3 GB — ổn với project nhỏ, nhưng không đủ cho monorepo lớn với hơn 500 file nguồn.
Trong file .vscode/settings.json của workspace:
{
"typescript.tsserver.maxTsServerMemory": 8192,
"typescript.tsserver.experimental.enableProjectDiagnostics": false
}
Nhân tiện, hãy kiểm tra phần excludes trong tsconfig.json. Nếu thiếu, tsserver sẽ kiểm tra kiểu cho mọi thứ dưới gốc project — bao gồm cả hàng triệu dòng code bên trong node_modules:
{
"exclude": [
"node_modules",
"dist",
"build",
"**/*.spec.ts"
]
}
Chỉ thiếu một block exclude này thôi cũng có thể khiến mức dùng bộ nhớ của tsserver tăng gấp đôi hoặc gấp ba.
Bước 5 — Thu hẹp phạm vi workspace
Mỗi thư mục trong workspace đều có file watcher, search index và các tính năng ngôn ngữ đi kèm. Mở cả thư mục home hoặc một monorepo root khổng lồ, VS Code sẽ thực hiện một lượng công việc nền khổng lồ trước khi bạn gõ một ký tự nào.
- Dùng file
.code-workspacevà chỉ thêm vào những thư mục con bạn thực sự cần chỉnh sửa. - Loại trừ các thư mục generated lớn khỏi file watching và search:
{
"files.watcherExclude": {
"**/node_modules/**": true,
"**/dist/**": true,
"**/.git/objects/**": true
},
"files.exclude": {
"**/node_modules": true
},
"search.exclude": {
"**/node_modules": true,
"**/dist": true
}
}
Bước 6 — Tắt những tính năng không dùng đến
Một số tính năng tích hợp sẵn của VS Code tốn tài nguyên đáng kể hơn bạn nghĩ. Tắt những gì bạn không cần:
{
"editor.minimap.enabled": false,
"editor.codeLens": false,
"git.decorations.enabled": false,
"extensions.autoUpdate": false,
"telemetry.telemetryLevel": "off"
}
Code Lens là một thủ phạm âm thầm ở đây. Những con số đếm tham chiếu và nút chạy test hiển thị inline đó yêu cầu VS Code phải duy trì một bảng symbol sống trong bộ nhớ ở mọi thời điểm. Chỉ tắt tính năng này thôi đã có thể giải phóng 100–300 MB trên project TypeScript lớn.
Xác nhận đã khắc phục xong
Khởi động lại sạch trước — đừng chỉ reload cửa sổ:
- Đóng VS Code hoàn toàn (dùng
pkill codetrên Linux nếu cần). - Mở lại project.
- Chờ 2–3 phút để tất cả language server hoàn tất việc index.
- Mở Help → Open Process Explorer — renderer process nên ổn định dưới ngưỡng heap mới thay vì tiếp tục tăng.
Trên Linux bạn có thể theo dõi bộ nhớ trực tiếp trong terminal:
watch -n 2 'ps aux | grep code | grep -v grep | awk "{print \$6/1024 \" MB \", \$11}"'
Nếu mức bộ nhớ ổn định lại và crash OOM không tái diễn sau một giờ sử dụng bình thường, bạn đã xử lý xong.
Tóm tắt nhanh
- Crash dừng khi dùng
--disable-extensions→ chạy extension bisect để xác định extension có vấn đề. - Crash chỉ xảy ra trên project TypeScript lớn → tăng
typescript.tsserver.maxTsServerMemoryvà thêm excludes đúng cách trongtsconfig.json. - Crash trên mọi project → tăng
--max-old-space-sizetrongargv.json. - Crash chỉ trên Linux → kiểm tra
dmesg; kernel có thể đang kill VS Code trước khi giới hạn heap của nó kịp phát huy tác dụng. Nếu RAM ít (dưới 8 GB), thêm swap file có thể giúp ích.

