Hướng dẫn python gc collect not working - python gc thu thập không hoạt động

Xem xét kịch bản sau:

l = [i for i in range(int(1e8))]
l = []
import gc
gc.collect()
# 0
gc.get_referrers(l)
# [{'__builtins__': , 'l': [], '__package__': None, 'i': 99999999, 'gc': , '__name__': '__main__', '__doc__': None}]
del l
gc.collect()
# 0

Vấn đề là, sau tất cả các bước này, việc sử dụng bộ nhớ của quy trình Python này là khoảng 30 % trên máy của tôi (Python 2.6.5, bất kỳ chi tiết nào theo yêu cầu?). Đây là một đoạn trích của đầu ra của Top:

 PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND  
5478 moooeeeep 20   0 2397m 2.3g 3428 S    0 29.8   0:09.15 ipython  

resp.

 PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND  
5478 moooeeeep 20   0 2397m 2.3g 3428 S    0 29.8   0:09.15 ipython  
1:

moooeeeep 5478  1.0 29.7 2454720 2413516 pts/2 S+   12:39   0:09 /usr/bin/python /usr/bin/ipython gctest.py

Theo các tài liệu cho

 PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND  
5478 moooeeeep 20   0 2397m 2.3g 3428 S    0 29.8   0:09.15 ipython  
2:

Không phải tất cả các mục trong một số danh sách miễn phí có thể được giải phóng do thực hiện cụ thể, đặc biệt là

 PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND  
5478 moooeeeep 20   0 2397m 2.3g 3428 S    0 29.8   0:09.15 ipython  
3 và
 PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND  
5478 moooeeeep 20   0 2397m 2.3g 3428 S    0 29.8   0:09.15 ipython  
4.

Điều này có nghĩa là, nếu tôi (tạm thời) cần một số lượng lớn các số

 PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND  
5478 moooeeeep 20   0 2397m 2.3g 3428 S    0 29.8   0:09.15 ipython  
3 hoặc
 PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND  
5478 moooeeeep 20   0 2397m 2.3g 3428 S    0 29.8   0:09.15 ipython  
4 khác nhau, tôi cần xuất nó sang C/C ++ vì Python GC không thể giải phóng bộ nhớ?


Cập nhật

Có lẽ người phiên dịch là để đổ lỗi, như bài viết này cho thấy:

Nó có thể tạo ra 5 triệu số nguyên đồng thời và mỗi đối tượng INT tiêu thụ 12 byte. Đối với tốc độ, Python duy trì một danh sách miễn phí nội bộ cho các đối tượng số nguyên. Thật không may, danh sách miễn phí đó là cả bất tử và không giới hạn về kích thước. Phao cũng sử dụng một danh sách miễn phí bất tử và không bị ràng buộc.

Tuy nhiên, vấn đề vẫn còn, vì tôi không thể tránh được lượng dữ liệu này (các cặp dấu thời gian/giá trị từ một nguồn bên ngoài). Tôi có thực sự buộc phải thả Python và quay lại C/C ++ không?


Cập nhật 2

Có lẽ đó thực sự là trường hợp, việc triển khai Python gây ra vấn đề. Tìm thấy câu trả lời này giải thích một cách thuyết phục vấn đề và một cách giải quyết có thể.

Python là một trong những ngôn ngữ lập trình phổ biến nhất và việc sử dụng nó tiếp tục phát triển. Nó xếp thứ ba trong & nbsp; Tiobe ngôn ngữ của năm & nbsp; vào năm 2021 do tốc độ tăng trưởng của nó. Python Dễ sử dụng và cộng đồng lớn đã khiến nó trở nên phù hợp phổ biến để phân tích dữ liệu, ứng dụng web và tự động hóa nhiệm vụ.

Trong bài đăng này, chúng tôi sẽ trình bày các chi tiết về bộ sưu tập rác ở Python. Đầu tiên, chúng tôi sẽ xem xét những điều cơ bản về quản lý bộ nhớ và lý do tại sao chúng tôi cần thu gom rác. Sau đó, chúng tôi sẽ xem xét cách Python thực hiện bộ sưu tập rác. Cuối cùng, chúng tôi sẽ xem xét thực tế về cách bạn nên nghĩ về bộ sưu tập rác khi viết các ứng dụng Python của bạn.


