Rò rỉ bộ nhớ (Memory Leak) là việc đặt sai vị trí tài nguyên trong chương trình máy tính do phân bổ bộ nhớ bị lỗi. Điều này xảy ra khi vị trí RAM không được sử dụng vẫn chưa được giải phóng. Rò rỉ bộ nhớ không nên bị nhầm lẫn với rò rỉ không gian (space leak), ám chỉ chương trình sử dụng nhiều RAM hơn cần thiết. Rò rỉ bộ nhớ trên hệ thống Windows 11/10/8/7 được nói đã xảy ra khi bộ nhớ không thể truy cập dù không được sử dụng.
Rò rỉ bộ nhớ trong Windows 11/10
Trước khi bắt đầu, bạn nên biết rằng rò rỉ bộ nhớ là vấn đề phần mềm cần debug — ví dụ trong Java, JavaScript, C/C++, Windows, v.v. Thay thế vật lý RAM hoặc ổ cứng không cần thiết.

Tại sao nó xấu
Rõ ràng rò rỉ bộ nhớ xấu vì nó là bug, khiếm khuyết trong hệ thống. Nhưng hãy tìm hiểu chính xác nó ảnh hưởng thế nào đến hệ thống:
- Vì bộ nhớ không được giải phóng ngay cả khi không sử dụng, dẫn đến cạn kiệt bộ nhớ.
- Cạn kiệt bộ nhớ dẫn đến lão hóa phần mềm.
- Bộ nhớ khả dụng giảm dẫn đến thời gian phản hồi tăng và hiệu suất hệ thống kém.
- Rò rỉ bộ nhớ không được kiểm soát cuối cùng có thể dẫn đến sập ứng dụng.
Để xác định rò rỉ bộ nhớ, lập trình viên cần truy cập mã nguồn của chương trình.
Định vị rò rỉ
Để giải quyết vấn đề, chúng ta cần xác định nó trước. Các bước cơ bản để định vị rò rỉ bộ nhớ:
- Xác nhận: Xác định xem rò rỉ đã xảy ra hay chưa.
- Tìm rò rỉ Kernel-mode: Định vị rò rỉ do thành phần driver kernel-mode gây ra.
- Tìm rò rỉ User-mode: Định vị rò rỉ do driver hoặc app user-mode gây ra.
Phân bổ bộ nhớ
Có các chế độ khác nhau mà ứng dụng phân bổ RAM. Nếu không gian không được giải phóng sau khi dùng, rò rỉ bộ nhớ sẽ xảy ra bất kể chế độ phân bổ. Một số mẫu phân bổ phổ biến:
- Hàm HealAlloc cho phân bổ heap memory. Tương đương C/C++ runtime là malloc và new.
- Hàm VirtualAlloc cho phân bổ trực tiếp từ OS.
- API Kernel32 để giữ kernel memory cho app. Ví dụ, CreateFile, CreateThread.
- API User32 và Gdi32.
Ngăn chặn rò rỉ bộ nhớ trong Windows
Chúng ta đều biết phòng bệnh hơn chữa bệnh, nên đây là một số cách ngăn chặn rò rỉ bộ nhớ.
Thói quen giám sát

Bạn cần theo dõi việc sử dụng RAM bất thường của từng chương trình và ứng dụng. Bạn có thể vào Windows Task Manager bằng cách nhấn CTRL+SHIFT+ESC và thêm các cột như Handles, User Objects, GDI Objects, v.v.
Điều này sẽ giúp bạn dễ dàng giám sát việc sử dụng tài nguyên.
Đọc thêm: Các loại bộ nhớ trong máy tính là gì?
Công cụ của Microsoft để chẩn đoán rò rỉ bộ nhớ
Các công cụ khác nhau chẩn đoán rò rỉ bộ nhớ cho các chế độ phân bổ khác nhau:
- Application Verifier chẩn đoán rò rỉ heap.
- UMDH (thành phần của Windows Debugging Tools) chẩn đoán rò rỉ cho từng tiến trình bằng cách giám sát phân bổ heap memory.
- Trace Capture để phân tích kỹ lường việc sử dụng RAM.
- Xperf cũng theo dõi mẫu phân bổ heap.
- CRT Debug Heap không chỉ theo dõi phân bổ heap mà còn cho phép thực hành coding để giảm thiểu rò rỉ.
- JavaScript Memory Leak Detector debug rò rỉ bộ nhớ trong mã.
Mẹo sử dụng
- Sử dụng kernel HANDLE và các con trỏ thông minh khác cho tài nguyên Win32 và phân bổ heap.
- Lấy các lớp để quản lý tài nguyên tự động cho phân bổ kernel từ thư viện ATL. Chuẩn C++ có auto_ptr cho phân bổ heap.
- Bao gói các con trỏ giao diện COM trong "con trỏ thông minh" với sự giúp đỡ của _com_ptr_t hoặc _bstr_t hoặc _variant_t.
- Giám sát mã .NET cho việc sử dụng bộ nhớ bất thường.
- Tránh nhiều đường thoát cho hàm để phân bổ được giải phóng từ biến trong hầu hết các khối bằng cuối hàm.
- Chỉ dùng ngoại lệ native sau khi giải phóng tất cả phân bổ trong khối _finally. Bọc tất cả phân bổ heap và handle vào con trỏ thông minh để dùng ngoại lệ C++.
- Luôn gọi hàm PropVariantClear trước khi tái khởi tạo hoặc loại bỏ đối tượng PROPVARIANT.
Khắc phục rò rỉ bộ nhớ trong Windows
Giống như các cách ngăn chặn rò rỉ bộ nhớ, có nhiều cách dừng rò rỉ bộ nhớ. Nhưng trước khi bắt đầu, nhớ tạo điểm khôi phục hệ thống trước.
1. Đóng tiến trình và khởi động lại.
Nếu thấy tiến trình không cần thiết chiếm quá nhiều RAM, bạn có thể kết thúc tiến trình trong Task Manager. Bạn cần khởi động lại thiết bị để không gian giải phóng có sẵn cho các tiến trình khác dùng. Không khởi động lại thì vấn đề rò rỉ bộ nhớ không giải quyết được. Một tiến trình cụ thể có bug làm chậm PC là Runtime Broker. Thử xem chỉ tắt nó có hiệu quả không.
2. Công cụ chẩn đoán bộ nhớ

