Rò rỉ bộ nhớ
Thực thi chương trình |
---|
Khái niệm chung |
Các loại mã |
Chiến lược biên dịch |
Runtime đáng chú ý |
|
Trình biên dịch & toolchain đáng chú ý |
|
Trong khoa học máy tính, rỏ rỉ bộ nhớ (tiếng Anh: memory leak) là một dạng rỏ rỉ tài nguyên xảy ra khi một chương trình máy tính quản lý không chính xác việc cấp phát bộ nhớ[1] theo cách bộ nhớ không cần dùng nữa lại không được giải phóng. Trong lập trình hướng đối tượng, một rò rỉ bộ nhớ có thể xảy ra khi một đối tượng chứa trong bộ nhớ không thể được truy cập bởi mã đang chạy.[2] Rò rỉ bộ nhớ có dấu hiệu tương tự như các vấn đề khác và thường chỉ có thể được chẩn đoán bởi lập trình viên có quyền truy cập vào mã nguồn của chương trình.
Một rỏ rỉ không gian (space leak) xảy ra khi chương trình máy tính dùng nhiều bộ nhớ hơn mức cần thiết. Ngược lại với rỏ rỉ bộ nhớ, khi bộ nhớ rò rỉ không bao giờ được giải phóng, bộ nhớ được dùng bởi rò rỉ không gian sẽ được giải phóng nhưng chậm hơn dự kiến.[3]
Bởi vì chúng làm tiêu tốn bộ nhớ hệ thống có sẵn khi ứng dụng chạy, rỏ rỉ bộ nhớ thường là nguyên nhân hay nhân tố đóng góp vào lão hóa phần mềm (software aging).
Hậu quả
[sửa | sửa mã nguồn]Rỏ rỉ bộ nhớ làm giảm hiệu suất của máy tính khi giảm số lượng bộ nhớ có sẵn. Cuối cùng, trong trường hợp xấu nhất, quá nhiều bộ nhớ có sẵn bị cấp phát và khiến tất cả các hay một phần của hệ thống hay thiết bị ngừng hoạt động chính xác, ứng dụng bị lỗi, hay hệ thống chậm lại rất nhiều do sự trì trệ.
Rò rỉ bộ nhớ có thể không nghiêm trọng hay thậm chí có thể được phát hiện bởi các phương tiện thông thường. Trong các hệ điều hành hiện đại, bộ nhớ thông thường được sử dụng bởi một ứng dụng sẽ được giải phóng khi tắt ứng dụng đó. Điều đó nghĩa là một rỏ rỉ bộ nhớ trong chương trình chỉ chạy trong một thời gian ngắn, có thể không được chú ý và hiếm khi nghiêm trọng.
Một ví dụ của rò rỉ bộ nhớ
[sửa | sửa mã nguồn]Ví dụ sau, được viết bằng mã giả, nhằm mục đích cho thấy rỏ rỉ bộ nhớ có thể xảy ra như thế nào, và các hiệu ứng của nó, mà không yêu cầu kiến thức lập trình. Trong trường hợp này, chương trình là một phần của phần mềm đơn giản được thiết kế để điều khiển một thang máy. Phần này của chương trình được chạy bất cứ khi nào có ai đó trong thang máy và nhấn nút để chọn lầu.
Khi nút được nhấn: Nhận vài bộ nhớ, dùng để nhớ số lầu Đặt số lầu vào trong bộ nhớ đó Liệu chúng ta đã ở lầu đó rồi? Nếu vậy, chúng ta không làm gì: kết thúc Ngược lại: Chờ đến khi thang máy rảnh rỗi Di chuyển đến lầu được yêu cầu Giải phóng bộ nhớ mà chúng ta dùng để nhớ số lầu
Rò rỉ bộ nhớ sẽ xảy ra nếu số lầu được yêu cầu chính là số lầu mà thang máy đang ở; điều kiện để giải phóng bộ nhớ sẽ bị bỏ qua. Mỗi khi trường hợp đó xảy ra, càng nhiều bộ nhớ bị rò rỉ.
Xem thêm
[sửa | sửa mã nguồn]Tham khảo
[sửa | sửa mã nguồn]Bài viết này có một danh sách các nguồn tham khảo, nhưng vẫn chưa đáp ứng khả năng kiểm chứng được bởi thân bài vẫn còn thiếu các chú thích trong hàng. (September 2007) |
- ^ Crockford, Douglas. “JScript Memory Leaks”. Truy cập ngày 6 tháng 11 năm 2012.
- ^ “Creating a memory leak with Java”. Stack Overflow. Truy cập ngày 14 tháng 6 năm 2013.
- ^ Mitchell, Neil. “Leaking Space”. Truy cập ngày 27 tháng 5 năm 2017.
Liên kết ngoài
[sửa | sửa mã nguồn]- Visual Leak Detector Lưu trữ 2015-12-15 tại Wayback Machine for Visual Studio, open source
- Detecting a Memory Leak (Using MFC Debugging Support)
- Article "Memory Leak Detection in Embedded Systems Lưu trữ 2012-12-09 tại Archive.today" by Cal Erickson