Hướng dẫn what is the use of gc collect in python? - công dụng của gc thu thập trong python là gì?


Mô -đun này cung cấp một giao diện cho bộ thu rác tùy chọn. Nó cung cấp khả năng vô hiệu hóa bộ thu, điều chỉnh tần số 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 mà người thu thập tìm thấy nhưng không thể tự do. Vì bộ thu bổ sung, việc đếm tham chiếu đã được sử dụng trong Python, bạn có thể vô hiệu hóa bộ thu nếu bạn chắc chắn rằng chương trình của bạn không tạo các chu kỳ tham chiếu. Thu thập tự động có thể được vô hiệu hóa bằng cách gọi gc.disable(). Để gỡ lỗi một 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:

________ 6 ________ 7 ()()

Bật bộ sưu tập rác tự động.

________ 6 ________ 9 ()()

Tắt bộ sưu tập rác tự động.

________ 6 ________ 11 ()()

Trả về

>>> x = None
>>> class Lazarus:
...     def __del__(self):
...         global x
...         x = self
...
>>> lazarus = Lazarus()
>>> gc.is_finalized(lazarus)
False
>>> del lazarus
>>> gc.is_finalized(x)
True
2 Nếu bộ sưu tập tự động được bật.

________ 6 ________ 14 (Thế hệ = 2)(generation=2)

Không có lập luận, chạy một bộ sưu tập đầy đủ. Tạo đối số tùy chọn có thể là một số nguyên chỉ định thế hệ sẽ thu thập (từ 0 đến 2). Một

>>> x = None
>>> class Lazarus:
...     def __del__(self):
...         global x
...         x = self
...
>>> lazarus = Lazarus()
>>> gc.is_finalized(lazarus)
False
>>> del lazarus
>>> gc.is_finalized(x)
True
5 được nâng lên nếu số thế hệ không hợp lệ. Số lượng các đối tượng không thể truy cập được tìm thấy được trả về.

Các danh sách miễn phí được duy trì cho một số loại tích hợp được xóa bất cứ khi nào một bộ sưu tập đầy đủ hoặc bộ sưu tập của 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í có thể được giải phóng do thực hiện cụ thể, đặc biệt là

>>> x = None
>>> class Lazarus:
...     def __del__(self):
...         global x
...         x = self
...
>>> lazarus = Lazarus()
>>> gc.is_finalized(lazarus)
False
>>> del lazarus
>>> gc.is_finalized(x)
True
6.

________ 6 ________ 18 (cờ) ¶(flags)

Đặt cờ gỡ lỗi bộ sưu tập rác. Thông tin gỡ lỗi sẽ được ghi vào

>>> x = None
>>> class Lazarus:
...     def __del__(self):
...         global x
...         x = self
...
>>> lazarus = Lazarus()
>>> gc.is_finalized(lazarus)
False
>>> del lazarus
>>> gc.is_finalized(x)
True
9. 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ách sử dụng các hoạt động bit để kiểm soát gỡ lỗi.

________ 6 ________ 21 ()()

Trả lại các cờ gỡ lỗi hiện đang được đặt.

________ 6 ________ 23 (thế hệ = không) ¶(generation=None)

Trả về một danh sách tất cả các đối tượng được theo dõi bởi người thu thập, không bao gồm danh sách được trả về. Nếu thế hệ không phải là không, chỉ trả lại các đối tượng được theo dõi bởi người thu thập trong thế hệ đó.

Thay đổi trong phiên bản 3.8: Tham số thế hệ mới.New generation parameter.

Tăng một sự kiện kiểm toán gc.disable()4 với đối số gc.disable()5.auditing event gc.disable()4 with argument gc.disable()5.

________ 6 ________ 27 ()()

