Gc coll không giải phóng bộ nhớ python

Thu gom rác hoặc GC là một kỹ thuật được sử dụng trong các ngôn ngữ lập trình để khôi phục bộ nhớ. Bộ sưu tập rác là một tính năng tích hợp sẵn trong các ngôn ngữ lập trình khác nhau như Python, C#, Java, v.v. Trong các ngôn ngữ lập trình khác như C và Cpp [C++], lập trình viên hoặc nhà phát triển cần cấp phát và hủy cấp phát bộ nhớ theo cách thủ công

Bộ sưu tập rác trong Python tự động quản lý bộ nhớ và cấp phát heap [Tham khảo tại đây]. Nói một cách đơn giản hơn, quá trình tự động xóa các đối tượng không mong muốn hoặc không sử dụng để giải phóng bộ nhớ được gọi là thu gom rác trong Python. Nó cũng giải phóng bộ nhớ chết và lấy lại khối bộ nhớ không còn được sử dụng để sử dụng tiếp

Trình thu gom rác trong Python bắt đầu chạy ngay khi chương trình bắt đầu thực thi. Bất cứ khi nào bộ đếm tham chiếu của đối tượng đạt đến 0, bộ thu gom rác được kích hoạt. Bộ đếm tham chiếu của đối tượng thay đổi khi số lượng bí danh của đối tượng [các tham chiếu khác của cùng một đối tượng] thay đổi

Có hai tình huống khi bộ đếm tham chiếu của một đối tượng tăng lên

  • Bất cứ khi nào một tên hoặc bí danh mới được gán cho một đối tượng, số lượng tham chiếu của nó sẽ tăng lên
  • Khi một đối tượng được chèn hoặc đặt vào các thùng chứa như danh sách, bộ dữ liệu hoặc từ điển, số lượng tham chiếu của đối tượng sẽ tăng lên

Mặt khác, bộ đếm tham chiếu của một đối tượng giảm khi đối tượng bị xóa [với del]. Bất cứ khi nào số lượng tham chiếu của một đối tượng đạt đến 0, trình thu gom rác trong Python sẽ tự động thu thập nó. Chúng ta cũng có thể nói rằng tham chiếu của đối tượng nằm ngoài phạm vi

Khi bộ đếm tham chiếu về 0, không có ai tham chiếu đến phiên bản đó của vị trí bộ nhớ. Vì vậy, các phiên bản bộ nhớ không còn được tham chiếu bởi một đối tượng được gọi là phiên bản mồ côi. Vì vậy, trình thu gom rác sẽ lấy lại phiên bản bộ nhớ đó để nó có thể được phân bổ cho các đối tượng khác trong tương lai

Trước khi xóa bất kỳ đối tượng nào, trình thông dịch Python gọi hàm hủy của một lớp gọi là __del__[]. Hàm hủy được gọi khi thể hiện của lớp [đối tượng] sắp bị hủy. Hàm hủy có thể được sử dụng để xóa mọi tài nguyên không phải bộ nhớ khác được sử dụng bởi các đối tượng

Chúng ta hãy lấy một ví dụ để hình dung bộ đếm [bộ đếm tham chiếu] tăng và giảm như thế nào

x = 35      # Create object x let's say 
b = x       # The reference count of  increases.
c = [b]     # The reference count of  again increases.
del x       # The reference count of  decreases.
c[0] = -1   # The reference count of  again decreases.

Tại sao chúng ta cần nó?

Mục đích chính của việc thu gom rác trong Python là giảm rò rỉ bộ nhớ. Trình thu gom rác cũng đảm bảo an toàn cho bộ nhớ. Khi làm như vậy, trình thu gom rác che giấu sự phức tạp cơ bản của việc cấp phát bộ nhớ, hủy cấp phát và con trỏ thô [vị trí bộ nhớ]

Trình thu gom rác có thể được coi là tương tự như trình quản lý bộ nhớ của hệ điều hành. Nó theo dõi bộ nhớ được phân bổ, hủy phân bổ và không sử dụng. Với tính năng thu gom rác trong Python, lập trình viên không cần lo lắng về việc xóa một đối tượng để giải phóng bộ nhớ khi không còn sử dụng nữa