Hướng dẫn python gc collect not working - python gc thu thập không hoạt động


Bộ sưu tập rác Python là gì và tại sao chúng ta cần nó?

Nếu & nbsp; Python là ngôn ngữ lập trình đầu tiên của bạn, toàn bộ ý tưởng về bộ sưu tập rác có thể là xa lạ với bạn. Hãy bắt đầu với những điều cơ bản.

Quản lý bộ nhớ

Một ngôn ngữ lập trình sử dụng các đối tượng trong các chương trình của mình để thực hiện các hoạt động. Các đối tượng bao gồm các biến đơn giản, như chuỗi, số nguyên hoặc booleans. Chúng cũng bao gồm các cấu trúc dữ liệu phức tạp hơn như danh sách, băm hoặc các lớp.

Các giá trị của các đối tượng chương trình của bạn được lưu trữ trong bộ nhớ để truy cập nhanh. Trong nhiều ngôn ngữ lập trình, một biến trong mã chương trình của bạn chỉ đơn giản là một con trỏ đến địa chỉ của đối tượng trong bộ nhớ. Khi một biến được sử dụng trong một chương trình, quá trình sẽ đọc giá trị từ bộ nhớ và hoạt động trên nó.

Trong các ngôn ngữ lập trình sớm, hầu hết các nhà phát triển đều chịu trách nhiệm quản lý bộ nhớ trong các chương trình của họ. Điều này có nghĩa là trước khi tạo một danh sách hoặc một đối tượng, trước tiên bạn cần phân bổ bộ nhớ cho biến của bạn. Sau khi bạn đã hoàn thành biến của mình, sau đó bạn cần phải phân loại nó thành bộ nhớ miễn phí đó cho người dùng khác.

Điều này dẫn đến hai vấn đề:

  1. Quên giải phóng bộ nhớ của bạn. Nếu bạn không giải phóng bộ nhớ của mình khi bạn sử dụng xong, nó có thể dẫn đến rò rỉ bộ nhớ. Điều này có thể dẫn đến chương trình của bạn bằng cách sử dụng quá nhiều bộ nhớ theo thời gian. Đối với các ứng dụng chạy dài, điều này có thể gây ra vấn đề nghiêm trọng.. If you don’t free your memory when you’re done using it, it can result in memory leaks. This can lead to your program using too much memory over time. For long-running applications, this can cause serious problems.
  2. Giải phóng trí nhớ của bạn quá sớm. Loại vấn đề thứ hai bao gồm giải phóng bộ nhớ của bạn trong khi nó vẫn còn được sử dụng. Điều này có thể khiến chương trình của bạn bị sập nếu nó cố gắng truy cập một giá trị trong bộ nhớ không tồn tại hoặc nó có thể làm hỏng dữ liệu của bạn. Một biến đề cập đến bộ nhớ đã được giải phóng được gọi là con trỏ lơ lửng.. The second type of problem consists of freeing your memory while it’s still in use. This can cause your program to crash if it tries to access a value in memory that doesn’t exist, or it can corrupt your data. A variable that refers to memory that has been freed is called a dangling pointer.

Những vấn đề này là không mong muốn, và SO & NBSP; Ngôn ngữ mới hơn & NBSP; đã thêm quản lý bộ nhớ tự động.

Hướng dẫn python gc collect not working - python gc thu thập không hoạt động

Quản lý bộ nhớ tự động và Bộ sưu tập rác

Với quản lý bộ nhớ tự động, các lập trình viên không còn cần thiết để tự quản lý bộ nhớ. Thay vào đó, thời gian chạy xử lý điều này cho họ.

Có một vài phương pháp khác nhau để quản lý bộ nhớ tự động. Những người phổ biến sử dụng đếm tham chiếu. Với việc đếm tham chiếu, thời gian chạy theo dõi tất cả các tham chiếu đến một đối tượng. Khi một đối tượng không có tham chiếu đến nó, nó không thể sử dụng được bởi mã chương trình và có thể bị xóa.

Đối với các lập trình viên, quản lý bộ nhớ tự động bổ sung một số lợi ích. & NBSP; Nó nhanh hơn để phát triển các chương trình mà không cần suy nghĩ về chi tiết bộ nhớ cấp thấp. Hơn nữa, nó có thể giúp tránh rò rỉ bộ nhớ tốn kém hoặc những con trỏ lủng lẳng nguy hiểm.

