| Thực thi chương trình |
| --- |
| 
Khái niệm chung |
| * Mã
* Dịch
	+ Trình biên dịch
		- Thời gian biên dịch
	+ Trình biên dịch tối ưu
* Intermediate representation (IR)
* Thực thi
	+ Hệ thống runtime
		- Runtime
	+ Thực thi được
	+ Trình thông dịch
	+ Máy ảo
 |
| 
Các loại mã |
| * Mã nguồn
* Mã đối tượng
* Bytecode
* Mã máy
* Microcode
 |
| 
Chiến lược biên dịch |
| * Just-in-time (JIT)
	+ Tracing just-in-time
* Ahead-of-time (AOT)
* Transcompilation
* Recompilation
 |
| 
Runtime đáng chú ý |
| * Android Runtime (ART)
* Common Language Runtime (CLR) & Mono
* crt0
* HHVM
* Java virtual machine (JVM)
* Objective-C
* V8
	+ Node.js
* PyPy
* Zend Engine
 |
| 
Trình biên dịch & toolchain đáng chú ý |
| * GNU Compiler Collection (GCC)
* LLVM
	+ Clang
 |
| * x
* t
* s
 |

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

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ả
-------

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 bị 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ớ

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

* Lỗi tràn bộ nhớ đệm
* Quản lý bộ nhớ
* Memory debugger
* Plumbr
* nmon

Tham khảo
---------

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

* 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

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