0
Rò rỉ bộ nhớ có xảy ra đối với ngôn ngữ lập trình Python không?
0
Quỳnh Tiên10 đã đăng:

Chào các bạn, theo như mình được biết thì rò rỉ bộ nhớ có thể xảy ra đối với ngôn ngữ lập trình như C/C++ do cơ chế tự quản lý vùng nhớ của lập trình viên không tốt, vậy nó có xảy ra đối với ngôn ngữ cấp cao như Python không khi đã có cơ chế hủy vùng nhớ tự động (Garbage Collection).

Về lý thuyết thì không, dường như chúng ta không cần lo lắng về vấn đề bộ nhớ khi đã có cơ chế dọn rác tự động (GC).

Về thực tiễn thì có, GC không phải là cơ chế quản lý vùng nhớ vạn năng, vẫn có những trường hợp xảy ra rò rỉ bộ nhớ trong Python, cho nên câu trả lời là còn phụ thuộc vào từng trường hợp cụ thể cũng như sự thành thạo của lập trình viên về mã nguồn và đồng thời am hiểu các vấn đề đối với cơ chế dọn rác của ngôn ngữ lập trình Python.

Còn câu trả lời vì sao thì bạn có thể hiểu ngắn gọn là do cơ chế dọn rác tự động trong Python dựa vào số lượng tham chiếu mà một đối tượng có thể có, nếu số lượng tham chiếu của đối tượng đó bằng 0, dĩ nhiên nó sẽ bị GC dọn dẹp. Cho nên sẽ xảy ra trường hợp khi một đối tượng tham chiếu tới chính nó, tức là mặc dù nó không còn được sử dụng nữa (không còn tham chiếu tới đối tượng nào nữa) nhưng số lượng tham chiếu của nó luôn luôn bằng 1 và GC sẽ bỏ qua nó.

Ví dụ:

a = []
a.append(a)
PyPi 12.08.2018

Không hẳn là vậy @PyPi, đó chỉ là lúc đầu cơ chế dọn rác tự động của Python còn khá "naive" chưa hoạt động hiệu quả, bây giờ nó đã hỗ trợ thêm cơ chế phát hiện tham chiếu vòng tròn như bạn đã mô tả bằng cyclic garbage collector.

Mặc dù đã hỗ trợ thêm cyclic garbage collector nhưng khi đối tượng được lập trình viên định nghĩa phương thức __del__(), GC sẽ bỏ qua, rò rỉ bộ nhớ vẫn có thể xảy ra, nếu đối tượng không có phương thức __del__() thì mặc định nó sẽ bị dọn dẹp bởi GC.

xuans2huy 12.08.2018
thêm bình luận...
Bạn đang thắc mắc? Ghi câu hỏi của bạn và đăng ở chế độ cộng đồng (?)