2012-02-26 36 views
10

Khi nào các vật thể được thu gom trong python? Khi nào bộ nhớ được phát hành và bộ sưu tập có tác động đến hiệu suất không? Có thể chọn không tham gia hoặc điều chỉnh thuật toán gc và nếu có thì làm cách nào?Khi nào đối tượng thu gom rác trong python?

Trả lời

10

Dưới đây là một đoạn trích từ language reference

Đối tượng không bao giờ bị phá hủy một cách rõ ràng; tuy nhiên, khi chúng trở nên không thể tiếp cận, chúng có thể bị thu gom rác. Việc thực hiện được phép trì hoãn thu gom rác hoặc bỏ qua nó hoàn toàn - đó là vấn đề chất lượng thực hiện cách thu thập rác thải được thực hiện, miễn là không có đối tượng nào được thu thập mà vẫn có thể truy cập được.

CPython chi tiết thi hành: CPython hiện đang sử dụng một chương trình tài liệu tham khảo đếm với (không bắt buộc) phát hiện chậm trễ của rác thải theo chu kỳ liên kết, thu thập hầu hết các đối tượng ngay sau khi họ trở thành không thể truy cập, nhưng không đảm bảo để thu thập rác thải có chứa tham chiếu vòng tròn . Xem tài liệu của mô-đun gc để biết thông tin về việc kiểm soát việc thu thập rác thải theo chu kỳ. Các triển khai khác hoạt động khác và CPython có thể thay đổi. Không phụ thuộc vào việc hoàn thành ngay lập tức các đối tượng khi chúng trở nên không thể truy cập được (ví dụ: luôn đóng các tệp).

CHỈNH SỬA: Về việc trì hoãn thu gom rác thải .... gc mô-đun cho phép bạn tương tác với bộ thu gom rác và vô hiệu hóa nếu bạn muốn và thay đổi tần suất thu thập vv Nhưng bản thân tôi chưa tự mình sử dụng. Ngoài ra, các chu kỳ có chứa bất kỳ đối tượng nào với các phương thức __del__are not collected.

+0

Tốt, mặc dù khá khó chịu. Bất kỳ ý tưởng làm thế nào bạn phát ra hoặc trì hoãn gc? –

+0

Đây là một câu hỏi khác nhau Matt Alcock và câu trả lời có sẵn. – erisco

+0

@MattAlcock: phát ra hoặc trì hoãn gc? (1) Đó là một câu hỏi riêng. Và. (2) Tại sao bạn muốn? Nếu bạn không muốn thu thập rác đối tượng, hãy gán nó cho một biến. –

11

Khi nào các vật thể được thu gom trong python?

Có rất nhiều chi tiết trong các mã nguồn cho CPython: http://svn.python.org/view/python/trunk/Modules/gcmodule.c?revision=81029&view=markup

Bất cứ lúc nào một số tài liệu tham khảo xuống hết, các đối tượng được ngay lập tức bị loại bỏ.

293/* gc cyclic Python không bao giờ sẽ thấy một refcount đến

294 * 0: nếu có điều gì decref'ed 0, nó cần phải có được

295 * deallocated ngay tại thời điểm đó .

Một bộ sưu tập đầy đủ được kích hoạt khi số lượng đối tượng mới lớn hơn 25% số đối tượng hiện có.

87 Ngoài các ngưỡng cấu hình khác nhau, chúng ta chỉ kích hoạt một

88 bộ sưu tập đầy đủ nếu tỷ lệ

89 long_lived_pending/long_lived_total

90 là trên một giá trị nhất định (Hardwired đến 25%).

Khi nào bộ nhớ được phát hành?

Tôi chỉ có thể khai thác thông tin này.

781/* Xóa tất cả danh sách miễn phí

782 * Tất cả các danh sách miễn phí sẽ bị xóa trong bộ sưu tập của thế hệ cao nhất.

783 * Các mục được phân bổ trong danh sách miễn phí có thể giữ một đấu trường pymalloc bị chiếm đóng.

784 * Việc xóa danh sách miễn phí có thể trả lại bộ nhớ cho hệ điều hành trước đó.

785 */

Theo đó, Python có thể giữ đối tượng của bạn trong một danh sách miễn phí cho tái chế ngay cả khi bạn thả refcount của nó không. Tôi không thể tìm thấy một cách rõ ràng khi cuộc gọi miễn phí được thực hiện để cung cấp bộ nhớ cho hệ điều hành, nhưng tôi tưởng tượng rằng điều này được thực hiện bất cứ khi nào một bộ sưu tập được tạo và đối tượng không được giữ trong danh sách miễn phí.

Bộ sưu tập có ảnh hưởng đến hiệu suất không?

Bất kỳ bộ thu gom rác không tầm thường nào mà tôi từng nghe đều yêu cầu cả CPU và bộ nhớ hoạt động. Do đó, có, luôn có tác động đến hiệu suất. Bạn sẽ phải thử nghiệm và làm quen với người thu gom rác của mình.

Chương trình yêu cầu phản hồi thời gian thực mà tôi gặp phải vấn đề, vì người thu gom rác không cấp cho tôi quyền kiểm soát khi họ chạy hoặc trong bao lâu. Một số trường hợp đặc biệt có thể gây ra sử dụng bộ nhớ quá mức là tốt, một ví dụ là knack của Python để giữ danh sách miễn phí.

Các vấn đề liên quan