Bước tới nội dung

Rò rỉ bộ nhớ

Bách khoa toàn thư mở Wikipedia

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ỉ.

Tham khảo

[sửa | sửa mã nguồn]
  1. ^ Crockford, Douglas. “JScript Memory Leaks”. Truy cập ngày 6 tháng 11 năm 2012.
  2. ^ “Creating a memory leak with Java”. Stack Overflow. Truy cập ngày 14 tháng 6 năm 2013.
  3. ^ 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]

Bản mẫu:Quản lý bộ nhớ