Bộ thu gom rác trong python

Trong Java, rác [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 Collector] có nhiệm vụ hủy các đối tượng đó để giải nén bộ nhớ.      

Người thu gom rác là gì ?

Chắc chắn các nhà phát triển đã không ít lần bị "rò rỉ bộ nhớ" hay "hết bộ nhớ", nguyên nhân là do việc quản lý bộ nhớ không tốt. Rất có thể trong Java đã cung cấp một bộ Garbage Collector sẽ tự động dọn dẹp bộ nhớ. Nhờ nó, các nhà phát triển 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 [dưới đây sẽ gọi tắt là GC] được định nghĩa là một quá trình tự động thực thi nhiệm vụ quản lý bộ nhớ. Mã 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 trong vùng nhớ heap, một phần bộ nhớ dành cho chương trình. Sau cùng, sẽ có một số đối tượng mà chương trình không cần sử dụng đến. Các đối tượng này sẽ được thu gom rác 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++, công việc quản lý bộ nhớ phải thực hiện "bằng tay"

Và nếu hiểu được cách thức mà GC hoạt động như thế nào, thì các thành viên của chương trình sẽ dễ dàng hơn trong quá trình phát triển phần mềm

Vì vậy, người thu gom rác hoạt động như thế nào?

Đầu tiên chúng ta hãy nhớ lại kiến ​​trúc JVM, trong mô-đun "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 cục bộ] và vùng nhớ Heap [dùng để lưu trữ . Bộ nhớ Heap là bộ nhớ cần thu gọn nhất vì các đối tượng không cần sử dụng nữa phải được xóa bỏ để giải phóng bộ nhớ

Có nhiều tiến trình 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 ưu tiên tối đa 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 đối tượng không được tham chiếu sẽ được đánh dấu sẵn sàng để được xếp vào thùng rác. Ở bước thứ hai, trình thu gom rác sẽ tiến hành xóa các đối tượng đó. Ở 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

Tại vùng nhớ Heap được chia làm 3 vùng nhớ nhỏ hơn, tạm gọi là Thế hệ trẻ, Thế hệ cũ và Thế hệ vĩnh viễn

Thế hệ trẻ. đượ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 trong 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 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ứ hai

thế hệ cũ. là nơi chứa những Object tòn đủ "lâu", còn "lâu" như thế nào thì lại thuộc về tùy thuật toán của từng bộ GC

thế hệ vĩnh viễn. không chứa đối tượng mà đây là nơi chứa các siêu dữ liệu của JVM như các lớp và phương thức của ứng dụng. Do that if the class and

phương pháp 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 Đối tượng, các thành viên lập trình phải chủ động xóa vùng nhớ của Đối tượng bằng câu lệnh delete, nếu như không thực hiện công 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 đối tượng mỗi lần ra khỏi hàm hoặc không còn sử dụng nữa. Tuy nhiên, đánh lại công việc đó là hiệu quả của chương trình sẽ được 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 đầu ra nhưng tốc độ thực thi của C++ lúc nào cũng nhanh hơn Java, đúng vậy không? . Đối với các kịch bản nơi các Garbage Collectors có ảnh hưởng tiêu cực đến hiệu suất, Java đưa ra nhiều lựa chọn để điều chỉnh các tiến trình của Garbage Collectors nhằm cải thiện hiệu quả của nó

pause

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ụ, hiệu quả sử dụng hay không phụ thuộc rất nhiều vào con người

Garbage Collection là kỹ thuật được sử dụng trong Java để phân bổ hoặc loại bỏ các đối tượng không thể truy cập và bộ nhớ không sử dụng được. Ngay từ cái tên, chúng ta có thể hiểu rằng Garbage Collection liên quan đến việc theo dõi và xóa rác khỏi vùng nhớ

Tuy nhiên, trên thực tế, Garbage Collection theo dõi từng đối tượng có sẵn trong JVM không gian heap và loại bỏ những đối tượng không sử dụng

Chúng ta biết rằng tất cả các đối tượng mà chúng ta tạo động đều được cấp phát trong bộ nhớ heap của ứng dụng. Thông thường, lập trình viên có nhiệm vụ vừa tạo vừa xóa các đối tượng trong chương trình, nhưng lập trình viên thường bỏ qua việc xóa các đối tượng. Điều này tạo ra vấn đề OutOfMemoryErrors không đủ bộ nhớ vì không xóa các đối tượng không mong muốn

Trong Java, lập trình viên không cần phải lo lắng về vấn đề giải phóng bộ nhớ của các đối tượng không sử dụng hoặc không mong muốn này, vì hệ thống Garbage Collection luôn chạy ở chế độ nền và mục đích chính của nó là giải phóng

Về cơ bản, Garbage Collection trong Java là quá trình theo dõi tất cả các đối tượng vẫn còn được sử dụng và đánh dấu phần còn lại của chúng là rác. Quá trình Gom rác trong Java được coi là một lược đồ quản lý bộ nhớ tự động do người lập trình không xác định được vị trí của các đối tượng một cách rõ ràng. Tập hợp rác trong Java chạy trên các luồng có mức độ ưu tiên thấp hơn