Để hiểu rõ hơn về sự cần thiết của trình thu gom rác, hãy cho chúng tôi hiểu vấn đề mà chúng tôi có thể gặp phải nếu chúng tôi không sử dụng trình thu gom rác trong Python

  1. Quên giải phóng bộ nhớ được gán. Một biến hoặc một đối tượng có được một số bộ nhớ. Khi việc sử dụng đối tượng hoàn tất và chúng ta quên giải phóng bộ nhớ đã thu được thì có thể dẫn đến rò rỉ bộ nhớ. Rò rỉ bộ nhớ có thể khiến chương trình của chúng tôi thu được nhiều bộ nhớ hơn yêu cầu thông thường theo thời gian. Nếu chương trình của chúng tôi là một chương trình dài hạn, thì đó là một mối quan tâm lớn. Nếu chúng ta có bộ thu gom rác thì nó sẽ theo dõi bộ nhớ không sử dụng đó và quản lý nó cho phù hợp
  2. Giải phóng bộ nhớ trong giai đoạn đầu. Một loại vấn đề khác có thể phát sinh là nếu chúng tôi đã giải phóng bộ nhớ trong khi nó vẫn đang được sử dụng. Vì vậy, khi chương trình của chúng tôi cố gắng truy cập một giá trị nhất định trong bộ nhớ không còn tồn tại, thì nó có thể làm hỏng dữ liệu của chúng tôi

Vì vậy, để giải phóng bộ nhớ và để đảm bảo an toàn cho bộ nhớ, chúng ta cần một thuật toán có tên là thu gom rác trong Python chạy song song khi một chương trình được thực thi

Tham khảo các phần sau để tìm hiểu thêm về các cách khác nhau để triển khai thu gom rác trong Python

Làm thế nào Python thực hiện thu gom rác?

Python sử dụng hai chiến lược để triển khai thu gom rác. Cái đầu tiên là Đếm tham chiếu và cái còn lại là Bộ sưu tập rác thế hệ

Như chúng ta đã thảo luận bất cứ khi nào số lượng tham chiếu của một đối tượng bằng 0, nó sẽ được giải phóng bởi bộ thu gom rác. Trước khi giới thiệu Python 2. 0, trình thông dịch Python chỉ sử dụng bộ đếm tham chiếu để duy trì quản lý bộ nhớ. Chương trình của chúng tôi không thể tắt tính năng tham chiếu này vì nó hoạt động ở chế độ nền cho mọi chương trình

Chúng ta có thể sử dụng module sys của Python để kiểm tra số tham chiếu của một đối tượng nào đó. Mô-đun sys có một phương thức gọi là getrefcount[], được sử dụng để xem số lượng tham chiếu của một đối tượng nhất định

Ví dụ

import sys

x = "scaler topics"

print[sys.getrefcount[x]]

y = x       # increment in the reference counter

print[sys.getrefcount[x]]

đầu ra

Ngoài bộ đếm tham chiếu, Python sử dụng một chiến lược thu gom rác khác có tên là Trình thu gom rác thế hệ

Trong trường hợp bộ đếm tham chiếu, khi chúng ta cố gắng thêm một đối tượng vào chính nó, nó sẽ dẫn đến chu kỳ tham chiếu theo chu kỳ hoặc tham chiếu [một đối tượng tham chiếu đến chính nó]. Vì vậy, bộ đếm tham chiếu không thể phá hủy đối tượng vì bộ đếm tham chiếu của đối tượng không bao giờ có thể đạt tới 0 [do chu kỳ]. Vì vậy, Công cụ thu gom rác thế hệ đã xuất hiện

Trình thu gom rác thế hệ được tìm thấy trong mô-đun gc của thư viện chuẩn, hoạt động như một trình thu gom rác dựa trên dấu vết. Bất cứ khi nào có một chu kỳ tham chiếu, thực thể hoặc đối tượng không có số lượng tham chiếu bằng 0 vì nó có tham chiếu đến chính nó. Trình thu gom rác thế hệ chạy và giải phóng bộ nhớ bị chiếm dụng

Tham khảo các phần sau để biết thêm chi tiết về Bộ thu gom rác thế hệ với các ví dụ khác nhau

Các cách để làm cho một đối tượng đủ điều kiện để thu gom rác

Ta có thể xóa đối tượng khỏi bộ nhớ hoặc gán giá trị NULL, i. e. Không, cho đối tượng để làm cho nó đủ điều kiện thu gom rác

Hãy để chúng tôi lấy một ví dụ để hiểu cả hai bối cảnh

Ví dụ [sử dụng del]

import sys

numbers = []
numbers.append[1]
numbers.append[2]
numbers.append[3]
numbers.append[4]
numbers.append[5]

