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.

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 ra

Khi mã trên được thực thi, nó sẽ tạo ra kết quả sau -

3083401324 3083401324 3083401324
Point destroyed

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?

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 pt3
3

#!/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
4

    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.

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 pt3
8

#!/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
9
3083401324 3083401324 3083401324
Point destroyed
0
3083401324 3083401324 3083401324
Point destroyed
1

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.

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 destroyed
6
3083401324 3083401324 3083401324
Point destroyed
7
3083401324 3083401324 3083401324
Point destroyed
8
3083401324 3083401324 3083401324
Point destroyed
9

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 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.
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 destroyed
6
3083401324 3083401324 3083401324
Point destroyed
7
Garbage collection thresholds: (700, 10, 10) 
9
3083401324 3083401324 3083401324
Point destroyed
9

    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

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 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.

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 pt3
7

3083401324 3083401324 3083401324
Point destroyed
2
3083401324 3083401324 3083401324
Point destroyed
3

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 pt3
4

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
7

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 destroyed
2
3083401324 3083401324 3083401324
Point destroyed
3

  1. 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. 
  2. 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

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 ..