gc --- Giao diện thu gom rác¶
Mô-đun này cung cấp giao diện cho trình thu gom rác tùy chọn. Nó cung cấp khả năng vô hiệu hóa bộ thu thập, điều chỉnh tần suất thu thập và đặt các tùy chọn gỡ lỗi. Nó cũng cung cấp quyền truy cập vào các đối tượng không thể truy cập được mà bộ sưu tập đã tìm thấy nhưng không thể giải phóng. Vì bộ sưu tập bổ sung tính năng đếm tham chiếu đã được sử dụng trong Python nên bạn có thể tắt bộ sưu tập nếu bạn chắc chắn rằng chương trình của mình không tạo chu trình tham chiếu. Việc thu thập tự động có thể bị vô hiệu hóa bằng cách gọi gc.disable(). Để gỡ lỗi chương trình bị rò rỉ, hãy gọi gc.set_debug(gc.DEBUG_LEAK). Lưu ý rằng điều này bao gồm gc.DEBUG_SAVEALL, khiến các đối tượng được thu thập rác được lưu trong gc.garbage để kiểm tra.
Mô-đun gc cung cấp các chức năng sau:
- gc.enable()¶
Kích hoạt tính năng thu gom rác tự động.
- gc.disable()¶
Tắt tính năng thu gom rác tự động.
- gc.isenabled()¶
Trả về
Truenếu tính năng thu thập tự động được bật.
- gc.collect(generation=2)¶
Thực hiện một bộ sưu tập. Đối số tùy chọn generation có thể là một số nguyên chỉ định thế hệ nào sẽ thu thập (từ 0 đến 2). Một
ValueErrorđược nâng lên nếu số thế hệ không hợp lệ. Tổng số đối tượng đã thu thập và đối tượng không thể thu thập được trả về.Gọi
gc.collect(0)sẽ thực hiện bộ sưu tập GC cho thế hệ trẻ.Việc gọi
gc.collect(1)sẽ thực hiện bộ sưu tập GC trên thế hệ trẻ và sự gia tăng của thế hệ cũ.Gọi
gc.collect(2)hoặcgc.collect()thực hiện một bộ sưu tập đầy đủDanh sách miễn phí được duy trì cho một số loại tích hợp sẽ bị xóa bất cứ khi nào bộ sưu tập đầy đủ hoặc bộ sưu tập thế hệ cao nhất (2) được chạy. Không phải tất cả các mục trong một số danh sách miễn phí đều có thể được giải phóng do cách triển khai cụ thể, đặc biệt là
float.Hiệu ứng của việc gọi
gc.collect()trong khi trình thông dịch đang thực hiện bộ sưu tập là không xác định.Thay đổi trong phiên bản 3.14:
generation=1thực hiện tăng dần bộ sưu tập.
- gc.set_debug(flags)¶
Đặt cờ gỡ lỗi thu gom rác. Thông tin gỡ lỗi sẽ được ghi vào
sys.stderr. Xem bên dưới để biết danh sách các cờ gỡ lỗi có thể được kết hợp bằng các thao tác bit để kiểm soát việc gỡ lỗi.
- gc.get_debug()¶
Trả lại cờ gỡ lỗi hiện được đặt.
- gc.get_objects(generation=None)¶
Trả về danh sách tất cả các đối tượng được bộ sưu tập theo dõi, ngoại trừ danh sách được trả về. Nếu generation không phải là
None, chỉ trả về các đối tượng như sau:0: Tất cả các đối tượng trong thế hệ trẻ
1: Không có đối tượng, vì không có thế hệ 1 (kể từ Python 3.14)
2: Tất cả các đối tượng ở thế hệ cũ
Thay đổi trong phiên bản 3.8: Thông số generation mới.
Thay đổi trong phiên bản 3.14: Thế hệ 1 bị loại bỏ
Tăng một auditing event
gc.get_objectsvới đối sốgeneration.
- gc.get_stats()¶
Trả về danh sách ba từ điển cho mỗi thế hệ chứa số liệu thống kê về bộ sưu tập kể từ khi bắt đầu trình thông dịch. Số lượng khóa có thể thay đổi trong tương lai, nhưng hiện tại mỗi từ điển sẽ chứa các mục sau:
collectionslà số lần thế hệ này được thu thập;collectedlà tổng số đối tượng được thu thập trong thế hệ này;uncollectablelà tổng số đối tượng được phát hiện là không thể thu thập được (và do đó đã được chuyển vào danh sáchgarbage) trong thế hệ này.
Added in version 3.4.
- gc.set_threshold(threshold0[, threshold1[, threshold2]])¶
Đặt ngưỡng thu gom rác (tần suất thu gom). Đặt threshold0 về 0 sẽ vô hiệu hóa việc thu thập.
GC phân loại các đối tượng thành hai thế hệ tùy thuộc vào việc chúng có tồn tại trong bộ sưu tập hay không. Những đối tượng mới được đặt vào thế hệ trẻ. Nếu một đối tượng tồn tại trong bộ sưu tập thì nó sẽ được chuyển sang thế hệ cũ.
Để quyết định thời điểm chạy, bộ sưu tập theo dõi số lượng phân bổ và phân bổ đối tượng kể từ bộ sưu tập cuối cùng. Khi số lượng phân bổ trừ đi số lượng phân bổ vượt quá threshold0, quá trình thu thập sẽ bắt đầu. Đối với mỗi bộ sưu tập, tất cả các đồ vật thuộc thế hệ trẻ và một phần của thế hệ cũ sẽ được thu thập.
Trong bản dựng luồng tự do, việc tăng mức sử dụng bộ nhớ quy trình cũng được kiểm tra trước khi chạy trình thu thập. Nếu mức sử dụng bộ nhớ không tăng 10% kể từ bộ sưu tập cuối cùng và số lượng phân bổ đối tượng thực không vượt quá 40 lần threshold0 thì bộ sưu tập sẽ không chạy.
Tỷ lệ thế hệ cũ được thu thập là inversely tỷ lệ với threshold1. Zz002zz càng lớn thì các đối tượng ở thế hệ cũ được thu thập càng chậm. Với giá trị mặc định là 10, 1% thế hệ cũ sẽ được quét trong mỗi lần thu thập.
threshold2 bị bỏ qua.
Xem Garbage collector design để biết thêm thông tin.
Thay đổi trong phiên bản 3.14: threshold2 bị bỏ qua
- gc.get_count()¶
Trả về bộ sưu tập hiện tại được tính là một bộ
(count0, count1, count2).
- gc.get_threshold()¶
Trả về ngưỡng bộ sưu tập hiện tại dưới dạng bộ dữ liệu
(threshold0, threshold1, threshold2).
- gc.get_referrers(*objs)¶
Trả về danh sách các đối tượng tham chiếu trực tiếp đến bất kỳ đối tượng nào. Chức năng này sẽ chỉ định vị những thùng chứa hỗ trợ thu gom rác; sẽ không tìm thấy các loại tiện ích mở rộng tham chiếu đến các đối tượng khác nhưng không hỗ trợ thu gom rác.
Lưu ý rằng các đối tượng đã bị hủy đăng ký nhưng tồn tại theo chu kỳ và chưa được trình thu gom rác thu thập có thể được liệt kê trong số các liên kết giới thiệu kết quả. Để chỉ nhận các đối tượng hiện đang hoạt động, hãy gọi
collect()trước khi gọiget_referrers().Cảnh báo
Phải cẩn thận khi sử dụng các đối tượng được trả về bởi
get_referrers()vì một số trong số chúng có thể vẫn đang được xây dựng và do đó ở trạng thái tạm thời không hợp lệ. Tránh sử dụngget_referrers()cho bất kỳ mục đích nào khác ngoài việc gỡ lỗi.Tăng một auditing event
gc.get_referrersvới đối sốobjs.
- gc.get_referents(*objs)¶
Trả về danh sách các đối tượng được tham chiếu trực tiếp bởi bất kỳ đối số nào. Các tham chiếu được trả về là những đối tượng được truy cập bằng các phương thức
tp_traversecấp C của đối số (nếu có) và có thể không phải là tất cả các đối tượng thực sự có thể truy cập trực tiếp. Các phương thứctp_traversechỉ được hỗ trợ bởi các đối tượng hỗ trợ thu thập rác và chỉ được yêu cầu truy cập các đối tượng có thể liên quan đến một chu trình. Vì vậy, ví dụ, nếu một số nguyên có thể truy cập trực tiếp từ một đối số, thì đối tượng số nguyên đó có thể xuất hiện hoặc không xuất hiện trong danh sách kết quả.Tăng một auditing event
gc.get_referentsvới đối sốobjs.
- gc.is_tracked(obj)¶
Trả về
Truenếu đối tượng hiện đang được bộ thu gom rác theo dõi, nếu không thì trả vềFalse. Theo nguyên tắc chung, các phiên bản của loại nguyên tử không được theo dõi và các phiên bản của loại không nguyên tử (vùng chứa, đối tượng do người dùng xác định...) thì có. Tuy nhiên, có thể có một số tối ưu hóa dành riêng cho từng loại để ngăn chặn dấu chân của trình thu gom rác của các phiên bản đơn giản (ví dụ: các lệnh chỉ chứa khóa và giá trị nguyên tử):>>> gc.is_tracked(0) sai >>> gc.is_tracked("a") sai >>> gc.is_tracked([]) đúng >>> gc.is_tracked({}) sai >>> gc.is_tracked({"a": 1}) đúng
Added in version 3.1.
- gc.is_finalized(obj)¶
Trả về
Truenếu đối tượng đã cho đã được trình thu gom rác hoàn thiện, nếu không thì trả vềFalse.>>> x = Không có >>> lớp Lazarus: ... chắc chắn __del__(tự): ... toàn cầu x ... x = bản thân ... >>> lazarus = Lazarus() >>> gc.is_finalized(lazarus) sai >>> del lazarus >>> gc.is_finalized(x) đúng
Added in version 3.9.
- gc.freeze()¶
Đóng băng tất cả các đối tượng được người thu gom rác theo dõi; chuyển chúng sang thế hệ vĩnh viễn và bỏ qua chúng trong tất cả các bộ sưu tập trong tương lai.
Nếu một tiến trình sẽ
fork()mà không cóexec(), việc tránh sao chép khi ghi không cần thiết trong các tiến trình con sẽ tối đa hóa việc chia sẻ bộ nhớ và giảm mức sử dụng bộ nhớ tổng thể. Điều này đòi hỏi cả việc tránh tạo ra các "lỗ hổng" giải phóng trên các trang bộ nhớ trong quy trình gốc và đảm bảo rằng các bộ sưu tập GC trong quy trình con sẽ không chạm vào bộ đếmgc_refscủa các đối tượng tồn tại lâu dài có nguồn gốc trong quy trình gốc. Để thực hiện cả hai, hãy gọigc.disable()sớm trong quy trình gốc,gc.freeze()ngay trướcfork()vàgc.enable()sớm trong quy trình con.Added in version 3.7.
- gc.unfreeze()¶
Giải phóng các đối tượng ở thế hệ vĩnh viễn, đưa chúng trở lại thế hệ cũ nhất.
Added in version 3.7.
- gc.get_freeze_count()¶
Trả về số lượng đối tượng trong thế hệ vĩnh viễn.
Added in version 3.7.
Các biến sau được cung cấp để truy cập chỉ đọc (bạn có thể thay đổi các giá trị nhưng không nên liên kết lại chúng):
- gc.garbage¶
Danh sách các đối tượng mà bộ sưu tập nhận thấy không thể truy cập được nhưng không thể giải phóng (đối tượng không thể thu thập được). Bắt đầu với Python 3.4, danh sách này hầu hết sẽ trống, ngoại trừ khi sử dụng các phiên bản của loại tiện ích mở rộng C có khe cắm không phải
NULLtp_del.Nếu
DEBUG_SAVEALLđược đặt thì tất cả các đối tượng không thể truy cập sẽ được thêm vào danh sách này thay vì được giải phóng.Thay đổi trong phiên bản 3.2: Nếu danh sách này không trống ở interpreter shutdown, thì
ResourceWarningsẽ được phát ra, theo mặc định là im lặng. NếuDEBUG_UNCOLLECTABLEđược đặt, ngoài ra, tất cả các đối tượng không thể thu thập được sẽ được in.Thay đổi trong phiên bản 3.4: Theo sau PEP 442, các đối tượng có phương thức
__del__()không còn xuất hiện tronggc.garbagenữa.
- gc.callbacks¶
Danh sách các lệnh gọi lại sẽ được trình thu gom rác gọi trước và sau khi thu thập. Lệnh gọi lại sẽ được gọi với hai đối số, phase và info.
phase có thể là một trong hai giá trị:
"start": Quá trình thu gom rác sắp bắt đầu.
"stop": Quá trình thu gom rác đã kết thúc.
info là một lệnh cung cấp thêm thông tin cho lệnh gọi lại. Các khóa sau hiện được xác định:
"thế hệ": Thế hệ lâu đời nhất được thu thập.
"đã thu thập": Khi phase "dừng", số lượng đối tượng được thu thập thành công.
"không thể thu thập": Khi phase "dừng", số đối tượng không thể thu thập được và được đưa vào
garbage.Các ứng dụng có thể thêm lệnh gọi lại của riêng mình vào danh sách này. Các trường hợp sử dụng chính là:
Thu thập số liệu thống kê về việc thu gom rác, chẳng hạn như tần suất thu thập các thế hệ khác nhau và thời gian thu thập.
Cho phép ứng dụng xác định và xóa các loại không thể thu thập của riêng chúng khi chúng xuất hiện trong
garbage.Added in version 3.3.
Các hằng số sau được cung cấp để sử dụng với set_debug():
- gc.DEBUG_STATS¶
In số liệu thống kê trong quá trình thu thập. Thông tin này có thể hữu ích khi điều chỉnh tần số thu thập.
- gc.DEBUG_COLLECTABLE¶
In thông tin về các đồ vật sưu tầm được tìm thấy.
- gc.DEBUG_UNCOLLECTABLE¶
In thông tin về các đối tượng không thể thu thập được tìm thấy (các đối tượng không thể truy cập được nhưng người thu thập không thể giải phóng). Những đối tượng này sẽ được thêm vào danh sách
garbage.Thay đổi trong phiên bản 3.2: Đồng thời in nội dung của danh sách
garbagetại interpreter shutdown, nếu nó không trống.
- gc.DEBUG_SAVEALL¶
Khi được đặt, tất cả các đối tượng không thể truy cập được tìm thấy sẽ được thêm vào garbage thay vì được giải phóng. Điều này có thể hữu ích cho việc gỡ lỗi một chương trình bị rò rỉ.
- gc.DEBUG_LEAK¶
Các cờ gỡ lỗi cần thiết để bộ sưu tập in thông tin về chương trình bị rò rỉ (bằng
DEBUG_COLLECTABLE | DEBUG_UNCOLLECTABLE | DEBUG_SAVEALL).