Quản lý bộ nhớ là quá trình lưu trữ bộ nhớ một cách linh hoạt và giải phóng nó khi không sử dụng. Trong Python, sự phân bổ và giải quyết bộ nhớ này được thực hiện tự động bởi bộ thu gom rác Python được tạo bởi các nhà phát triển Python để người dùng không phải thực hiện bộ sưu tập rác thủ công. Bộ sưu tập rác trong Python là quá trình quản lý bộ nhớ để giải phóng bộ nhớ không sử dụng và không mong muốn cho các chương trình của chúng tôi bởi thông dịch viên. Trong Python, điều này được thực hiện tự động. Trình thu gom rác tìm thấy đối tượng không có tham chiếu chỉ vào nó và sau đó xóa đối tượng đó khỏi bộ nhớ heap. Đối với điều này, Python sử dụng thuật toán đếm tham chiếu. Example:Hiểu quản lý bộ nhớ trong Python
Thu gom rác thải
class Python:
def __init__[self]:
print['The object is created.']
def __del__[self]:
print['The object is destroyed.']
obj1 = Python[]
obj2 = obj1
obj3 = obj1
print["Set obj1 to None"]
obj1 = None
print["Set obj2 to None"]
obj2 = None
print["Set obj3 to None"]
obj3 = None
Output:
The object is created. Set obj1 to None Set obj2 to None Set obj3 to None The object is destroyed.
Ở đây, chúng tôi đã tạo ra một đối tượng của Python lớp và chuyển tài liệu tham khảo của nó cho OBJ1, OBJ2, OBJ3. Điều này làm cho số lượng tham chiếu của đối tượng đó 3. Sau đó, khi chúng ta gán các tài liệu tham khảo này cho không có, tất cả các tài liệu tham khảo từ đối tượng đó được xóa và trở thành 0. Vì không có tài liệu tham khảo nào về đối tượng, nó bị phá hủy bởi Trình thu thập rác Python và __del__ [] Phương thức được thực thi.
Đếm tham chiếu
Đếm tham chiếu trong Python là một kỹ thuật trong đó một đối tượng được giải quyết từ bộ nhớ khi không có tài liệu tham khảo chỉ vào nó. Khi số lượng tham chiếu trở thành 0, đối tượng sẽ bị xóa.
Chúng tôi có một hàm sẵn có getRefCount [] có trong SYS mô -đun Python trả về số lượng tham chiếu cho đối tượng Python đã cho. getrefcount[]present in python module sys which returns the number of references for the given python object.
Example:
import sys str = "Welcome to Python" print[sys.getrefcount[str]] arr = [] arr.append[str] # appending to an array print[sys.getrefcount[str]] dict = {} dict['str'] = str # adding to a dictionary print[sys.getrefcount[str]] arr = [] # resetting the array sys.getrefcount[str] dict['my_str'] = "Some other string" print[sys.getrefcount[str]]
Output:
Giá trị của số lượng tham chiếu cao hơn so với những gì bạn mong đợi bởi vì nó cũng tính số lượng tham chiếu cho đối tượng được truyền trong hàm sys.getrefcount [].
Đôi khi số lượng tham chiếu của một đối tượng không bao giờ đạt đến 0. Điều này xảy ra bởi vì đối tượng đề cập đến chính nó. Đây được gọi là một chu kỳ tham chiếu.Reference cycle.
Example:
import sys x = [] x.append[x] # x contains reference to itself print["Reference count of object is",sys.getrefcount[x]]
Output:
Reference count of object is 3
Ở đây, một đối tượng X được tạo ra trong đó đề cập đến chính nó. Số lượng tham chiếu sẽ không bao giờ đạt 0 vì nó có tài liệu tham khảo riêng. Đối tượng X sẽ chiếm bộ nhớ cho đến khi người thu gom rác Python được gọi.
Khi đối tượng được khai báo trên toàn cầu, số lượng tham chiếu của một đối tượng không bao giờ có thể trở thành không.
Cấp phát bộ nhớ
Để hiểu phân bổ bộ nhớ, chúng ta phải hiểu bộ nhớ truy cập ngẫu nhiên [RAM]. RAM cũng được gọi là bộ nhớ chính cho phép lưu trữ và truy xuất thông tin trên máy tính.
Ở đầu ram, chúng tôi có một ngăn xếp và ở phía dưới, chúng tôi có đống. Heap chịu trách nhiệm lưu trữ các biến/giá trị và ngăn xếp chịu trách nhiệm giữ các tham chiếu đến đối tượng trong đống.
Trong Python, khi có nhiều hơn một biến có cùng giá trị, một biến thứ hai trỏ đến giá trị ban đầu được tạo trong đống.
Example:
x = 5 y = x if[id[x] == id[y]]: print["x and y refer to the same object"] x = x+1 if[id[x] != id[y]]: print["x and y refer to different objects"] z = 5 if[id[y] == id[y]]: print["y and z refer to same memory"]
Output:
x and y refer to the same object x and y refer to different objects y and z refer to same memory
Có hai loại phân bổ bộ nhớ:
- Ngăn xếp phân bổ bộ nhớ
- Phân bổ bộ nhớ nặng.
1. Phân bổ bộ nhớ ngăn xếp
Phân bổ bộ nhớ ngăn xếp là bộ nhớ của bộ nhớ tĩnh bên trong một lệnh gọi phương thức hoặc hàm cụ thể. Khi hàm được gọi, bộ nhớ được lưu trữ trong ngăn xếp gọi hàm. Bất kỳ khởi tạo biến cục bộ nào được lưu trữ trong ngăn xếp cuộc gọi và bị xóa sau khi hàm trả về.
Vì vậy, khi chúng tôi chạy chương trình của mình, tất cả các chức năng được lưu trữ trước tiên trong ngăn xếp cuộc gọi và sau đó bị xóa khi hàm được trả về.
Example:
def func[]: #These initializations are stored in stack memory x = 10 y = "Apple"
2. Phân bổ bộ nhớ heap
Phân bổ bộ nhớ heap là bộ nhớ của bộ nhớ cần thiết bên ngoài một hàm cụ thể hoặc cuộc gọi phương thức. Bộ nhớ này được sử dụng trong chương trình ở phạm vi toàn cầu.
Bộ nhớ heap không liên quan đến cấu trúc dữ liệu heap. Nó chỉ đơn giản là một không gian lớn của bộ nhớ được cung cấp cho người dùng khi họ muốn phân bổ và giải quyết các biến/giá trị.
Trong Python, bộ nhớ heap được quản lý bởi chính trình thông dịch và người dùng không có quyền kiểm soát đối với nó.
Example:
def func[] #Allocates memory for 5 integers in heap memory x=[None]*5
Sự kết luận
Các lập trình viên đã yêu Python vì khả năng quản lý bộ nhớ vượt trội. So với nhiều ngôn ngữ lập trình cấp thấp khác, Python khiến nó trở nên dễ dàng khi làm việc với các biến mà không phải lo lắng về việc lạm dụng tài nguyên.
Người giới thiệu
Tài liệu chính thức