Thuật toán thu gom rác python

Như hầu hết các bạn có thể biết, Python là một ngôn ngữ lập trình động với các triển khai khác nhau. Việc triển khai CPython quản lý bộ nhớ bằng cách triển khai Bộ đếm tham chiếu và Trình thu gom rác thế hệ. Điều quan trọng cần đề cập là các triển khai Python khác như PyPy, IronPython,… có thể sử dụng các chiến lược khác nhau

Bạn có biết những chiến lược đó đã được sử dụng để cấp phát bộ nhớ không?

Từ phiên bản 2, Python bắt đầu sử dụng hai chiến lược khác nhau để đếm tham chiếu cấp phát bộ nhớ và tạo bộ sưu tập rác. Trước đó, chiến lược duy nhất được sử dụng là đếm tham chiếu

Đếm tham khảo

Trong kỹ thuật này, nó giữ việc đếm các tham chiếu đến một đối tượng. Khi một tham chiếu mới được tạo, bộ đếm sẽ tăng lên một, khi chúng ta xóa một tham chiếu, bộ đếm sẽ giảm đi một

Tất nhiên, mọi đối tượng được tạo trong Python cần phải cập nhật bộ đếm liên tục. Trong trường hợp bộ đếm tham chiếu bằng 0, đối tượng đủ điều kiện được thu gom rác

Hãy tạo ba tham chiếu đến đối tượng “đối tượng của tôi” và kiểm tra số lượng tham chiếu của đối tượng

>>> import sys
>>> a = "my object"
>>> b = a
>>> c = a
>>> id[a]
4377801904
>>> id[b]
4377801904
>>> id[c]
4377801904
>>> sys.getrefcount[a]
4

id[…] hiển thị số nguyên duy nhất đại diện cho đối tượng của tham chiếu. Và hệ thống. getrefcount[a] trả về số tham chiếu của đối tượng [“đối tượng của tôi”]. Số đếm được trả về thường cao hơn một số so với chúng tôi mong đợi, bởi vì nó bao gồm tham chiếu tạm thời làm đối số cho getrefcount[]

Dưới đây là một đại diện của đoạn mã trên

Ba tham chiếu được liên kết với đối tượng

Nếu chúng tôi xóa một tham chiếu, bộ đếm sẽ giảm đi một

>>> del[c]
>>> sys.getrefcount[a]
3

Đã xóa một tham chiếu

Nếu chúng ta xóa tất cả các tham chiếu, bộ đếm sẽ bằng 0 và đối tượng sẽ đủ điều kiện để trình thu gom rác xóa nó

Không còn tài liệu tham khảo tồn tại

Một điều gây tò mò là các giá trị chung có số lượng tham chiếu nhiều hơn tôi mong đợi. Điều này là do những người khác tham khảo chúng khi khởi động trình thông dịch. Ví dụ: tôi đã tạo một tham chiếu đến 1 và tìm ra vài trăm tham chiếu đến đối tượng. Đề xuất của tôi là tạo một số hoặc chuỗi đặc biệt, điều này sẽ giúp bạn hiểu cách sử dụng phương thức getrefcount[…]

>>> h = 1
>>> sys.getrefcount[h]
601
>>> h = 3.14151692
>>> sys.getrefcount[h]
2

Ngoài ra, nếu bạn tạo hai đối tượng có cùng giá trị, chúng sẽ không nhận được cùng một ID vì chúng không phải là cùng một đối tượng. Bạn có thể kiểm tra ID duy nhất của chúng và số lượng tham chiếu của các đối tượng

>>> a = 1234
>>> b = 1234
>>> id[a]
4484904240
>>> id[b]
4484904080
>>> sys.getrefcount[b]
2
>>> sys.getrefcount[a]
2

Lợi ích của việc sử dụng số lượng tham chiếu là đủ điều kiện để xóa một đối tượng khỏi bộ nhớ ngay khi nó không có tham chiếu nào.

Nó cũng có một số nhược điểm. Nó có thể thực sự không hiệu quả, đặc biệt là trong triển khai đa luồng ngây thơ. Và nó không thể xử lý các đối tượng có tham chiếu vòng tròn. Đối với những trường hợp đó, Python áp dụng thuật toán thứ hai gọi là thu gom rác thế hệ

Thu gom rác thế hệ

Thuật toán này chia các đối tượng thành các thế hệ khác nhau dựa trên phân bổ thời gian. Và nó có thể áp dụng các chính sách khác nhau cho từng thế hệ

Python tạo ba thế hệ khi khởi động ứng dụng. Các đối tượng mới chuyển sang thế hệ đầu tiên, nếu chúng tồn tại trong ký ức, thuật toán sẽ chuyển chúng sang thế hệ thứ hai. Điều tương tự sẽ xảy ra trong thế hệ này, các đối tượng được thu thập hoặc chuyển sang thế hệ thứ ba. Trong thế hệ đó, các đối tượng sẽ ở lại cho đến khi chương trình kết thúc

Mỗi thế hệ có một ngưỡng, khi danh sách các đối tượng vượt quá ngưỡng, Python sẽ chạy quy trình thu gom rác

Thu gom rác thế hệ trong ba bước

Một trong những nhược điểm của kỹ thuật này là thường không loại bỏ được rác lâu năm, mặc dù chúng hoạt động tốt với các đối tượng mới nhất.

Có thể tắt trình thu gom rác trong Python không?

Có thể tắt thuật toán thứ hai, trình thu gom rác thế hệ, nhưng không thể tắt thuật toán đếm tham chiếu

Dưới đây là một số phương pháp từ mô-đun gc có thể giúp bạn

>>> import gc
>>> gc.isenabled[]
True
>>> gc.disable[]
>>> gc.isenabled[]
False

Việc tắt trình thu gom rác thế hệ Python sẽ không hiển thị cho bạn mức sử dụng bộ nhớ ít hơn trong ứng dụng của bạn, vì Python thường không giải phóng bộ nhớ trở lại hệ điều hành cơ bản

Trong trường hợp bạn muốn đi sâu vào việc vô hiệu hóa trình thu gom rác, tôi khuyên bạn nên xem bài đăng của nhóm Kỹ thuật Instagram. Họ đã thực hiện một số thử nghiệm với trình thu gom rác và phát hiện ra một số tác dụng phụ với phương thức disable[] đối với

Phần kết luận

Python sử dụng hai chiến lược để quản lý bộ nhớ, đếm tham chiếu và trình thu gom rác thế hệ cho các phụ thuộc theo chu kỳ. Cái thứ hai là một trình thu gom rác tùy chọn có thể tắt. Có thể xem số lượng tham chiếu của các đối tượng, thay đổi ngưỡng của các thế hệ và một số thứ khác. Tôi khuyên bạn nên xem mô-đun gc, mô-đun sys hoặc tài liệu thiết kế trình thu gom rác

Chủ Đề