Hướng dẫn garbage collection python - con trăn thu gom rác
Việc cấp phát và thu hồi bộ nhớ trong Python được thực hiện tự động. Người dùng sẽ không cần thiết phải tự mình cấp phát hay thu hồi bộ nhớ bằng cách sử dụng các câu lệnh xử lý bộ nhớ động, nhưng trong các ngôn ngữ chẳng hạn như C hay C++. Show Python sử dụng hai chiến lược cấp phát bộ nhớ: – Reference counting (đếm số tham chiếu) – Garbage collection (trình thu gom bộ nhớ) Trước phiên bản Python 2.0, trình thông dịch của Python (Python interpreter) chỉ sử dụng reference counting để quản lý bộ nhớ. Reference counting làm việc bằng cách đếm số lần mà một đối tượng được tham chiếu tới bởi các đối tượng khác trong hệ thống. Khi các tham chiếu đến một đối tượng không còn tồn tại nữa, reference count (số đếm tham chiếu) của đối tượng đó sẽ được giảm đi. Khi reference count giảm về 0, đối tượng sẽ được giải phóng, tức là phần bộ nhớ đã cấp phát cho đối tượng đó sẽ được thu hồi lại.
Trong ví dụ trên, giá trị 9 chính là một đối tượng. Reference count của đối tượng 9 này sẽ tăng lên một đơn vị thành 1 ở dòng 1. Trong dòng 2, reference count của đối tượng 9 này sẽ trở thành 0, bởi vì tại đây, nó đã bị giảm đi. Do đó, garbage collector (trình thu gom bộ nhớ) sẽ giải phóng đối tượng này. Một chu trình tham chiếu – reference cycle sẽ xuất hiện khi tồn tại một hoặc nhiều đối tượng tự tham chiếu đến chính bản thân nó hoặc tham chiếu tới nhau. Reference cycle thường xuất hiện khi sử dụng list, tuple, instance (các thể hiện của class), class, dictionary, và các function (hàm). Cách dễ nhất để tạo ra một reference cycle là tạo ra một đối tượng mà đối tượng này sẽ tham chiếu đến chính bản thân nó, như trong ví dụ dưới đây:
Bởi vì hàm create_cycle() sẽ tạo ra một đối tượng x tham chiếu tới chính bản thân nó, nên đối tượng x sẽ không được tự động giải phóng khi hàm này trả về (returns). Điều này sẽ khiến cho phần bộ nhớ mà đối tượng x đang sử dụng bị giữ lại cho đến khi garbage collector của Python được gọi.
1. Các cách để tạo ra một đối tượng mà garbage collector có thể thu gom
2. Việc tự động thu hồi bộ nhớ đối với các chu trình tham chiếu 2. Việc tự động thu hồi bộ nhớ đối với các chu trình tham chiếu3. Thu hồi bộ nhớ thủ công
Giá trị reference count cho list x lúc này là 2. Tuy nhiên, bởi vì nó không thể được truy cập đến từ bên trong Python và không thể được sử dụng lại, nên nó được coi là garbage (rác). Trong phiên bản hiện tại của Python, list x sẽ không bao giờ được giải phóng.
Bởi vì việc tìm ra các các chu trình tham chiếu (reference cycles) cần đến nhiều công việc tính toán, nên garbage collection – việc thu gom bộ nhớ cần phải là một hoạt động được lập lịch. Python sẽ lập trinh cho việc garbage collection – việc thu gom bộ nhớ dựa trên một số ngưỡng, liên quan đến số lượng các hành động cấp phát đối tượng, và số lượng các hành động giải phóng đối tượng. Khi số lượng các hành động cấp phát trừ đi số lượng các hành động giải phóng ra kết quả mà lớn hơn số ngưỡng, garbage collector – trình thu gom bộ nhớ sẽ hoạt động. Có thể kiểm tra số ngưỡng dành cho các đối tượng mới (đối tượng trong Python còn được gọi là các đối tượng thế hệ 0) bằng cách import module gc và truy cập đến các ngưỡng thu hồi bộ nhớ (garbage collection thresholds). 3. Thu hồi bộ nhớ thủ côngGiá trị reference count cho list x lúc này là 2. Tuy nhiên, bởi vì nó không thể được truy cập đến từ bên trong Python và không thể được sử dụng lại, nên nó được coi là garbage (rác). Trong phiên bản hiện tại của Python, list x sẽ không bao giờ được giải phóng.
Bởi vì việc tìm ra các các chu trình tham chiếu (reference cycles) cần đến nhiều công việc tính toán, nên garbage collection – việc thu gom bộ nhớ cần phải là một hoạt động được lập lịch. Python sẽ lập trinh cho việc garbage collection – việc thu gom bộ nhớ dựa trên một số ngưỡng, liên quan đến số lượng các hành động cấp phát đối tượng, và số lượng các hành động giải phóng đối tượng. Khi số lượng các hành động cấp phát trừ đi số lượng các hành động giải phóng ra kết quả mà lớn hơn số ngưỡng, garbage collector – trình thu gom bộ nhớ sẽ hoạt động. Có thể kiểm tra số ngưỡng dành cho các đối tượng mới (đối tượng trong Python còn được gọi là các đối tượng thế hệ 0) bằng cách import module gc và truy cập đến các ngưỡng thu hồi bộ nhớ (garbage collection thresholds).
Giá trị reference count cho list x lúc này là 2. Tuy nhiên, bởi vì nó không thể được truy cập đến từ bên trong Python và không thể được sử dụng lại, nên nó được coi là garbage (rác). Trong phiên bản hiện tại của Python, list x sẽ không bao giờ được giải phóng.
Bởi vì việc tìm ra các các chu trình tham chiếu (reference cycles) cần đến nhiều công việc tính toán, nên garbage collection – việc thu gom bộ nhớ cần phải là một hoạt động được lập lịch. Python sẽ lập trinh cho việc garbage collection – việc thu gom bộ nhớ dựa trên một số ngưỡng, liên quan đến số lượng các hành động cấp phát đối tượng, và số lượng các hành động giải phóng đối tượng. Khi số lượng các hành động cấp phát trừ đi số lượng các hành động giải phóng ra kết quả mà lớn hơn số ngưỡng, garbage collector – trình thu gom bộ nhớ sẽ hoạt động. Có thể kiểm tra số ngưỡng dành cho các đối tượng mới (đối tượng trong Python còn được gọi là các đối tượng thế hệ 0) bằng cách import module gc và truy cập đến các ngưỡng thu hồi bộ nhớ (garbage collection thresholds). Nguồn và Tài liệu tiếng anh tham khảo:
Tài liệu từ cafedev:
Nếu bạn thấy hay và hữu ích, bạn có thể tham gia các kênh sau của cafedev để nhận được nhiều hơn nữa:
Chào thân ái và quyết thắng! Đăng ký kênh youtube để ủng hộ Cafedev nha các bạn, Thanks you! |