Để truy cập công cụ chẩn đoán bộ nhớ tích hợp sẵn cho Windows:
- Lưu tất cả công quan trọng.
- Nhấn Win + R để mở cửa sổ Run.
- Gõ lệnh mdsched.exe trong cửa sổ Run.
- Khởi động lại PC.
- Sau khởi động lại, thực hiện quét cơ bản hoặc chọn tùy chọn 'Advanced' như 'Test mix' hoặc 'Pass count'.
- Nhấn F10 để bắt đầu kiểm tra.
Đây vẫn là các giải pháp tạm thời.
3. Kiểm tra cập nhật Driver

Driver lỗi thời gây rò rỉ bộ nhớ. Giữ tất cả driver cập nhật:
- Nhấn Win + R và mở cửa sổ Run. Gõ devmgmt.msc và nhấn Enter. Sẽ đưa bạn đến Device Manager.
- Kiểm tra driver lỗi thời và cập nhật tất cả.
- Đối với cập nhật bạn có thể đã bỏ lỡ, kiểm tra trong Windows Update.
Điều này khá đơn giản.
4. Tối ưu hóa hiệu suất

Điều chỉnh Windows cho hiệu suất sẽ quản lý mọi thứ bao gồm lịch trình bộ xử lý và sử dụng bộ nhớ để dừng rò rỉ bộ nhớ. Làm theo các bước:
- Chuột phải vào 'This PC' và chọn 'Advanced' settings ở khung bên trái.
- Dưới tab 'Advanced', đi đến 'Performance', tiếp theo 'Settings'.
- Chọn 'Adjust for best performance' và nhấn OK.
- Khởi động lại và kiểm tra xem vấn đề đã giải quyết chưa.
Nếu giải pháp đơn giản này không hoạt động, thử giải pháp tiếp theo.
5. Tắt chương trình chạy khi Khởi động

Vô hiệu hóa chương trình gây rắc rối là cách duy nhất để loại bỏ vấn đề rò rỉ bộ nhớ. Vào Task Manager và vô hiệu hóa chương trình gây rắc rối. Nếu bạn không biết chương trình nào tạo ra rắc rối, làm này:
- Đi đến 'Task Manager'.
- Đi đến 'Startup'.
- Vô hiệu hóa chương trình khởi động bạn không cần chạy mặc định.
6. desfragment ổ cứng

Mặc dù Windows 10 làm điều này tự động, bạn có thể cần desfragment ổ cứng đôi khi để tối ưu hiệu suất:
- Đi đến 'This PC' hoặc 'My Computer'.
- Chuột phải vào ổ cứng hệ thống (thường là ổ C:).
- Đi đến 'Tools' dưới 'Properties' và chọn 'Optimize'.
- Chọn ổ để desfragment và chọn 'Analyze'.
Khởi động lại máy tính sau khi desfragment mới.
7. Xóa Page File khi tắt máy
Đang phức tạp hơn – nhưng đừng lo. Cách xóa Page File mỗi lần tắt máy:
- Gõ regedit trên Search để mở Registry Editor.
- Nhập đường dẫn này:
HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlSession ManagerMemory Management
- Thay đổi giá trị ClearPageFileAtShutDown thành '1'.
- Lưu thay đổi và Khởi động lại thiết bị.
Điều này nên giải quyết. Nhớ rằng quá trình tắt máy sẽ lâu hơn một chút.
9. Tắt Superfetch
Dịch vụ Windows này tối ưu hiệu suất bằng cách giảm thiểu thời gian khởi động. Nó để Windows quản lý việc sử dụng RAM. Cuộc sống sau khi tắt Superfetch không tiện lợi nhưng hãy làm nếu bạn phải. Ít nhất thử riêng cái này để cô lập vấn đề:
- Tìm kiếm services.msc và đi đến Services Manager.
- Tìm 'Superfetch' và chuột phải để vào 'Properties'.
- Chọn 'Stop'.
- Cũng 'Disable' dịch vụ từ menu thả xuống.
- Khởi động lại PC và kiểm tra xem hiệu suất có cải thiện không.
Bật lại Superfetch nếu cái này không hoạt động.
10. Kiểm tra phần mềm độc hại
Dùng phần mềm antivirus thứ ba hoặc Windows Defender tích hợp của Windows 10 để quét và loại bỏ malware. Đảm bảo antivirus được cập nhật để hỗ trợ OS của bạn, để nó không trở thành nguyên nhân rò rỉ bộ nhớ.
Mọi giải pháp bạn có thể cần để tìm hoặc ngăn chặn rò rỉ bộ nhớ đều ở đây. Bạn có thể đọc thêm về rò rỉ bộ nhớ trên MSDN và Microsoft.
