HomeOur Team
Garbage collector – Trình thu gom rác trong java
Articles
Garbage collector – Trình thu gom rác trong java
nam.pham
nam.pham
April 06, 2021
3 min

Trong C / C ++, lập trình viên chịu trách nhiệm về cả việc tạo và hủy các đối tượng. Thông thường lập trình viên bỏ qua việc phá hủy các đối tượng vô dụng. Do sơ suất này, tại một số điểm nhất định, để tạo các đối tượng mới, có thể không có đủ bộ nhớ và toàn bộ chương trình sẽ kết thúc bất thường gây ra lỗi OutOfMemoryErrors .

  • Nhưng trong Java, lập trình viên không cần quan tâm đến tất cả những đối tượng không còn được sử dụng nữa. Trình thu gom rác sẽ destroy chúng
  • Trình thu gom rác là ví dụ tốt nhất về Daemon Thread vì nó luôn chạy ở chế độ background.
  • Mục tiêu chính của Garbage Collector là giải phóng bộ nhớ heap bằng cách phá hủy các đối tượng không thể truy cập .

Các điều khoản quan trọng:

1. Đối tượng không thể truy cập : Một đối tượng được cho là không thể truy cập được, nó không chứa bất kỳ tham chiếu nào đến nó.

1

2.Điều kiện để garbage collection : Một đối tượng được cho là điều kiện đủ để GC (garbage collection) vì nó không thể truy cập được. Trong hình trên, sau i = null; đối tượng số nguyên 4 trong vùng heap đủ điều kiện để thu gom rác.

Các cách để làm cho một đối tượng đủ điều kiện cho GC

  • Mặc dù lập trình viên không chịu trách nhiệm destroy các đối tượng không dùng nhưng tôi rất khuyến khích làm cho một đối tượng không thể truy cập được (do đó điều kiện đủ của GC) nếu nó không còn được sử dụng.

  • Nói chung có bốn cách khác nhau để làm cho một đối tượng đủ điều kiện để thu gom rác.

    - Vô hiệu hóa biến tham chiếu

    - Chỉ định lại biến tham chiếu

    - Đối tượng được tạo bên trong phương thức

    - Đảo cô lập

  • Sau khi chúng ta làm cho đối tượng đủ điều kiện để thu gom rác, nó có thể không bị destroy ngay lập tức. Bất cứ khi nào JVM chạy chương trình Garbage Collector, thì chỉ có đối tượng bị hủy. Nhưng khi JVM chạy Garbage Collector, chúng ta không thể mong đợi.

  • Chúng ta cũng có thể yêu cầu JVM chạy garbage collection bằng 2 cách:

    1. Sử dụng phương thức System.gc () : Lớp hệ thống chứa static method gc () để yêu cầu JVM chạy Garbage Collector.
    2. Sử dụng Runtime.getRuntime().gc() : Runtime class cho phép garbage collection trong khi ứng dụng đang chạy. 

Example :

2

Output:

Garbage collector called

Object garbage collected : Test@46d08f12

Garbage collector called

Object garbage collected : Test@481779b8

  • Note :

    • Không có gì đảm bảo rằng một trong hai phương pháp trên chắc chắn sẽ chạy Garbage Collector
    • Lệnh gọi System.gc()Runtime.getRuntime().Gc() tương đương nhau

Finalization

  • Ngay trước khi destroy 1 object, Garbage Collector gọi phương thức finalize () trên đối tượng để thực hiện các hoạt động dọn dẹp. Khi phương thức finalize () hoàn tất, Garbage Collector sẽ destroy object đó.

  • Phương thức finalize()trong Object class như sau.

    protected void finalize() throws Throwable

    Dựa vào nguyên lý trên, chúng ta có thể ghi đè phương thức finalize() để thực hiện các hoạt động dọn dẹp của chúng tôi như đóng kết nối từ cơ sở dữ liệu.

    Ghi chú :

    • Phương thức finalize () được gọi bởi Garbage Collector không phải JVM . Mặc dù Garbage Collector là một trong những mô-đun của JVM
    • Phương thức finalize () của object class có triển khai trống, do đó, bạn nên ghi đè phương thức finalize () để xử lý tài nguyên hệ thống hoặc thực hiện các thao tác dọn dẹp khác.
    • Phương thức finalize () không bao giờ được gọi nhiều hơn một lần cho bất kỳ đối tượng nhất định nào.
    • Nếu một ngoại lệ không có giá trị được ném bởi phương thức finalize () , thì ngoại lệ đó sẽ bị bỏ qua và việc hoàn thiện đối tượng đó sẽ kết thúc.

Hãy lấy một ví dụ thực tế, nơi chúng tôi sử dụng khái niệm garbage collection

Giả sử bạn đến thực tập tại TDA và họ được yêu cầu viết một chương trình để đếm số lượng Nhân viên làm việc trong công ty (không bao gồm thực tập sinh). Để thực hiện chương trình này, bạn phải sử dụng khái niệm garbage collection.\ Đây là nhiệm vụ thực tế mà bạn được giao tại công ty: Nam viết chương trình tạo một lớp có tên là Employee có các thành viên dữ liệu sau.

  • Lưu trữ id duy nhất được phân bổ cho mọi nhân viên.
  • Tên nhân viên.
  • Lương của một nhân viên.

Ngoài ra, hãy cung cấp các chức năng sau

  • Constructor có param name và age. ID phải được khởi tạo trong constructor này.
  • Phương thức show () để hiển thị ID, name và age.
  • Phương thức showNextId () để hiển thị ID của nhân viên tiếp theo.

Bây giờ bất kỳ người mới bắt đầu nào, những người không có kiến ​​thức về bộ thu gom rác sẽ viết mã như thế này:

3

output :

4

\=> Khi bạn thêm trình dọn dẹp bộ nhớ vào thì kết quả sẽ như nào nhé

5

6


Tags

202104javagarbage
nam.pham

nam.pham

Developer

Related Posts

Reflection breaks encapsulation trong lập trình hướng đối tượng
Reflection breaks encapsulation trong lập trình hướng đối tượng
March 24, 2021
1 min
Bài 3: Làm quen với những câu lệnh cơ bản nhất trong Selenium WebDriver
Testing
Bài 3: Làm quen với những câu lệnh cơ bản nhất trong Selenium WebDriver
May 09, 2021
1 min
Solutions
# Java Unit Testing - Phần 2 - Giới thiệu JUnit
March 24, 2021
4 min
© 2021, All Rights Reserved.

Quick Links

HomeOur Team

Social Media