Trả về một danh sách ba từ điển mỗi thế hệ chứa thống kê thu thập kể từ khi thông dịch viên bắt đầu. 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:

  • gc.disable()8 là số lần thế hệ này được thu thập;

  • gc.disable()9 là tổng số đối tượng được thu thập trong thế hệ này;

  • gc.set_debug(gc.DEBUG_LEAK)0 là tổng số đối tượng được tìm thấy là không thể kiểm soát được (và do đó được chuyển đến danh sách gc.set_debug(gc.DEBUG_LEAK)1) bên trong thế hệ này.

Mới trong phiên bản 3.4.

________ 6 ________ 33 (ngưỡng0 [, ngưỡng1 [, ngưỡng2]]) ¶(threshold0[, threshold1[, threshold2]])

Đặt ngưỡng thu gom rác (tần số thu thập). Cài đặt Ngưỡng0 thành Zero vô hiệu hóa Bộ sưu tập.

GC phân loại các đối tượng thành ba thế hệ tùy thuộc vào số lượng bộ sưu tập họ đã sống sót. Các đối tượng mới được đặt trong thế hệ trẻ nhất (Thế hệ gc.set_debug(gc.DEBUG_LEAK)4). Nếu một đối tượng tồn tại một bộ sưu tập, nó sẽ được chuyển sang thế hệ cũ hơn tiếp theo. Vì thế hệ gc.set_debug(gc.DEBUG_LEAK)5 là thế hệ lâu đời nhất, các đối tượng trong thế hệ đó vẫn ở đó sau một bộ sưu tập. Để quyết định khi nào nên chạy, người thu thập theo dõi các phân bổ đối tượng và giao dịch số kể từ bộ sưu tập cuối cùng. Khi số lượng phân bổ trừ đi số lượng giải quyết vượt quá ngưỡng0, bộ sưu tập bắt đầu. Ban đầu chỉ có thế hệ gc.set_debug(gc.DEBUG_LEAK)4 được kiểm tra. Nếu thế hệ gc.set_debug(gc.DEBUG_LEAK)4 đã được kiểm tra nhiều hơn ngưỡng1 lần kể từ khi thế hệ gc.set_debug(gc.DEBUG_LEAK)8 đã được kiểm tra, thì thế hệ gc.set_debug(gc.DEBUG_LEAK)8 cũng được kiểm tra. Với thế hệ thứ ba, mọi thứ phức tạp hơn một chút, xem việc thu thập thế hệ lâu đời nhất để biết thêm thông tin.

________ 6 ________ 41 ()()

Trả lại bộ sưu tập hiện tại được tính là một bộ giảm mạnh gc.DEBUG_SAVEALL2.

________ 6 ________ 44 ()()

Trả lại các ngưỡng bộ sưu tập hiện tại dưới dạng bộ giảm 55.

________ 6 ________ 47 (*objs) ¶(*objs)

Trả về danh sách các đối tượng trực tiếp đề cập đến bất kỳ OBJ nào. Chức năng này sẽ chỉ định vị các container hỗ trợ thu gom rác; Các loại mở rộng đề cập đến các đối tượng khác nhưng không hỗ trợ thu gom rác sẽ không được tìm thấy.

Lưu ý rằng các đối tượng đã bị bỏ rơi, nhưng sống theo chu kỳ và chưa được thu thập bởi người thu gom rác có thể được liệt kê trong số các người giới thiệu kết quả. Để chỉ nhận được các đối tượng hiện tại, hãy gọi gc.DEBUG_SAVEALL8 trước khi gọi gc.DEBUG_SAVEALL9.

Cảnh báo

Phải cẩn thận khi sử dụng các đối tượng được trả về bởi gc.DEBUG_SAVEALL9 vì một số trong số chúng vẫn có thể được xây dựng và do đó ở trạng thái không hợp lệ. Tránh sử dụng gc.DEBUG_SAVEALL9 cho bất kỳ mục đích nào khác ngoài việc gỡ lỗi.

Tăng một sự kiện kiểm toán gc2 với đối số gc3.auditing event gc2 with argument gc3.

________ 6 ________ 55 (*objs) ¶(*objs)