Tuy nhiên, quản lý bộ nhớ tự động có chi phí. Chương trình của bạn sẽ cần sử dụng bộ nhớ và tính toán bổ sung để theo dõi tất cả các tài liệu tham khảo của nó. Hơn nữa, nhiều ngôn ngữ lập trình với quản lý bộ nhớ tự động sử dụng quy trình dừng thế giới của người dùng để thu thập rác trong đó tất cả các điểm dừng thực thi trong khi trình thu thập rác tìm kiếm và xóa các đối tượng sẽ được thu thập.

Với những tiến bộ trong xử lý máy tính từ & nbsp; Luật Moore & NBSP; và số lượng RAM lớn hơn trong các máy tính mới hơn, lợi ích của việc quản lý bộ nhớ tự động thường vượt trội hơn & NBSP; Do đó, hầu hết các ngôn ngữ lập trình hiện đại như Java, Python và Golang sử dụng quản lý bộ nhớ tự động.

Đối với các ứng dụng chạy dài trong đó & nbsp; Hiệu suất & nbsp; là rất quan trọng, một số ngôn ngữ vẫn có quản lý bộ nhớ thủ công. Ví dụ kinh điển về điều này là C ++. Chúng tôi cũng thấy quản lý bộ nhớ thủ công trong & nbsp; Objective-C, ngôn ngữ được sử dụng cho macOS và iOS. Đối với các ngôn ngữ mới hơn, & nbsp; Rust & nbsp; sử dụng quản lý bộ nhớ thủ công.

Bây giờ chúng ta đã biết về quản lý bộ nhớ và thu gom rác nói chung, hãy để Lừa nhận được cụ thể hơn về cách thức hoạt động của bộ sưu tập rác Python.

Hãy thử Stackify Code Profiler miễn phí, tiền tố, để viết mã tốt hơn trên máy trạm của bạn. Tiền tố hoạt động với .NET, Java, PHP, Node.js, Ruby và Python.

Cách Python thực hiện bộ sưu tập rác

Trong phần này, chúng tôi sẽ đề cập đến cách bộ sưu tập rác hoạt động trong Python.

