Hướng dẫn how does pythons garbage collector work? - công việc thu gom rác của trăn hoạt động như thế nào?
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. Show
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 <40> b = a # Increase ref. count of <40> c = [b] # Increase ref. count of <40> del a # Decrease ref. count of <40> b = 100 # Decrease ref. count of <40> c[0] = -1 # Decrease ref. count of <40> 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 raKhi 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
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;
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; PythonGiá 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; PythonGiá 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 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
#!/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.PythonGiá 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
#!/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 PythonGiá 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)
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 pt31Bở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. PythonGiá 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 Garbage collection thresholds: (700, 10, 10)9 3083401324 3083401324 3083401324 Point destroyed9
#!/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. PythonGiá 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;
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 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
#!/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
#!/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
Reference
Bao lâu thì rác Python thu thập?Bất cứ khi nào một số lượng tham chiếu giảm xuống 0, đối tượng sẽ được xóa ngay lập tức. 295 * Xử lý ngay lập tức 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ố lượng đối tượng hiện có.A full collection is triggered when the number of new objects is greater than 25% of the number of existing objects.
Làm thế nào để bạn kích hoạt một bộ sưu tập rác trong Python?Trình thu gom rác Python (GC) chạy trong quá trình thực hiện chương trình và được kích hoạt nếu số lượng tham chiếu giảm xuống 0.Số lượng tham chiếu tăng nếu một đối tượng được gán một tên mới hoặc được đặt trong một thùng chứa, như tuple hoặc từ điển.if the reference count reduces to zero. The reference count increases if an object is assigned a new name or is placed in a container, like tuple or dictionary.
Làm thế nào để người thu gom rác hoạt động khi nào nó được sử dụng?Miễn là một đối tượng đang được tham chiếu, JVM coi nó còn sống.Khi một đối tượng không còn được tham chiếu và do đó không thể truy cập được bởi mã ứng dụng, bộ thu gom rác sẽ xóa nó và lấy lại bộ nhớ không sử dụng.Once an object is no longer referenced and therefore is not reachable by the application code, the garbage collector removes it and reclaims the unused memory.
Làm thế nào để bạn kích hoạt một người thu gom rác?5 cách để buộc bộ sưu tập rác Java.. Hệ thống cuộc gọi.gc () .... Gọi RUNTIME.GetRuntime (). GC () Tùy chọn khác là sử dụng thời gian chạy..... Sử dụng JMAP để buộc GC.Tiện ích Bản đồ bộ nhớ Java (JMAP) có một phương pháp in biểu đồ của heap Java..... Dòng lệnh java gc với jcmd..... Sử dụng kiểm soát nhiệm vụ JConsole hoặc Java .. |