Python xóa các đối tượng không mong muốn [các loại hoặc trường hợp lớp tích hợp] tự động để giải phóng không gian bộ nhớ. 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. Số lượng tham chiếu của một đối tượng thay đổi khi số lượng bí danh chỉ ra nó thay đổi.
Số lượng tham chiếu của một đối tượng tăng lên khi nó được gán một tên mới hoặc được đặt trong một container [danh sách, tuple hoặc từ điển]. Số lượng tham chiếu của đối tượng giảm khi nó bị xóa với & nbsp; del, tài liệu tham khảo của nó được chỉ định lại hoặc tham chiếu của nó đi ra khỏi phạm vi. Khi số lượng tham chiếu của một đối tượng đạt đến 0, Python sẽ tự động thu thập nó.
a = 40 # Create object b = a # Increase ref. count of c = [b] # Increase ref. count of del a # Decrease ref. count of b = 100 # Decrease ref. count of c[0] = -1 # Decrease ref. count of
Bạn thường sẽ không nhận thấy khi người thu gom rác phá hủy một ví dụ mồ côi và đòi lại không gian của nó. Nhưng một lớp có thể thực hiện phương thức đặc biệt & nbsp; __ del __ [], được gọi là một kẻ phá hủy, được gọi khi trường hợp sắp bị phá hủy. Phương pháp này có thể được sử dụng để làm sạch bất kỳ tài nguyên không bộ nhớ nào được sử dụng bởi một thể hiện.
Thí dụ
Bộ hủy __del __ [] này in tên lớp của một thể hiện sắp bị phá hủy -
#!/usr/bin/python class Point: def __init__[ self, x=0, y=0]: self.x = x self.y = y def __del__[self]: class_name = self.__class__.__name__ print class_name, "destroyed" pt1 = Point[] pt2 = pt1 pt3 = pt1 print id[pt1], id[pt2], id[pt3] # prints the ids of the obejcts del pt1 del pt2 del pt3
Đầu ra
Khi mã trên được thực thi, nó sẽ tạo ra kết quả sau -
3083401324 3083401324 3083401324 Point destroyed
Cập nhật vào ngày 13 tháng 6 năm 2020 13:25:47
- Câu hỏi và câu trả lời liên quan
- Bộ sưu tập rác hoạt động như thế nào trong lập trình Lua?
- Trình thu gom rác hoạt động như thế nào trong C#
- Bộ sưu tập rác trong Python
- Phá hủy các vật thể [bộ sưu tập rác] trong Python
- Bộ sưu tập rác Java
- Bộ sưu tập rác ở Java
- Bộ sưu tập rác [GC] trong JavaScript?
- Làm thế nào để buộc thu gom rác trong c#?
- Bộ sưu tập rác JavaScript là gì?
- Khi nào các đối tượng Python ứng cử viên cho bộ sưu tập rác?
- Bộ sưu tập rác trong C#là gì?
- Bộ thu thập và thu gom rác ở Perl
- Làm thế nào để python trong khi vòng lặp hoạt động?
- Làm thế nào để so sánh tuple hoạt động trong Python?
- Làm thế nào để mkdir -p hoạt động trong python?
Phương pháp phân bổ bộ nhớ và phân bổ bộ nhớ của Python là tự động. Người dùng không phải phân bổ hoặc xử lý bộ nhớ tương tự như sử dụng phân bổ bộ nhớ động bằng các ngôn ngữ như C hoặc C ++. & NBSP; Python sử dụng hai chiến lược để phân bổ bộ nhớ: & NBSP;
Python uses two strategies for memory allocation:
- Đếm tham chiếu
- Thu gom rác thải
Trước phiên bản Python 2.0, trình thông dịch Python chỉ sử dụng đếm tham chiếu để quản lý bộ nhớ. Đếm tham chiếu hoạt động bằng cách đếm số lần một đối tượng được tham chiếu 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 được xóa, số lượng tham chiếu cho một đối tượng bị giảm. Khi số lượng tham chiếu trở thành 0, đối tượng được giải quyết. Ex- & nbsp;
Python
Giá trị theo nghĩa đen 9 là một đối tượng. Số lượng tham chiếu của đối tượng 9 được tăng lên 1 trong dòng 1. Trong dòng 2, số lượng tham chiếu của nó trở thành 0 vì nó được bỏ qua. Vì vậy, người thu gom rác giải quyết đối tượng. Chu kỳ tham chiếu được tạo khi không có cách nào số lượng tham chiếu của đối tượng có thể đạt được. Các chu kỳ tham chiếu liên quan đến danh sách, bộ dữ liệu, trường hợp, lớp học, từ điển và chức năng là phổ biến. Cách dễ nhất để tạo một chu kỳ tham chiếu là tạo một đối tượng đề cập đến chính nó như trong ví dụ dưới đây: & nbsp;
A reference cycle is created when
there is no way the reference count of the object can reach. Reference cycles involving lists, tuples, instances, classes, dictionaries, and functions are common. The easiest way to create a reference cycle is to create an object which refers to itself as in the example below:
Python
Giá trị theo nghĩa đen 9 là một đối tượng. Số lượng tham chiếu của đối tượng 9 được tăng lên 1 trong dòng 1. Trong dòng 2, số lượng tham chiếu của nó trở thành 0 vì nó được bỏ qua. Vì vậy, người thu gom rác giải quyết đối tượng. Chu kỳ tham chiếu được tạo khi không có cách nào số lượng tham chiếu của đối tượng có thể đạt được. Các chu kỳ tham chiếu liên quan đến danh sách, bộ dữ liệu, trường hợp, lớp học, từ điển và chức năng là phổ biến. Cách dễ nhất để tạo một chu kỳ tham chiếu là tạo một đối tượng đề cập đến chính nó như trong ví dụ dưới đây: & nbsp;
def
create_cycle[]:
#!/usr/bin/python class Point: def __init__[ self, x=0, y=0]: self.x = x self.y = y def __del__[self]: class_name = self.__class__.__name__ print class_name, "destroyed" pt1 = Point[] pt2 = pt1 pt3 = pt1 print id[pt1], id[pt2], id[pt3] # prints the ids of the obejcts del pt1 del pt2 del pt33
#!/usr/bin/python class Point: def __init__[ self, x=0, y=0]: self.x = x self.y = y def __del__[self]: class_name = self.__class__.__name__ print class_name, "destroyed" pt1 = Point[] pt2 = pt1 pt3 = pt1 print id[pt1], id[pt2], id[pt3] # prints the ids of the obejcts del pt1 del pt2 del pt34
x
____10
#!/usr/bin/python class Point: def __init__[ self, x=0, y=0]: self.x = x self.y = y def __del__[self]: class_name = self.__class__.__name__ print class_name, "destroyed" pt1 = Point[] pt2 = pt1 pt3 = pt1 print id[pt1], id[pt2], id[pt3] # prints the ids of the obejcts del pt1 del pt2 del pt31
Bởi vì create_cycle [] tạo một đối tượng X đề cập đến chính nó, đối tượng X sẽ không tự động được giải phóng khi hàm trả về. Điều này sẽ gây ra bộ nhớ mà X đang sử dụng để được giữ cho đến khi bộ thu rác Python được gọi.
Python
Giá trị theo nghĩa đen 9 là một đối tượng. Số lượng tham chiếu của đối tượng 9 được tăng lên 1 trong dòng 1. Trong dòng 2, số lượng tham chiếu của nó trở thành 0 vì nó được bỏ qua. Vì vậy, người thu gom rác giải quyết đối tượng. Chu kỳ tham chiếu được tạo khi không có cách nào số lượng tham chiếu của đối tượng có thể đạt được. Các chu kỳ tham chiếu liên quan đến danh sách, bộ dữ liệu, trường hợp, lớp học, từ điển và chức năng là phổ biến. Cách dễ nhất để tạo một chu kỳ tham chiếu là tạo một đối tượng đề cập đến chính nó như trong ví dụ dưới đây: & nbsp;
#!/usr/bin/python class Point: def __init__[ self, x=0, y=0]: self.x = x self.y = y def __del__[self]: class_name = self.__class__.__name__ print class_name, "destroyed" pt1 = Point[] pt2 = pt1 pt3 = pt1 print id[pt1], id[pt2], id[pt3] # prints the ids of the obejcts del pt1 del pt2 del pt38
#!/usr/bin/python class Point: def __init__[ self, x=0, y=0]: self.x = x self.y = y def __del__[self]: class_name = self.__class__.__name__ print class_name, "destroyed" pt1 = Point[] pt2 = pt1 pt3 = pt1 print id[pt1], id[pt2], id[pt3] # prints the ids of the obejcts del pt1 del pt2 del pt39
3083401324 3083401324 3083401324 Point destroyed0
3083401324 3083401324 3083401324 Point destroyed1
def
create_cycle[]:
x
____10
#!/usr/bin/python class Point: def __init__[ self, x=0, y=0]: self.x = x self.y = y def __del__[self]: class_name = self.__class__.__name__ print class_name, "destroyed" pt1 = Point[] pt2 = pt1 pt3 = pt1 print id[pt1], id[pt2], id[pt3] # prints the ids of the obejcts del pt1 del pt2 del pt31
Bởi vì create_cycle [] tạo một đối tượng X đề cập đến chính nó, đối tượng X sẽ không tự động được giải phóng khi hàm trả về. Điều này sẽ gây ra bộ nhớ mà X đang sử dụng để được giữ cho đến khi bộ thu rác Python được gọi.
Các cách để làm cho một đối tượng đủ điều kiện để thu gom rác
Python
Giá trị theo nghĩa đen 9 là một đối tượng. Số lượng tham chiếu của đối tượng 9 được tăng lên 1 trong dòng 1. Trong dòng 2, số lượng tham chiếu của nó trở thành 0 vì nó được bỏ qua. Vì vậy, người thu gom rác giải quyết đối tượng. Chu kỳ tham chiếu được tạo khi không có cách nào số lượng tham chiếu của đối tượng có thể đạt được. Các chu kỳ tham chiếu liên quan đến danh sách, bộ dữ liệu, trường hợp, lớp học, từ điển và chức năng là phổ biến. Cách dễ nhất để tạo một chu kỳ tham chiếu là tạo một đối tượng đề cập đến chính nó như trong ví dụ dưới đây: & nbsp;
3083401324 3083401324 3083401324 Point destroyed6
3083401324 3083401324 3083401324 Point destroyed7
3083401324 3083401324 3083401324 Point destroyed8
3083401324 3083401324 3083401324 Point destroyed9
Garbage collection thresholds: [700, 10, 10]0
Garbage collection thresholds: [700, 10, 10]1
Output:
Garbage collection thresholds: [700, 10, 10]
def
create_cycle[]:
x
____10 #!/usr/bin/python
class Point:
def __init__[ self, x=0, y=0]:
self.x = x self.y = y def __del__[self]:
class_name = self.__class__.__name__ print class_name, "destroyed"
pt1 = Point[]
pt2 = pt1 pt3 = pt1
print id[pt1], id[pt2], id[pt3] # prints the ids of the obejcts
del pt1
del pt2
del pt3
1
Bởi vì create_cycle [] tạo một đối tượng X đề cập đến chính nó, đối tượng X sẽ không tự động được giải phóng khi hàm trả về. Điều này sẽ gây ra bộ nhớ mà X đang sử dụng để được giữ cho đến khi bộ thu rác Python được gọi.
The garbage collection can be invoked manually in the following way:
Python
Giá trị theo nghĩa đen 9 là một đối tượng. Số lượng tham chiếu của đối tượng 9 được tăng lên 1 trong dòng 1. Trong dòng 2, số lượng tham chiếu của nó trở thành 0 vì nó được bỏ qua. Vì vậy, người thu gom rác giải quyết đối tượng. Chu kỳ tham chiếu được tạo khi không có cách nào số lượng tham chiếu của đối tượng có thể đạt được. Các chu kỳ tham chiếu liên quan đến danh sách, bộ dữ liệu, trường hợp, lớp học, từ điển và chức năng là phổ biến. Cách dễ nhất để tạo một chu kỳ tham chiếu là tạo một đối tượng đề cập đến chính nó như trong ví dụ dưới đây: & nbsp;
def
create_cycle[]:
3083401324 3083401324 3083401324 Point destroyed6
3083401324 3083401324 3083401324 Point destroyed7
Garbage collection thresholds: [700, 10, 10]9
3083401324 3083401324 3083401324 Point destroyed9
x
____10
#!/usr/bin/python class Point: def __init__[ self, x=0, y=0]: self.x = x self.y = y def __del__[self]: class_name = self.__class__.__name__ print class_name, "destroyed" pt1 = Point[] pt2 = pt1 pt3 = pt1 print id[pt1], id[pt2], id[pt3] # prints the ids of the obejcts del pt1 del pt2 del pt31
Output:
['Garbage collector: collected', '0 objects.']
Bởi vì create_cycle [] tạo một đối tượng X đề cập đến chính nó, đối tượng X sẽ không tự động được giải phóng khi hàm trả về. Điều này sẽ gây ra bộ nhớ mà X đang sử dụng để được giữ cho đến khi bộ thu rác Python được gọi.
Example:
Python
Giá trị theo nghĩa đen 9 là một đối tượng. Số lượng tham chiếu của đối tượng 9 được tăng lên 1 trong dòng 1. Trong dòng 2, số lượng tham chiếu của nó trở thành 0 vì nó được bỏ qua. Vì vậy, người thu gom rác giải quyết đối tượng. Chu kỳ tham chiếu được tạo khi không có cách nào số lượng tham chiếu của đối tượng có thể đạt được. Các chu kỳ tham chiếu liên quan đến danh sách, bộ dữ liệu, trường hợp, lớp học, từ điển và chức năng là phổ biến. Cách dễ nhất để tạo một chu kỳ tham chiếu là tạo một đối tượng đề cập đến chính nó như trong ví dụ dưới đây: & nbsp;
def
create_cycle[]:
Giá trị theo nghĩa đen 9 là một đối tượng. Số lượng tham chiếu của đối tượng 9 được tăng lên 1 trong dòng 1. Trong dòng 2, số lượng tham chiếu của nó trở thành 0 vì nó được bỏ qua. Vì vậy, người thu gom rác giải quyết đối tượng. Chu kỳ tham chiếu được tạo khi không có cách nào số lượng tham chiếu của đối tượng có thể đạt được. Các chu kỳ tham chiếu liên quan đến danh sách, bộ dữ liệu, trường hợp, lớp học, từ điển và chức năng là phổ biến. Cách dễ nhất để tạo một chu kỳ tham chiếu là tạo một đối tượng đề cập đến chính nó như trong ví dụ dưới đây: & nbsp;
def
create_cycle[]:
x
____10
#!/usr/bin/python class Point: def __init__[ self, x=0, y=0]: self.x = x self.y = y def __del__[self]: class_name = self.__class__.__name__ print class_name, "destroyed" pt1 = Point[] pt2 = pt1 pt3 = pt1 print id[pt1], id[pt2], id[pt3] # prints the ids of the obejcts del pt1 del pt2 del pt31
Bởi vì create_cycle [] tạo một đối tượng X đề cập đến chính nó, đối tượng X sẽ không tự động được giải phóng khi hàm trả về. Điều này sẽ gây ra bộ nhớ mà X đang sử dụng để được giữ cho đến khi bộ thu rác Python được gọi.
Các cách để làm cho một đối tượng đủ điều kiện để thu gom rác
x
____10
#!/usr/bin/python class Point: def __init__[ self, x=0, y=0]: self.x = x self.y = y def __del__[self]: class_name = self.__class__.__name__ print class_name, "destroyed" pt1 = Point[] pt2 = pt1 pt3 = pt1 print id[pt1], id[pt2], id[pt3] # prints the ids of the obejcts del pt1 del pt2 del pt37
3083401324 3083401324 3083401324 Point destroyed2
3083401324 3083401324 3083401324 Point destroyed3
Số lượng tham chiếu cho danh sách được tạo bây giờ là hai. Tuy nhiên, vì nó không thể đạt được từ bên trong Python và không thể được sử dụng lại, nó được coi là rác. Trong phiên bản hiện tại của Python, danh sách này không bao giờ được giải phóng. & Nbsp; & nbsp;
#!/usr/bin/python class Point: def __init__[ self, x=0, y=0]: self.x = x self.y = y def __del__[self]: class_name = self.__class__.__name__ print class_name, "destroyed" pt1 = Point[] pt2 = pt1 pt3 = pt1 print id[pt1], id[pt2], id[pt3] # prints the ids of the obejcts del pt1 del pt2 del pt34
def
create_cycle[]:
x
____10
#!/usr/bin/python class Point: def __init__[ self, x=0, y=0]: self.x = x self.y = y def __del__[self]: class_name = self.__class__.__name__ print class_name, "destroyed" pt1 = Point[] pt2 = pt1 pt3 = pt1 print id[pt1], id[pt2], id[pt3] # prints the ids of the obejcts del pt1 del pt2 del pt37
Output:
Garbage collector: collected 0 objects. Creating cycles... {1: {...}} {2: {...}} {3: {...}} {4: {...}} {5: {...}} {6: {...}} {7: {...}} {8: {...}} {9: {...}} {10: {...}} Garbage collector: collected 10 objects.
3083401324 3083401324 3083401324 Point destroyed2
3083401324 3083401324 3083401324 Point destroyed3
- Số lượng tham chiếu cho danh sách được tạo bây giờ là hai. Tuy nhiên, vì nó không thể đạt được từ bên trong Python và không thể được sử dụng lại, nó được coi là rác. Trong phiên bản hiện tại của Python, danh sách này không bao giờ được giải phóng. & Nbsp; & nbsp;garbage collection is simple: the garbage collector is called after a fixed time interval.
- Bộ sưu tập rác dựa trên sự kiện gọi người thu gom rác về sự kiện xảy ra. Ví dụ: khi người dùng thoát khỏi ứng dụng hoặc khi ứng dụng nhập vào trạng thái nhàn rỗi. & Nbsp; & nbsp;garbage collection calls the garbage collector on event occurrence. For example, when a user exits the application or when the application enters into idle
state.
Reference
- Tài liệu Python