Phần này giả định rằng bạn đang sử dụng việc triển khai Python & NBSP; CPython. CPython là triển khai được sử dụng rộng rãi nhất. Tuy nhiên, có các triển khai khác của Python, chẳng hạn như & nbsp; pypy, & nbsp; jython & nbsp; (dựa trên java), hoặc & nbsp; Ironpython & nbsp; (C#dựa trên).

Để xem bạn sử dụng python nào, hãy chạy lệnh sau trong thiết bị đầu cuối của bạn (Linux):

>>>python -c 'import platform; print(platform.python_implementation())'

Or, you can have these lines for both Linux and Windows terminals.
>>> import platform
>>> print(platform.python_implementation())
CPython

Có hai khía cạnh để quản lý bộ nhớ và thu gom rác trong CPython:

  • Đếm tham chiếu
  • Bộ sưu tập rác thế hệ

Hãy cùng khám phá từng điều này dưới đây. & NBSP;

Hướng dẫn python gc collect not working - python gc thu thập không hoạt động

Đếm tham chiếu trong cpython

Cơ chế thu gom rác chính trong CPython là thông qua & NBSP; số lượng tham chiếu. Bất cứ khi nào bạn tạo một đối tượng trong Python, đối tượng C bên dưới có cả loại python (như danh sách, dict hoặc chức năng) và số lượng tham chiếu.

Ở mức độ rất cơ bản, số lượng tham chiếu của đối tượng Python được tăng lên bất cứ khi nào đối tượng được tham chiếu và nó đã giảm khi một đối tượng được lưu ý. Nếu số lượng tham chiếu của đối tượng là 0, bộ nhớ cho đối tượng được giải quyết.

Mã chương trình của bạn có thể vô hiệu hóa việc đếm tham chiếu Python. Điều này trái ngược với bộ sưu tập rác thế hệ được thảo luận dưới đây.

Một số người tuyên bố & NBSP; Đếm tài liệu tham khảo là một người thu gom rác của người đàn ông nghèo. Nó có một số nhược điểm, bao gồm không có khả năng phát hiện các tài liệu tham khảo theo chu kỳ như được thảo luận dưới đây. Tuy nhiên, đếm tham chiếu là tốt vì & nbsp; bạn có thể xóa ngay một đối tượng khi nó không có tài liệu tham khảo.

Xem số lượng tham chiếu trong Python

Bạn có thể sử dụng mô -đun & nbsp; sys & nbsp; từ thư viện tiêu chuẩn Python để kiểm tra số lượng tham chiếu cho một đối tượng cụ thể. Có một vài cách để tăng số lượng tham chiếu cho một đối tượng, chẳng hạn như & nbsp;

  • Gán một đối tượng cho một biến.
  • Thêm một đối tượng vào cấu trúc dữ liệu, chẳng hạn như nối vào danh sách hoặc thêm dưới dạng thuộc tính trên thể hiện lớp.
  • Chuyển đối tượng như một đối số cho một hàm.

Hãy để sử dụng một python replet và mô -đun SYS để xem cách xử lý số lượng tham chiếu được xử lý.

Đầu tiên, trong thiết bị đầu cuối của bạn, loại & nbsp; python & nbsp; để nhập vào một python replin.python to enter into a Python REPL.

Thứ hai, nhập mô -đun SYS vào bản sao của bạn. Sau đó, tạo một biến và kiểm tra số lượng tham chiếu của nó:

>>> import sys
>>> a = 'my-string'
>>> sys.getrefcount(a)
2

Lưu ý rằng có hai tham chiếu đến biến của chúng tôi & nbsp; a. Một là từ việc tạo biến. Thứ hai là khi chúng tôi vượt qua biến & nbsp; a & nbsp; cho & nbsp; sys.getrefcount () & nbsp; function.a. One is from creating the variable. The second is when we pass the variable a to the sys.getrefcount() function.

Nếu bạn thêm biến vào cấu trúc dữ liệu, chẳng hạn như danh sách hoặc từ điển, bạn sẽ thấy việc tăng số lượng tham chiếu:

>>> import sys
>>> a = 'my-string'
>>> b = [a] # Make a list with a as an element.
>>> c = { 'key': a } # Create a dictionary with a as one of the values.
>>> sys.getrefcount(a)
4

Như được hiển thị ở trên, số lượng tham chiếu của & nbsp; a & nbsp; tăng khi thêm vào danh sách hoặc từ điển.a increases when added to a list or a dictionary.

Trong phần tiếp theo, chúng tôi sẽ tìm hiểu về bộ thu gom rác thế hệ, đây là công cụ thứ hai mà Python sử dụng để quản lý bộ nhớ.

Bộ sưu tập rác thế hệ

Ngoài chiến lược đếm tham chiếu để quản lý bộ nhớ, Python cũng sử dụng một phương thức gọi là bộ thu gom rác thế hệ.

Cách dễ nhất để hiểu lý do tại sao chúng ta cần một người thu gom rác thế hệ là ví dụ.

Trong phần trước, chúng tôi đã thấy rằng việc thêm một đối tượng vào một mảng hoặc đối tượng đã tăng số lượng tham chiếu của nó. Nhưng điều gì xảy ra nếu bạn thêm một đối tượng vào chính nó?

>>> class MyClass(object):
...     pass
...
>>> a = MyClass()
>>> a.obj = a
>>> del a

Trong ví dụ trên, chúng tôi đã xác định một lớp mới. Sau đó, chúng tôi đã tạo một thể hiện của lớp và gán thể hiện là một thuộc tính trên chính nó. Cuối cùng, chúng tôi đã xóa trường hợp.

Bằng cách xóa thể hiện, nó không còn có thể truy cập được trong chương trình Python của chúng tôi. Tuy nhiên, Python đã không phá hủy trường hợp từ bộ nhớ. Ví dụ không có số lượng tham chiếu bằng 0 vì nó có một tham chiếu đến chính nó.

Chúng tôi gọi loại vấn đề này là một chu kỳ tham chiếu và bạn có thể giải quyết nó bằng cách đếm tham chiếu. Đây là điểm của bộ thu gom rác thế hệ, có thể truy cập bằng mô -đun & nbsp; GC & nbsp; trong thư viện tiêu chuẩn.

Thuật ngữ thu gom rác thế hệ

Có hai khái niệm chính để hiểu với người thu gom rác thế hệ.

  1. Khái niệm đầu tiên là của một thế hệ.
  2. Khái niệm quan trọng thứ hai là ngưỡng. & NBSP;

Trình thu gom rác đang theo dõi tất cả các đối tượng trong bộ nhớ. Một vật thể mới bắt đầu cuộc sống của nó trong thế hệ đầu tiên của người thu gom rác. Nếu Python thực hiện quy trình thu gom rác trên một thế hệ và một đối tượng tồn tại, nó sẽ chuyển sang thế hệ thứ hai, cũ. Bộ sưu tập rác Python có tổng cộng ba thế hệ và một đối tượng chuyển sang một thế hệ cũ bất cứ khi nào nó tồn tại trong quá trình thu thập rác trên thế hệ hiện tại của nó.

Đối với mỗi thế hệ, mô -đun thu gom rác có số lượng đối tượng ngưỡng. Nếu số lượng đối tượng vượt quá ngưỡng đó, Trình thu gom rác sẽ kích hoạt quá trình thu thập. Đối với bất kỳ đối tượng nào tồn tại trong quá trình đó, họ đã chuyển sang một thế hệ cũ.

Không giống như cơ chế đếm tham chiếu, bạn có thể thay đổi hành vi của người thu gom rác thế hệ trong chương trình Python của bạn. Điều này bao gồm thay đổi các ngưỡng để kích hoạt quy trình thu gom rác trong mã của bạn. Ngoài ra, bạn có thể kích hoạt thủ công quy trình thu gom rác hoặc vô hiệu hóa quá trình thu gom rác hoàn toàn.

Hãy để xem cách bạn có thể sử dụng mô -đun GC để kiểm tra số liệu thống kê thu thập rác hoặc thay đổi hành vi của người thu gom rác.

Sử dụng mô -đun GC

Trong thiết bị đầu cuối của bạn, Enter & nbsp; Python & nbsp; để rơi vào một python replin.python to drop into a Python REPL.

Nhập mô -đun & nbsp; gc & nbsp; vào phiên của bạn. Sau đó, bạn có thể kiểm tra các ngưỡng được định cấu hình của người thu gom rác của bạn với & nbsp; get_threshold () & nbsp; phương thức:gc module into your session. You can then check the configured thresholds of your garbage collector with the get_threshold() method:

>>> import gc
>>> gc.get_threshold()
(700, 10, 10)

Theo mặc định, Python có ngưỡng 700 cho thế hệ trẻ nhất và 10 cho mỗi thế hệ cũ.

Bạn có thể kiểm tra số lượng đối tượng trong mỗi thế hệ của bạn với & nbsp; get_count () & nbsp; phương thức:get_count() method:

>>> import gc
>>> gc.get_count()
(596, 2, 1)

Trong ví dụ này, chúng tôi có 596 đối tượng trong thế hệ trẻ nhất của chúng tôi, hai đối tượng trong thế hệ tiếp theo và một đối tượng trong thế hệ lâu đời nhất.

Như bạn có thể thấy, Python tạo ra một số đối tượng theo mặc định trước khi bạn bắt đầu thực hiện chương trình của mình. Bạn có thể kích hoạt quy trình thu thập rác thủ công bằng cách sử dụng & nbsp; gc.Collect () & nbsp; phương thức:gc.collect() method:

>>> gc.get_count()
(595, 2, 1)
>>> gc.collect()
577
>>> gc.get_count()
(18, 0, 0)

Chạy một quy trình thu gom rác làm sạch một lượng lớn các đối tượng, có 577 đối tượng trong thế hệ đầu tiên và ba đối tượng nữa trong các thế hệ cũ.

Bạn có thể thay đổi các ngưỡng để kích hoạt bộ sưu tập rác bằng cách sử dụng & nbsp; set_threshold () & nbsp; phương thức trong mô -đun GC:set_threshold() method in the gc module:

 PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND  
5478 moooeeeep 20   0 2397m 2.3g 3428 S    0 29.8   0:09.15 ipython  
0

Trong ví dụ trên, chúng tôi tăng từng ngưỡng của chúng tôi từ mặc định của chúng. Tăng ngưỡng sẽ làm giảm tần số mà bộ thu gom rác chạy. Điều này sẽ ít tính toán hơn trong chương trình của bạn với chi phí giữ cho các đối tượng chết lâu hơn.

Bây giờ bạn đã biết làm thế nào cả đếm tham chiếu và mô -đun thu gom rác hoạt động, hãy để thảo luận về cách bạn nên sử dụng điều này khi viết các ứng dụng Python.

Hướng dẫn python gc collect not working - python gc thu thập không hoạt động

Trình thu gom rác Python sườn có ý nghĩa gì đối với bạn với tư cách là nhà phát triển

Chúng tôi đã dành một chút thời gian để thảo luận về quản lý bộ nhớ nói chung và việc thực hiện nó trong Python. Bây giờ nó thời gian để làm cho nó hữu ích. Làm thế nào bạn nên sử dụng thông tin này như một nhà phát triển các chương trình Python?

Nguyên tắc chung: Don lồng thay đổi hành vi thu gom rác

Theo nguyên tắc chung, có lẽ bạn không nên nghĩ về bộ sưu tập rác của Python quá nhiều. Một trong những lợi ích chính của Python là nó cho phép năng suất của nhà phát triển. Một phần lý do cho điều này là bởi vì nó là một ngôn ngữ cấp cao xử lý một số chi tiết cấp thấp cho nhà phát triển.

Quản lý bộ nhớ thủ công phù hợp hơn cho các môi trường bị ràng buộc. Nếu bạn thấy mình có giới hạn hiệu suất mà bạn nghĩ có thể liên quan đến các cơ chế thu gom rác của Python, có lẽ sẽ hữu ích hơn khi tăng sức mạnh của môi trường thực hiện của bạn thay vì thay đổi thủ công quy trình thu gom rác. Trong một thế giới của luật Moore, điện toán đám mây và bộ nhớ rẻ tiền, nhiều sức mạnh có thể dễ dàng truy cập hơn.

Điều này thậm chí còn thực tế khi Python thường không phát hành bộ nhớ trở lại hệ điều hành cơ bản. Bất kỳ quy trình thu thập rác thủ công nào bạn làm để có bộ nhớ miễn phí có thể không cung cấp cho bạn kết quả bạn muốn. Để biết thêm chi tiết trong lĩnh vực này, hãy tham khảo bài đăng này trên & NBSP; Quản lý bộ nhớ trong Python.

Vô hiệu hóa người thu gom rác

Với sự cảnh báo đó sang một bên, có những tình huống mà bạn có thể muốn quản lý quy trình thu gom rác. Hãy nhớ rằng việc đếm tham chiếu, cơ chế thu gom rác chính trong Python, có thể bị vô hiệu hóa. Hành vi thu gom rác duy nhất bạn có thể thay đổi là bộ thu gom rác thế hệ trong mô -đun GC.

Một trong những ví dụ thú vị hơn về việc thay đổi bộ thu gom rác thế hệ đến từ Instagram & nbsp; vô hiệu hóa bộ thu gom rác hoàn toàn.

Instagram sử dụng & nbsp; Django, khung web Python phổ biến, cho các ứng dụng web của nó. Nó chạy nhiều trường hợp của ứng dụng web của nó trên một phiên bản tính toán duy nhất. Các trường hợp này được chạy bằng cơ chế Master-Child trong đó con xử lý chia sẻ bộ nhớ với Master.

Nhóm Instagram Dev nhận thấy rằng bộ nhớ chia sẻ sẽ giảm mạnh ngay sau khi một quá trình trẻ em sinh ra. Khi đào sâu hơn, họ thấy rằng người thu gom rác đã đổ lỗi.

Nhóm Instagram đã vô hiệu hóa mô -đun thu gom rác bằng cách đặt các ngưỡng cho tất cả các thế hệ thành 0. Thay đổi này đã dẫn đến các ứng dụng web của họ chạy hiệu quả hơn 10%.

Mặc dù ví dụ này rất thú vị, hãy chắc chắn rằng bạn có thể trong một tình huống tương tự trước khi đi theo cùng một con đường. Instagram là một ứng dụng quy mô web phục vụ nhiều triệu người dùng. Đối với họ, nó đáng để sử dụng một số hành vi không chuẩn để bóp từng inch hiệu suất từ ​​các ứng dụng web của họ. Đối với hầu hết các nhà phát triển, hành vi tiêu chuẩn của Python, xung quanh việc thu gom rác là đủ.

Nếu bạn nghĩ rằng bạn có thể muốn quản lý thủ công bộ sưu tập rác trong Python, hãy chắc chắn rằng bạn hiểu vấn đề trước. Sử dụng các công cụ như & nbsp; Stackify từ retrace & nbsp; để đo lường hiệu suất ứng dụng của bạn và các vấn đề về chính xác. Khi bạn hoàn toàn hiểu được vấn đề, sau đó thực hiện các bước để khắc phục nó.

Bắt đầu dùng thử miễn phí 14 ngày của bạn ngay hôm nay!

Hướng dẫn python gc collect not working - python gc thu thập không hoạt động

Gói lên

Trong bài đăng này, chúng tôi đã tìm hiểu về bộ sưu tập rác Python. Chúng tôi bắt đầu bằng cách bao quát những điều cơ bản của quản lý bộ nhớ và tạo ra quản lý bộ nhớ tự động. Sau đó, chúng tôi đã xem xét cách thu thập rác được thực hiện trong Python, thông qua cả việc đếm tham chiếu tự động và một trình thu thập rác thế hệ. Cuối cùng, chúng tôi đã xem xét làm thế nào điều này quan trọng với bạn với tư cách là một nhà phát triển Python.

Mặc dù Python xử lý hầu hết các phần cứng của quản lý bộ nhớ cho bạn, nhưng nó vẫn hữu ích khi biết những gì xảy ra dưới mui xe. Từ việc đọc bài đăng này, bây giờ bạn biết rằng bạn nên tránh các chu kỳ tham chiếu trong Python và bạn nên biết nơi nào để xem nếu bạn cần kiểm soát nhiều hơn đối với bộ thu gom rác Python.

  • Thông tin về các Tác giả
  • Bài viết mới nhất

Làm cách nào để buộc GC thu thập?

Làm thế nào để buộc bộ sưu tập rác Java..
Gọi hệ thống. lệnh gc () ..
Gọi getRuntime (). lệnh gc () ..
Sử dụng lệnh JMAP ..
Sử dụng lệnh jcmd ..
Sử dụng kiểm soát nhiệm vụ JConsole hoặc Java ..

Làm thế nào để GC thu thập công việc Python?

Nếu Python thực hiện quy trình thu gom rác trên một thế hệ và một đối tượng tồn tại, nó sẽ chuyển sang thế hệ thứ hai, cũ. Bộ sưu tập rác Python có tổng cộng ba thế hệ và một đối tượng chuyển sang một thế hệ cũ bất cứ khi nào nó tồn tại trong quá trình thu thập rác trên thế hệ hiện tại của nó.. The Python garbage collector has three generations in total, and an object moves into an older generation whenever it survives a garbage collection process on its current generation.

GC thu thập () làm gì?

Nó thực hiện một bộ sưu tập rác của tất cả các thế hệ.Tất cả các đối tượng, bất kể chúng đã có trong bộ nhớ bao lâu, được xem xét để thu thập;Tuy nhiên, các đối tượng được tham chiếu trong mã được quản lý không được thu thập.Sử dụng phương pháp này để buộc hệ thống cố gắng đòi lại lượng bộ nhớ có sẵn tối đa.performs a blocking garbage collection of all generations. All objects, regardless of how long they have been in memory, are considered for collection; however, objects that are referenced in managed code are not collected. Use this method to force the system to try to reclaim the maximum amount of available memory.

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

Bạn không nên gọi nó.Bộ thu gom rác chỉ được sử dụng để xóa các tài liệu tham khảo tròn không được giải phóng bởi cơ chế đếm tham chiếu.Nó sẽ không khắc phục được vấn đề ngoài bộ nhớ của bạn;Nếu bạn bị rò rỉ bộ nhớ, bạn nên sửa nó.. The garbage collector is only used to clear up circular references that are not freed by the reference counting mechanism. It will not fix your out-of-memory problem; if you have a memory leak, you should fix that.