print[sys.getrefcount[numbers]]

y = numbers

print[sys.getrefcount[numbers]]

del numbers

print[sys.getrefcount[numbers]]     # raises error

đầu ra

2
3
Traceback [most recent call last]:
  File "d:\test.py", line 18, in 
    print[sys.getrefcount[numbers]]
NameError: name 'numbers' is not defined

Trong ví dụ trên, trước tiên chúng tôi đã tăng số lượng tham chiếu của các số bằng cách tham chiếu nó với y. Vì vậy, đầu tiên, số tham chiếu là 2 và sau đó là 3. Sau đó, khi chúng tôi sử dụng del, các số đã bị xóa và khi chúng tôi cố gắng truy cập các số, chúng tôi gặp lỗi

Ví dụ [sử dụng Không có]

import sys

numbers = []
numbers.append[1]
numbers.append[2]
numbers.append[3]
numbers.append[4]
numbers.append[5]

print[sys.getrefcount[numbers]]

y = numbers

print[sys.getrefcount[numbers]]

numbers = None

print[sys.getrefcount[numbers]]

Đầu ra [lần chạy đầu tiên]

Đầu ra [lần chạy thứ hai]

Như chúng ta có thể thấy rằng hai số tham chiếu đầu tiên giống như ví dụ trước, nhưng khi chúng ta có các số tham chiếu bằng Không, số tham chiếu của nó trở thành một giá trị rác [thay đổi sau mỗi lần chạy]. trong trường hợp này, số danh sách không bao giờ được giải phóng

Tham khảo ví dụ cung cấp bên dưới để hình dung rõ hơn

Bộ sưu tập rác hoạt động như thế nào trong Python?

Trong Python, chúng tôi có bộ đếm tham chiếu và bộ sưu tập rác nói chung hoạt động cùng nhau

Như chúng ta đã thảo luận bất cứ khi nào số lượng tham chiếu của một đối tượng bằng 0, nó sẽ được giải phóng bởi bộ thu gom rác. Chương trình của chúng tôi không thể tắt tính năng tham chiếu này vì nó hoạt động ở chế độ nền cho mọi chương trình

a. Thu gom rác thế hệ

Trong trường hợp bộ đếm tham chiếu, khi chúng ta cố gắng thêm một đối tượng vào chính nó, một tham chiếu theo chu kỳ hoặc chu kỳ tham chiếu được tạo ra. Vì vậy, bộ đếm tham chiếu không thể phá hủy đối tượng vì bộ đếm tham chiếu của đối tượng không bao giờ có thể đạt tới 0 [do chu kỳ]. Vì vậy, chúng tôi sử dụng trình thu gom rác chung trong các tình huống như vậy. Nó chạy và giải phóng bộ nhớ bị chiếm dụng. Trình thu gom rác thế hệ được tìm thấy trong mô-đun gc của thư viện chuẩn

1. Thu gom rác tự động theo chu kỳ

Trình thông dịch Python lên lịch thu gom rác vì khám phá chu trình tham chiếu là công việc tính toán. Để lập lịch trình thu gom rác, trình thông dịch Python phát hiện ngưỡng cấp phát và hủy cấp phát bộ nhớ của đối tượng

Trình thu gom rác được gọi hoặc chạy khi chênh lệch giữa số lần phân bổ và số lần hủy phân bổ lớn hơn số ngưỡng được phát hiện. Chúng ta có thể kiểm tra ngưỡng của các đối tượng mới được tạo bằng cách sử dụng hàm get_threshold[] được xác định trước của mô-đun gc

Ví dụ

import gc

print[gc.get_threshold[]]

đầu ra

Như chúng ta có thể thấy rằng ngưỡng mặc định của hệ thống là 700700700, do đó, bất cứ khi nào chênh lệch giữa số lượng phân bổ và số lượng hủy phân bổ lớn hơn 700, trình thu gom rác sẽ chạy. Khi số lượng phân bổ trừ đi số lượng thỏa thuận vượt quá 700 [i. e. ngưỡng-0], bộ sưu tập bắt đầu. Ban đầu, chỉ thế hệ-0 được kiểm tra. Nếu thế hệ-0 đã được kiểm tra nhiều hơn ngưỡng-1 [i. e. 10] lần kể từ khi thế hệ 1 được kiểm tra, thì thế hệ 1 cũng được kiểm tra. Tương tự, đối với thế hệ tiếp theo [liên quan đến ngưỡng-2]

