Câu trả lời ngắn gọn cho câu hỏi này là không có giá trị nào trong số này là một chỉ số đáng tin cậy về việc bộ nhớ thực sự sử dụng được bao nhiêu bộ nhớ và không có giá trị nào thực sự thích hợp để gỡ lỗi rò rỉ bộ nhớ.
Byte riêng đề cập đến dung lượng bộ nhớ mà quá trình thực thi đã yêu cầu - không nhất thiết là số lượng mà nó thực sự đang sử dụng . Chúng là "riêng tư" vì chúng (thường) loại trừ các tệp ánh xạ bộ nhớ (tức là các DLL được chia sẻ). Nhưng - đây là cách bắt - họ không nhất thiết loại trừ bộ nhớ được cấp phát bởi các tệp đó . Không có cách nào để biết liệu một sự thay đổi trong các byte riêng là do chính nó có thể thực thi được hay do một thư viện được liên kết. Các byte riêng tư cũng không chỉ là bộ nhớ vật lý; chúng có thể được phân trang vào đĩa hoặc trong danh sách trang chờ (nghĩa là không còn được sử dụng, nhưng chưa được phân trang).
Bộ công việc đề cập đến tổng bộ nhớ vật lý (RAM) được sử dụng bởi quy trình. Tuy nhiên, không giống như các byte riêng tư, điều này cũng bao gồm các tệp được ánh xạ bộ nhớ và các tài nguyên khác, do đó, nó là một phép đo thậm chí còn kém chính xác hơn các byte riêng tư. Đây là cùng một giá trị được báo cáo trong "Sử dụng Mem" của Trình quản lý tác vụ và là nguồn gốc của vô số sự nhầm lẫn trong những năm gần đây. Bộ nhớ trong Bộ làm việc là "vật lý" theo nghĩa là nó có thể được xử lý mà không có lỗi trang; Tuy nhiên, danh sách trang standby là cũng vẫn thể chất trong bộ nhớ nhưng không được báo cáo trong Set Working, và đây là lý do tại sao bạn có thể thấy "Mem Usage" đột nhiên thả khi bạn hạn chế tối đa một ứng dụng.
Byte ảo là tổng không gian địa chỉ ảo bị chiếm bởi toàn bộ quá trình. Điều này giống như tập làm việc, theo nghĩa là nó bao gồm các tệp ánh xạ bộ nhớ (DLL chung), nhưng nó cũng bao gồm dữ liệu trong danh sách chờ và dữ liệu đã được phân trang và đang nằm trong một trang trên đĩa ở đâu đó. Tổng số byte ảo được sử dụng bởi mọi quy trình trên một hệ thống chịu tải nặng sẽ tăng thêm bộ nhớ đáng kể so với máy thực sự có.
Vì vậy, các mối quan hệ là:
- Byte riêng là những gì ứng dụng của bạn đã thực sự phân bổ, nhưng bao gồm việc sử dụng pagefile;
- Bộ công việc là các byte riêng không phân trang cộng với các tệp ánh xạ bộ nhớ;
- Byte ảo là Bộ làm việc cộng với byte riêng được phân trang và danh sách chờ.
Có một vấn đề khác ở đây; cũng giống như các thư viện dùng chung có thể phân bổ bộ nhớ trong mô-đun ứng dụng của bạn, dẫn đến các lỗi tích cực tiềm ẩn được báo cáo trong Private Byte của ứng dụng, ứng dụng của bạn cũng có thể phân bổ bộ nhớ trong các mô-đun được chia sẻ , dẫn đến phủ định sai . Điều đó có nghĩa là ứng dụng của bạn thực sự có thể bị rò rỉ bộ nhớ mà không bao giờ xuất hiện trong byte riêng tư. Không thể, nhưng có thể.
Byte riêng là một xấp xỉ hợp lý của lượng bộ nhớ mà bạn có thể sử dụng và có thể được sử dụng để thu hẹp danh sách các ứng cử viên tiềm năng bị rò rỉ bộ nhớ; nếu bạn thấy con số tăng lên và tăng trưởng liên tục và vô tận, bạn sẽ muốn kiểm tra xem có bị rò rỉ không. Tuy nhiên, điều này không thể chứng minh rằng có hoặc không có rò rỉ.
Một trong những công cụ hiệu quả nhất để phát hiện / sửa lỗi rò rỉ bộ nhớ trong Windows thực sự là Visual Studio (liên kết đến trang sử dụng VS để rò rỉ bộ nhớ, không phải trang sản phẩm). Rational Purify là một khả năng khác. Microsoft cũng có một tài liệu thực hành tốt nhất chung hơn về chủ đề này. Có nhiều công cụ được liệt kê trong câu hỏi trước đây .
Tôi hy vọng điều này sẽ làm sáng tỏ một vài điều! Theo dõi rò rỉ bộ nhớ là một trong những điều khó thực hiện nhất trong việc gỡ lỗi. Chúc may mắn.