Việc phát triển khai báo Garbage Collection có trong JVM [Máy ảo Java]. Mỗi JVM đều có thể thực hiện Garbage Collection. But only have a request; . Oracle's HotSpot là một trong những JVM phổ biến nhất cung cấp một tập hợp các tùy chọn Garbage Collection mạnh mẽ và hoàn thiện

Đối tượng vòng đời trong Java

Các đối tượng vòng đời trong Java có thể được chia thành 3 giai đoạn

1. Tạo đối tượng

Nói chung, để tạo một đối tượng, chúng tôi sử dụng một từ khóa mới. Ví dụ

MyClass obj = new MyClass[] ;

Chúng ta đã tạo các đối tượng obj của lớp MyClass. Khi chúng ta tạo đối tượng, một lượng bộ nhớ cụ thể sẽ được cấp phát để lưu trữ đối tượng đó. Bộ nhớ được cấp phát cho các đối tượng có thể thay đổi tùy chọn theo kiến ​​trúc và JVM

2. Đối tượng sử dụng

Trong giai đoạn này, các đối tượng được sử dụng bởi các đối tượng khác của ứng dụng trong Java. Trong quá trình sử dụng, các đối tượng nằm trong bộ nhớ và có thể tham chiếu hoặc chứa tham chiếu đến các đối tượng khác

3. Sự kiện hủy đối tượng

Hệ thống Garbage Collection giám sát các đối tượng và duy trì số lượng tham chiếu đến từng đối tượng. Không cần các đối tượng như vậy trong chương trình của chúng ta nếu không có tham chiếu đến đối tượng này, vì vậy bộ phận bổ sung bộ nhớ không sử dụng được điều này là điều hoàn hảo

Đối tượng không thể truy cập trong Java

Khi một đối tượng không chứa bất kỳ tham chiếu “có thể truy cập” đối tượng nào với nó, thì chúng ta gọi nó là đối tượng không thể truy cập. Các đối tượng này cũng có thể được gọi là đối tượng không tham chiếu

Ví dụ về các đối tượng không thể truy cập.  

Double d = new Double[5.6];

// the new Double object is reachable via the reference in 'd'

d = null;

// the Integer object is no longer reachable. Now d is an unreachable object.

Tính đủ điều kiện để Garbage Collection trong Java

Một đối tượng có đủ điều kiện để Garbage Collection trong Java nếu và chỉ khi nó không thể truy cập được. In the program on, after thebáo d is null;

Tính đủ điều kiện của đối tượng

Mặc dù Java có tính năng Garbage Collection tự động, nhưng một đối tượng phải được thực hiện theo cách thủ công. Có nhiều cách khác nhau để biết đối tượng dữ liệu có đủ điều kiện cho Bộ sưu tập rác trong Java hay không

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

  • Tham chiếu biến tham chiếu vô hiệu hóa
  • Gán lại tham chiếu biến
  • Island cô lập
  • Tạo các đối tượng bên trong một lớp

Cách yêu cầu JVM chạy Garbage Collection

Ngay cả khi chúng tôi làm cho một đối tượng đủ điều kiện để Garbage Collection trong Java, nó có thể đủ điều kiện hoặc không đủ điều kiện để Máy ảo Java [JVM] bị hủy bỏ. Vì vậy, có một số cách để yêu cầu JVM hủy đối tượng này và thực hiện Garbage Collection

Có hai cách để yêu cầu JVM để thu thập Rác trong Java là

  • Use method System. gc[]
  • Use method Runtime. getRuntime[]. gc[]

Thuật toán thu gom rác trong Java

Thuật toán Garbage Collection trong Java giúp loại bỏ các đối tượng không được tham chiếu hoặc không thể truy cập. Các thuật toán này luôn chạy ở chế độ nền. Có một số loại bộ thuật toán Garbage Collection khác nhau trong Java chạy ở chế độ nền. Và trong số đó, một trong những thuật toán là thuật toán Đánh dấu và Quét

Các thuật toán đánh dấu và quét

Thuật toán Đánh dấu và Quét là một thuật toán cơ bản và cấm đầu để Thu gom rác trong Java. Thuật toán này về cơ bản thực hiện hai chức năng chính. đánh dấu và quét. Thứ nhất, nó sẽ theo dõi và phát hiện các đối tượng không thể truy cập và thứ hai, nó sẽ giải nén các đối tượng này khỏi vùng nhớ heap để lập trình viên có thể sử dụng lại

1. Đánh dấu pha - Đánh dấu các đối tượng sống

Đây là giai đoạn đầu tiên của thuật toán, trong đó có việc phát hiện tất cả các đối tượng vẫn còn sống. Đây là giai đoạn mà bộ Garbage Collection xác định phần nào của bộ nhớ đang được sử dụng và phần nào không được sử dụng

Trong giai đoạn này khi điều kiện được thực hiện, kiểm tra bit của nó được đặt thành 0 hoặc sai. Chúng tôi đặt bit được đánh dấu thành 1 hoặc true cho tất cả các đối tượng có thể truy cập

