🗑️Garbage collection

Quản lý bộ nhớ Heap trong JVM

Garbage Collection là gì?

Trong máy ảo Java (JVM), quá trình thu gom rác (garbage collection) là quá trình tự động xác định và loại bỏ các đối tượng không được tham chiếu (unreferenced objects) từ bộ nhớ Heap. Quá trình này giải phóng không gian không còn sử dụng và cấp phát lại cho các đối tượng mới.

Trái với ngôn ngữ như C, trong Java không cần thực hiện việc giải phóng bộ nhớ một cách thủ công. JVM tự động quản lý việc thu gom rác và giải phóng bộ nhớ không còn sử dụng. Khi một đối tượng không còn được tham chiếu từ bất kỳ vị trí nào trong chương trình, nó trở thành đối tượng không sử dụng và sẽ được thu gom rác trong quá trình tiếp theo của thu gom rác. Quá trình này giúp đảm bảo rằng bộ nhớ được sử dụng hiệu quả và giảm nguy cơ xảy ra lỗi tràn bộ nhớ (memory leaks).

Garbage collector là chương trình chạy nền, nó theo dõi toàn bộ các Object trong bộ nhớ (Heap) và tìm ra những Object nào không được dùng nữa (không có Object nảo reference đến nó). Toàn bộ những Object không có reference sẽ bị xóa.

Cơ chế hoạt động của Garbage Collection

What are Garbage Collection Roots in Java?

Garbage Collection hoạt động dựa trên khái niệm của Garbage Collection Roots (GC Roots) để xác định 1 Object còn sống hay đã chết.

Một số ví dụ về GC Roots:

  • Các class được load bởi System class loader (không phải custom class)

  • Live threads

  • Local variables and parameters of the currently executing methods

  • Local variables and parameters of JNI methods

  • Global JNI reference

  • Các Objects được sử dụng làm monitor cho synchronization

  • Các Object được JVM giữ lại từ GC cho mục đích của nó

GC duyệt qua toàn bộ biểu đồ Object trong bộ nhớ, bắt đầu từ GC Roots và theo references từ roots đến các Object khác.

Quá trình thu gom rác cơ bản thông qua 3 bước sau:

  1. Marking: Là bước đánh dấu những Object còn sử dụng và những Object không còn sử dụng.

  1. Normal deleting: Trình Garbage Collector sẽ xóa cá Object không còn sử dụng.

  1. Deletion with Compacting: Sau khi những Object không còn được sử dụng bị xóa, những Object còn được sử dụng sẽ được "gom" lại gần nhau. Điều đó làm tăng hiệu xuất sử dụng bộ nhớ trống để cấp phát cho những Object mới.

Để thực hiện việc tự động giải phóng các Object khi chúng không được sử dụng thì bộ nhớ Heap được chia thành các phần nhỏ như hình dưới đây.

Young Generation Là nơi chứa toàn bộ Object mới được khởi tạo. Khi vùng nhớ Young generation đầy thì garbage collectior là Minor GC hoạt động. Vùng Young generation lại được chia thành 3 vùng nhỏ hơn là Eden và 2 vùng Survivor là S0, S1.

Ban đầu mọi Object mới tạo được chứa ở vùng Eden, khi Eden đầy thì Minor GC chuyển chúng sang vùng S0, S1.

Minor GC liên tục theo dõi các Object ở S0, S1. Sau "nhiều" chu kỳ quét mà Object vẫn còn được sử dùng thì chúng mới được chuyển sang vùng nhớ Old generation. Old generation được quản lý bởi garbage collectior khác là Major GC.

Hình trên mô phòng 2 Object được chuyển từ vùng Young generation sang Old generation sau 9 chu kỳ quét của Minor GC. Những ô màu vàng tượng chưng cho những Object đã không còn được sử dụng (unreferenced). Chúng sẽ được xóa khi Minor GC hay Majo GC clear vùng nhớ nó quản lý.

Mô hình vùng nhớ Heap có vùng Perm (Permanent Generation), Perm không phải một phần của Heap. Perm không chứa Object, nó chứa metadata của JVM như các thư viện Java SE, mô tả các class và các method của ứng dụng.

Last updated