JS Generational Garbage Collection

Tran Van Ngoc|

Tài liệu này là một ghi chép Layer 2 mô tả chi tiết cách JavaScript (V8 Engine) triển khai cơ chế dọn rác phân thế hệ (Generational Garbage Collection), dựa trên nguyên lý khoa học máy tính cốt lõi của Garbage_Collection_Fundamentals.

TL;DR

Garbage Collector (GC) trong JavaScript Engine (như V8 Orinoco) áp dụng Giả thuyết thế hệ (Generational Hypothesis): phần lớn các đối tượng đều chết trẻ. Vùng nhớ Heap được chia thành New Space (chứa đối tượng mới, dùng thuật toán Scavenger) và Old Space (chứa đối tượng sống lâu, dùng thuật toán Mark-Sweep-Compact). Cơ chế phân chia này giúp thu hồi các vùng nhớ không còn truy cập được để chống rò rỉ bộ nhớ trên các runtime hiện đại như Node.js và Bun.


Core Concept

1. Phân vùng New Space

  • Kích thước: Nhỏ (1MB đến 64MB), lưu giữ các đối tượng vừa tạo.
  • Thuật toán: Dùng Scavenger (Copying Collector) chia đôi vùng nhớ thành From-Space và To-Space.
  • Hoạt động: Khi chạy Minor GC, V8 quét các đối tượng sống ở From-Space và chép sang To-Space. Sau 2 chu kỳ sống sót, đối tượng được thăng cấp (promote) lên Old Space. Quá trình di chuyển này giải quyết triệt để rủi ro phân mảnh bộ nhớ.

2. Phân vùng Old Space

  • Kích thước: Lớn, chứa đối tượng sống qua nhiều chu kỳ Minor GC hoặc đối tượng có kích thước siêu lớn.
  • Thuật toán: Dùng Mark-Sweep-Compact (Major GC).
    • Marking: Quét đồ thị đối tượng từ GC Roots (Global Variables, Stack Frames) để gắn nhãn đối tượng còn khả năng truy cập (reachable).
    • Sweeping: Giải phóng các ô nhớ chứa đối tượng không thể truy cập (unreachable).
    • Compacting: Dồn dập các vùng nhớ còn sống lại gần nhau để tối ưu không gian trống liên tục.

Practical Implementation

Kỹ thuật Tối ưu Hóa Orinoco trong V8

  • Incremental Marking: Chia nhỏ quá trình đánh dấu thành các bước ngắn xen kẽ với luồng thực thi JavaScript chính, tránh đóng băng giao diện người dùng hoặc nghẽn server.
  • Concurrent & Parallel GC: Chuyển các tác vụ quét và nén bộ nhớ sang các Worker Threads chạy ngầm song song với main thread.