Ở đây chúng ta có thể coi mỗi đối tượng là một nút và sau đó chúng ta truy cập tất cả các đối tượng hoặc nút có thể truy cập được từ đối tượng / nút này và nó lặp lại cho đến khi chúng ta đã truy cập

  • Gốc là một biến tham chiếu đến một đối tượng và có thể truy cập trực tiếp bởi một bộ biến cục bộ. Chúng ta sẽ cho rằng chúng ta chỉ có một bản gốc
  • Chúng ta có thể sử dụng markBit [obj] để truy cập bit đánh dấu cho một đối tượng

Pha đánh giá thuật toán

Mark[root]

If markedBit[root] = false then

    markedBit[root] = true

    For each v referenced by a root

         Mark[v]

>>> Đọc thêm. Constructor Chaining trong Java - Tất tần tật về Constructor Chaining

2. Giai đoạn quét - Loại bỏ các vật chết

Thuật toán pha quét “xóa” tất cả các đối tượng không thể truy cập hoặc không thể truy cập được, nó giải nén vùng nhớ được lưu trữ cho tất cả các đối tượng không thể truy cập. Mỗi mục có giá trị kiểm tra được đặt thành sai sẽ bị xóa khỏi bộ nhớ ngăn xếp, đối với mọi đối tượng có thể truy cập khác, chúng tôi đặt giá trị của bit bị đóng thành sai

Hiện tại, kiểm tra một chút để tất cả các đối tượng có thể truy cập được đặt thành false

Thu thập số liệu thuật toán

Sweep[]

For each object p in a heap

    If markedBit[p] = true then

       markedBit[p] = false

    else

       heap.release[p]

Thuật toán 'Mark and Sweep' còn được gọi là bộ thu gom rác theo dõi vì thuật toán này được sử dụng để theo dõi các đối tượng. Ví dụ

  • Các bit bị đánh dấu đã được đặt thành sai
  • Các đối tượng có thể tiếp cận được đặt thành true
  • Các đối tượng không thể tiếp cận bị xóa khỏi ngăn xếp

Ưu điểm của thuật toán đánh dấu và quét

  • Đó là quá trình hoàn thành một tuần
  • Không có chi phí bổ sung nào xảy ra trong quá trình thực thi một thuật toán

Nhược điểm của thuật toán đánh dấu và quét

  • Trong khi thuật toán Garbage Collection Java chạy, việc thực thi chương trình bình thường sẽ dừng lại
  • Nó chạy khác nhau nhiều lần trên một chương trình

>>> Đọc thêm. Hướng dẫn JDBC trong Java - Kiến trúc, thành phần và cách làm việc

Ưu điểm và nhược điểm của Garbage Collection trong Java

Ưu điểm của công việc Thu gom rác

  • Không cần phải xử lý việc cấp phát / bổ sung bộ nhớ theo cách thủ công vì JVM tự động thực hiện Garbage Collection cho không gian chưa được sử dụng trong Java
  • Không có chi phí xử lý Con trỏ nguy hiểm
  • Garbage Collection sẽ xử lý tốt phần quản lý Rò rỉ Bộ nhớ Tự động [Automatic Memory Leak management]

Nhược điểm của công việc Thu gom rác

  • Yêu cầu nhiều hơn về sức mạnh của CPU bên cạnh ứng dụng gốc, vì JVM phải theo dõi quá trình tạo / xóa tham chiếu đối tượng. Điều này có thể ảnh hưởng đến hiệu suất của các yêu cầu yêu cầu một bộ nhớ lớn
  • Lập trình viên không có bất kỳ quyền kiểm soát nào đối với việc lập lịch thời gian CPU dành riêng cho việc giải nén các đối tượng không thể truy cập
  • Sử dụng một số khai báo Bộ sưu tập rác, ứng dụng có thể dừng không thể đoán trước
  • Bộ nhớ quản lý tự động không hiệu quả nhiều khi phân bổ / phân bổ bộ nhớ thủ công giải thích hợp nhất

Kết luận.  

Garbage Collection trong Java rất hữu ích để ngăn chặn rò rỉ bộ nhớ và sử dụng không gian. Trong hướng dẫn Java này, chúng tôi đã tìm hiểu về Garbage Collection trong Java và cách hoạt động của nó. Chúng ta đã thảo luận về các điều khoản quan trọng liên quan đến Java Garbage Collection và các thuật toán Garbage Collection. Có bốn loại Trình Java Garbage Collection mà chúng ta đã tìm hiểu trong bài viết này. Chúng tôi đã thảo luận về thuật toán Java Mark và Sweep cùng với những điểm ưu và nhược điểm của nó. Chúng ta cũng đã xem xét những ưu điểm và nhược điểm của Bộ sưu tập rác trong Java.  

Hy vọng bạn đã biết và Bộ sưu tập rác và có thể áp dụng nó trong chương trình của mình. Tìm hiểu thêm về Java và các ngôn ngữ lập trình khác thông qua các khóa học lập trình tại Viện công nghệ thông tin T3H

Chủ Đề