Trong Java, Garbage có nghĩa là một đối tượng không được tham chiếu đến nữa và bộ thu gom rác (Garbage Collectors) có nhiệm vụ hủy các đối tượng đó để giải phóng bộ nhớ. Hãy cùng Hybrid Technologies tìm hiểu về khái niệm, cách hoạt động của Garbage Collectors trong Java dưới bài viết này nhé!

Garbage Collectors là gì ?

Chắc hẳn các developer đã không ít lần gặp tình trạng “memory leak” hay là “out of memory”, nguyên nhân chính dẫn đến là do việc quản lý bộ nhớ không tốt. Rất may trong Java đã cung cấp một bộ Garbage Collectors sẽ tự động dọn dẹp bộ nhớ và nhờ đó, các developer sẽ không cần quan tâm đến việc quản lý và phân phối lại bộ nhớ của chương trình như C/C++. 

Garbage Collectors (gọi tắt là GC) được định nghĩa như là một quá trình tự động thực thi nhiệm vụ quản lý bộ nhớ. Code Java được dịch sang bytecode rồi chạy trên máy ảo Java hay viết tắt là JVM. Trong quá trình chạy chương trình, các đối tượng được tạo ở vùng nhớ heap, một phần bộ nhớ dành cho chương trình. Sau cùng, sẽ có một vài đối tượng mà chương trình không cần dùng đến. Các đối tượng này sẽ được GC truy tìm và xóa bỏ để thu hồi lại dung lượng bộ nhớ.

Khác biệt rất nhiều khi chúng ta làm việc với C/C++, việc quản lý bộ nhớ phải thực hiện “by hand”. Và nếu hiểu được cách thức mà GC hoạt động như thế nào, các lập trình viên sẽ dễ dàng hơn trong việc phát triển phần mềm.

Vậy Garbage Collectors hoạt động như thế nào trong Java?

Đầu tiên chúng ta hãy nhớ lại kiến trúc JVM, trong module “Run time area” chúng ta có 2 vùng nhớ là vùng nhớ Stack (dùng để lưu trữ tham số và các biến local) và vùng nhớ Heap (dùng để lưu trữ các đối tượng sau khi khởi tạo bằng từ khóa new và các biến static).  

Bộ nhớ Heap là bộ nhớ cần dọn dẹp nhất vì các Object không cần dùng nữa phải được xóa bỏ để giải phóng bộ nhớ.Có nhiều tiến trình thu gom rác khác nhau nhưng phổ biến nhất Oracle HotSpot. Mặc dù HotSpot có nhiều tiến trình thu gom rác được tối ưu cho từng trường hợp khác nhau nhưng tất cả đều theo một phương thức cơ bản nhất. Đầu tiên, các Object không được tham chiếu sẽ được đánh dấu sẵn sàng để được dọn rác.
 
Ở bước thứ hai, trình thu gom rác sẽ tiến hành xóa các Object đó. Ở bước thứ ba, vùng nhớ của các Object còn lại sẽ được nén lại và nằm liền kề nhau trong bộ nhớ Heap. Quá trình này sẽ giúp việc cấp phát bộ nhớ cho Object mới dễ dàng hơn.
 
Ở vùng nhớ Heap được chia làm 3 vùng nhớ nhỏ hơn, tạm gọi là Young generation, Old generation và Permanent generation.
  • Young generation: được chia thành nhiều vùng nhớ nhỏ hơn là Eden (khởi tạo) và Survivor (sống sót). Các Object vừa được khởi tạo sẽ nằm ở vùng Eden, sau chu kì quét đầu tiên nếu Object đó còn tồn tại thì sẽ được chuyển sang vùng Survivor. Tại đây cái Object được GC theo dõi liên tục, nếu  như qua nhiều chu kỳ quét mà Object vẫn còn được sử dụng thì lúc này Object sẽ được chuyển sang vùng nhớ thứ thứ hai.
  • Old generation: là nơi chứa những Object tồn tại đủ “lâu”, còn “lâu” như thế nào thì lại tùy thuộc vào thuật toán của từng bộ GC.
  • Permanent generation: không chứa Object mà đây là nơi để chứa các metadata của JVM như các class và method của ứng dụng. Do đó nếu các class và method không còn được sử dụng nữa thì GC sẽ coi chúng là “rác” và dọn dẹp nó.

Ưu và nhược điểm

Trong C++, sau khi khởi tạo một Object, các lập trình viên phải chủ động xóa vùng nhớ của Object bằng câu lệnh delete, nếu như không thực hiện việc này thì sẽ dẫn đến rò rỉ vùng nhớ. Với Garbage Collectors, lập trình viên Java sẽ không cần quan tâm đến việc xóa các Object mỗi lần ra khỏi hàm hay không còn dùng nữa. 

Tuy nhiên, đánh đổi lại việc đó là hiệu suất của chương trình sẽ bị giảm đáng kể. Có bao giờ bạn hỏi một chương trình cùng thực hiện một chức năng, cùng một output nhưng tốc độ thực thi của C++ lúc nào cũng nhanh hơn Java? Trong khi việc tranh luận về quản lý bộ nhớ tiếp tục nổ ra, Garbage Collectors giờ đây là thành phần tiêu chuẩn của nhiều ngôn ngữ lập trình phổ biến. Đối với các kịch bản nơi các Garbage Collectors ảnh hưởng tiêu cực đến hiệu suất, Java đề xuất nhiều lựa chọn để điều chỉnh cho các tiến trình GC để cải thiện hiệu quả của nó.
 
Việc hiểu rõ ưu và nhược điểm của từng ngôn ngữ sẽ giúp bạn lựa chọn ngôn ngữ thích hợp để phát triển ứng dụng, vì suy cho cùng ngôn ngữ cũng chỉ là công cụ, sử dụng hiệu quả hay không phụ thuộc rất nhiều vào người phát triển ứng dụng. Hy vọng bài viết sẽ hữu ích với bạn!
 
Nguồn: Sưu Tầm.