2. Thu gom rác thủ công

Ngoài bộ sưu tập rác tự động chạy khi đạt đến ngưỡng, chúng ta cũng có thể gọi bộ sưu tập rác bằng Python theo cách thủ công. Chúng ta có thể sử dụng phương thức coll[] của mô-đun gc để lấy số lượng đối tượng được bộ thu gom rác thu thập và phân bổ lại

Tham khảo ví dụ cụ thể dưới đây để hiểu rõ hơn

Ví dụ

import gc


collected_objects = gc.collect[]

print[collected_objects]

đầu ra

Chúng ta có thể lên lịch thu gom rác theo cách thủ công theo hai cách

  1. Gọi dựa trên thời gian. Chúng tôi có thể lên lịch trình thu gom rác để chạy trong một khoảng thời gian cụ thể
  2. Gọi dựa trên sự kiện. Chúng ta cũng có thể lên lịch trình thu gom rác để chạy tại một sự kiện cụ thể, chẳng hạn như khi người dùng đăng xuất, khi cơ sở dữ liệu bị thay đổi, v.v. , tùy thuộc vào cách sử dụng

3. Thu gom rác cưỡng bức

Trong thực tế, có thể có những tình huống khi người dùng muốn chạy trình thu gom rác để quản lý bộ nhớ hoặc giải phóng một số dung lượng không sử dụng. Vì vậy, bộ thu gom rác trong Python cho phép người dùng gọi bộ thu gom rác một cách rõ ràng bằng mô-đun gc

Hãy để chúng tôi lấy một ví dụ trong đó chúng tôi sẽ tạo một chu trình tham chiếu và sau đó xóa đối tượng theo cách thủ công để kiểm tra bộ đếm do gc thu thập. chức năng thu thập []

import gc

collected_objects = gc.collect[]

print[collected_objects]

x = {}

for i in range[5]:
    x[i+i] = x

del x

collected_objects = gc.collect[]

print[collected_objects]

đầu ra

4. Vô hiệu hóa bộ sưu tập rác

Nếu chúng tôi chắc chắn rằng chúng tôi đã quản lý đúng cách cấp phát và hủy cấp phát bộ nhớ và chương trình của chúng tôi cũng sẽ không tạo bất kỳ chu kỳ tham chiếu nào, thì chúng tôi có thể tắt trình thu gom rác cho chương trình cụ thể

Để vô hiệu hóa trình thu gom rác, chúng ta có thể gọi phương thức disable[] của mô-đun gc

Ví dụ

________số 8

đầu ra

b. Đếm tham chiếu

Như chúng ta đã thảo luận trước đó, trình thông dịch Python sử dụng phép đếm tham chiếu để kiểm tra xem có nên xóa một đối tượng hay không. Bất cứ khi nào bộ đếm tham chiếu của đối tượng đạt đến 0, bộ thu gom rác được kích hoạt. Bộ đếm tham chiếu của đối tượng thay đổi khi số lượng bí danh của đối tượng [các tham chiếu khác của cùng một đối tượng] thay đổi

Bất cứ khi nào một tên hoặc bí danh mới được gán cho một đối tượng, số lượng tham chiếu của nó sẽ tăng lên. Hoặc, khi một đối tượng được chèn hoặc đặt vào các vùng chứa như danh sách, bộ dữ liệu hoặc từ điển, số lượng tham chiếu của đối tượng sẽ tăng lên

Tham khảo hình ảnh bên dưới để rõ hơn

Bộ đếm tham chiếu của đối tượng giảm khi đối tượng bị xóa. Bất cứ khi nào số lượng tham chiếu của một đối tượng đạt đến 0, sẽ không có ai tham chiếu đến trường hợp đó của vị trí bộ nhớ. Vì vậy, những trường hợp như vậy của bộ nhớ không còn được tham chiếu. Do đó, trình thu gom rác trong Python sẽ tự động thu thập nó

Chu kỳ tham chiếu Một chu kỳ tham chiếu là một kịch bản trong đó một đối tượng không còn được sử dụng không thể bị xóa bởi bộ sưu tập rác trong Python vì bộ đếm tham chiếu không thể đạt tới 0. Vì vậy, khi một đối tượng quy chiếu đến chính nó, nó sẽ dẫn đến quy chiếu theo chu kỳ hay quy chiếu theo chu kỳ

Hãy để chúng tôi lấy một ví dụ để hiểu bối cảnh tốt hơn