Trả về một danh sách các đối tượng trực tiếp được đề cập bởi bất kỳ đối số nào. Các giới thiệu được trả về là những đối tượng được truy cập bởi các phương thức đối số C cấp độ C (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 pháp gc6 chỉ được hỗ trợ bởi các đối tượng hỗ trợ thu gom rác và chỉ được yêu cầu truy cập các đối tượng có thể tham gia vào một chu kỳ. 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ố, đối tượng số nguyên đó có thể hoặc không thể xuất hiện trong danh sách kết quả.

Tăng một sự kiện kiểm toán gc8 với đối số gc3.auditing event gc8 with argument gc3.

________ 6 ________ 61 (OBJ) ¶(obj)

Trả về

>>> x = None
>>> class Lazarus:
...     def __del__(self):
...         global x
...         x = self
...
>>> lazarus = Lazarus()
>>> gc.is_finalized(lazarus)
False
>>> del lazarus
>>> gc.is_finalized(x)
True
2 Nếu đối tượng hiện đang được theo dõi bởi Trình thu thập rác, gc.3 nếu không. Theo nguyên tắc chung, các trường hợp của các loại nguyên tử đã được theo dõi và các trường hợp của các loại không nguyên tử (container, đối tượng do người dùng xác định) là. Tuy nhiên, một số tối ưu hóa cụ thể loại có thể có mặt để triệt tiêu dấu chân người thu gom rác của các trường hợp đơn giản (ví dụ: các dict chỉ chứa các khóa và giá trị nguyên tử):

>>> gc.is_tracked(0)
False
>>> gc.is_tracked("a")
False
>>> gc.is_tracked([])
True
>>> gc.is_tracked({})
False
>>> gc.is_tracked({"a": 1})
False
>>> gc.is_tracked({"a": []})
True

Mới trong phiên bản 3.1.

________ 6 ________ 65 (OBJ) ¶(obj)

Trả về

>>> x = None
>>> class Lazarus:
...     def __del__(self):
...         global x
...         x = self
...
>>> lazarus = Lazarus()
>>> gc.is_finalized(lazarus)
False
>>> del lazarus
>>> gc.is_finalized(x)
True
2 Nếu đối tượng đã cho đã được hoàn thành bởi người thu gom rác, gc.3 khác.

>>> x = None
>>> class Lazarus:
...     def __del__(self):
...         global x
...         x = self
...
>>> lazarus = Lazarus()
>>> gc.is_finalized(lazarus)
False
>>> del lazarus
>>> gc.is_finalized(x)
True

Mới trong phiên bản 3.9.

________ 6 ________ 69 ()()

Đóng băng tất cả các đối tượng được theo dõi bởi GC - chuyển chúng đến một thế hệ vĩnh viễn và bỏ qua tất cả các bộ sưu tập trong tương lai. Điều này có thể được sử dụng trước cuộc gọi POSIX Fork () để làm cho GC Sao chép thân thiện với Copy hoặc để tăng tốc bộ sưu tập. Ngoài ra, thu thập trước một cuộc gọi Posix Fork () có thể các trang miễn phí để phân bổ trong tương lai có thể gây ra sao chép trên đồng hồ để nó khuyên bạn nên vô hiệu hóa GC trong quy trình cha mẹ và đóng băng trước ngã ba và kích hoạt GC trong quy trình trẻ em.

Mới trong phiên bản 3.7.

________ 6 ________ 71 ()()

Giải phóng các đối tượng trong thế hệ vĩnh viễn, đưa chúng trở lại thế hệ lâu đời nhất.

Mới trong phiên bản 3.7.

________ 6 ________ 71 ()()

Giải phóng các đối tượng trong thế hệ vĩnh viễn, đưa chúng trở lại thế hệ lâu đời nhất.

Mới trong phiên bản 3.7.

________ 6 ________ 71 ()

Giải phóng các đối tượng trong thế hệ vĩnh viễn, đưa chúng trở lại thế hệ lâu đời nhất.

________ 6 ________ 73 ()

Trả về số lượng đối tượng trong thế hệ vĩnh viễn.

Các biến sau đây được cung cấp cho quyền truy cập chỉ đọc (bạn có thể biến đổi các giá trị nhưng không nên làm lại chúng):Following PEP 442, objects with a enable9 method don’t end up in gc.0 anymore.

________ 6 ________ 75¶

Một danh sách các đối tượng mà người thu thập được tìm thấy là không thể truy cập được nhưng không thể được giải phóng (các đối tượng không thể kiểm soát). Bắt đầu với Python 3.4, danh sách này sẽ trống hầu hết thời gian, ngoại trừ khi sử dụng các phiên bản của các loại tiện ích mở rộng C với khe cắm không phải -____ 76 enable7.

Nếu enable8 đượ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.4: Theo PEP 442, các đối tượng có phương thức enable9 don don kết thúc trong gc.0 nữa.

________ 6 ________ 82¶

Một danh sách các cuộc gọi lại sẽ được gọi bởi người thu gom rác trước và sau khi thu thập. Các cuộc gọi lại sẽ được gọi với hai đối số, pha và thông tin.

Pha có thể là một trong hai giá trị:

Bắt đầu: Bộ sưu tập rác sắp bắt đầu.

STOP STOP: Bộ sưu tập rác đã hoàn thành.

Thông tin là một dict cung cấp thêm thông tin cho cuộc gọi lại. Các khóa sau hiện đang được xác định:

Thế hệ của người Viking: Thế hệ lâu đời nhất được thu thập.

Đã thu thập được: khi giai đoạn là Stop Stop, số lượng đối tượng được thu thập thành công.

Không thể hiểu được: khi pha là dừng lại, số lượng đối tượng không thể thu thập được và được đưa vào gc.set_debug(gc.DEBUG_LEAK)1.

Các ứng dụng có thể thêm các cuộc gọi lại của riêng họ 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ề bộ sưu tập 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 mất bao lâu.

Cho phép các ứng dụng xác định và xóa các loại không thể kiểm soát của chính họ khi chúng xuất hiện trong gc.set_debug(gc.DEBUG_LEAK)1.

Mới trong phiên bản 3.3.

Các hằng số sau được cung cấp để sử dụng với gc.5:

________ 6 ________ 87¶

Thống kê in 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.

________ 6 ________ 89¶Also print the contents of the gc.set_debug(gc.DEBUG_LEAK)1 list at interpreter shutdown, if it isn’t empty.

In thông tin về các đối tượng có thể thu thập được.

________ 6 ________ 91¶

In thông tin của các đối tượng không thể thu được được tìm thấy (các đối tượng không thể truy cập được nhưng không thể được giải phóng bởi người thu thập). Những đối tượng này sẽ được thêm vào danh sách gc.set_debug(gc.DEBUG_LEAK)1.

Đã thay đổi trong phiên bản 3.2: Cũng in nội dung của danh sách gc.set_debug(gc.DEBUG_LEAK)1 khi tắt máy, nếu nó không trống.

Tôi có nên gọi GC thu thập Python không?

Bạn không nên gọi nó.Bộ thu gom rác chỉ được sử dụng để xóa các tài liệu tham khảo tròn không được giải phóng bởi cơ chế đếm tham chiếu.Nó sẽ không khắc phục được vấn đề ngoài bộ nhớ của bạn;Nếu bạn bị rò rỉ bộ nhớ, bạn nên sửa nó.. The garbage collector is only used to clear up circular references that are not freed by the reference counting mechanism. It will not fix your out-of-memory problem; if you have a memory leak, you should fix that.

Bộ sưu tập rác gc trong Python là gì?

Quá trình mà Python định kỳ giải phóng và đòi lại các khối bộ nhớ không còn được sử dụng được gọi là bộ sưu tập rác.Trình thu gom rác của Python chạy trong quá trình thực hiện chương trình và được kích hoạt khi số lượng tham chiếu của đối tượng đạt đến 0. is called Garbage Collection. Python's garbage collector runs during program execution and is triggered when an object's reference count reaches zero.