Generational Garbage Collection

V8 sử dụng cơ chế generational garbage collection giống như Java. Cơ chế này chia heap ra làm hai vùng:

  • Young space: là một vùng nhớ nhỏ và liên tục, được quét dọn thường xuyên. Khi young space đầy thì garbage collector sẽ tiến hành quét dọn các dead object (là các object không được tham chiếu bởi một object nào khác) hoặc chuyển các alive object sang old space để giải phóng vùng nhớ.
  • Old space: được chia ra nhiều space nhỏ hơn và được quét dọn định kỳ.

Theo một giả thuyết thì đa phần các object đều “chết trẻ” nên vì thế mà young space cần phải được quét dọn thường xuyên.

Types of Garbage Collection

Các loại garbage collection:

Scavange (Minor Garbage Collection)

Dùng để đánh dấu và quét dọn các dead object ở young space.

Tất cả các scavenge đều là những sự kiện Stop-the-World và khiến cho mọi luồng trong chương trình đều bị dừng lại khi chúng xảy ra. Thời gian dừng của scavenge là khoảng 2ms.

Full Collection (Major Garbage Collection)

Trong trường hợp young space và old space đều đầy thì V8 sẽ thực hiện một full collection ở trên cả heap. Full collection cũng là một sự kiện Stop-the-World.

Có hai loại full collection:

Non-Compacting Collection

Những vùng nhớ trống gây ra bởi việc quét dọn sẽ được thêm vào một danh sách được gọi là free list. Bất cứ khi nào cần cấp phát bộ nhớ thì free list sẽ được sử dụng.

Non-compacting collection có thể gây ra vấn đề phân mảnh bộ nhớ (fragmentation) và có thời gian dừng là khoảng 50ms.

Compacting Collection

V8 kiểm soát được mức độ phân mảnh và khi mức độ này vượt một ngưỡng nào đó, nó sẽ thực hiện di dời các object lại sát gần nhau (compacting collection) nhằm giảm phân mảnh bộ nhớ.

Cách này không thêm vùng nhớ trống vào free list và có thời gian dừng là khoảng 100ms.

list
from outgoing([[V8 - Garbage Collection]])
sort file.ctime asc

Resources