import gc


def cycle[]:
    x = {}
    x[i+1] = x


collected_object = gc.collect[]
print[collected_object]

# creating the cycles
for i in range[5]:
    cycle[]


collected_object = gc.collect[]
print[collected_object]

đầu ra

Giao diện thu gom rác

Chúng ta có thể sử dụng mô-đun gc của thư viện chuẩn để tương tác với giao diện của trình thu gom rác. Nó cung cấp nhiều phương thức khác nhau để chúng ta có thể thực hiện một số hành động như vô hiệu hóa trình thu gom rác, lấy số lượng bộ sưu tập, gỡ lỗi bộ nhớ bị rò rỉ của chương trình, v.v.

Chúng ta hãy xem xét một số phương thức quan trọng nhất của mô-đun gc

  • gc. vô hiệu hóa[]. Nó được sử dụng để vô hiệu hóa trình thu gom rác của Python
  • gc. cho phép[]. Nó được sử dụng để kích hoạt trình thu gom rác của Python
  • gc. được kích hoạt[]. Nó được sử dụng để phát hiện xem bộ thu gom rác có được bật hay không. Nó trả về Đúng hoặc Sai
  • gc. get_count[]. Nó được sử dụng để lấy số lượng bộ sưu tập hiện tại
  • gc. get_threshold[]. Nó được sử dụng để lấy bộ sưu tập ngưỡng hiện tại

Bạn có thể tham khảo tài liệu chính thức của ngôn ngữ lập trình Python để lấy danh sách tất cả các chức năng của mô-đun gc

Tương tác với Python Garbage Collector

Hãy để chúng tôi mã hóa một ví dụ trong đó chúng tôi sẽ tạo các chu trình tham chiếu và sau đó hủy đối tượng tham chiếu vòng đó bằng các phương thức khác nhau của mô-đun gc

Ví dụ

import sys

x = "scaler topics"

print[sys.getrefcount[x]]

y = x       # increment in the reference counter

print[sys.getrefcount[x]]
0

đầu ra

import sys

x = "scaler topics"

print[sys.getrefcount[x]]

y = x       # increment in the reference counter

print[sys.getrefcount[x]]
1

Ưu điểm và nhược điểm

Hãy để chúng tôi tìm hiểu một số ưu điểm và nhược điểm liên quan đến việc thu gom rác trong Python

Thuận lợi

  • Nhà phát triển không cần lo lắng về việc phân bổ lại bộ nhớ của các đối tượng không sử dụng vì trình thu gom rác đang chạy trong nền
  • Bộ sưu tập rác cứu chúng tôi khỏi các lỗi như sự cố con trỏ lơ lửng Tham khảo tại đây
  • Có rất nhiều giảm rò rỉ bộ nhớ do sự hiện diện của bộ sưu tập rác trong Python
  • Bộ sưu tập rác trong Python cũng cung cấp sự an toàn cho bộ nhớ

Nhược điểm. Nhược điểm chính của việc sử dụng bộ sưu tập rác là hiệu suất bị cản trở. Bộ sưu tập rác trong Python là một quy trình bổ sung đang chạy trong nền, do đó, nó là một chi phí hoạt động và do đó ảnh hưởng đến hiệu suất

GC có thu thập [] xóa bộ nhớ không?

del và gc. collect[] là các phương thức có sẵn để xóa bộ nhớ trong python .

Python có tự động giải phóng bộ nhớ không?

Lập trình viên phải cấp phát bộ nhớ theo cách thủ công trước khi chương trình có thể sử dụng bộ nhớ và giải phóng bộ nhớ khi chương trình không cần đến bộ nhớ đó nữa. Trong Python, quản lý bộ nhớ là tự động. Python tự động xử lý việc cấp phát và hủy cấp phát bộ nhớ .

GC thu thập[] trả về cái gì?

Buộc thu gom rác . Trong trường hợp này, giá trị là 6 vì có 3 đối tượng có từ điển thuộc tính thể hiện của chúng. the number of “unreachable” objects it found. In this case, the value is 6 because there are 3 objects with their instance attribute dictionaries.

Tôi có nên gọi GC thu thập Python không?

Bạn không nên gọi nó . Trình thu gom rác chỉ được sử dụng để xóa các tham chiếu vòng không được giải phóng bởi cơ chế đếm tham chiếu. Nó sẽ không khắc phục được sự cố hết bộ nhớ của bạn; . Lưu câu trả lời này.

Chủ Đề