Re Q cuối cùng của bạn - phiên bản ngắn: Thông báo lỗi là về không gian địa chỉ ảo "đã cam kết". Nếu bạn nhìn vào biểu đồ Commit Charge trong ảnh chụp màn hình thứ hai của bạn, bạn sẽ thấy rằng nó thực sự ở hoặc rất gần giới hạn.
Dung lượng RAM "miễn phí", "khả dụng" hoặc "đang sử dụng" không thành vấn đề. Cụ thể, việc thiếu RAM "khả dụng" hoàn toàn không phải là lý do cho thông báo "hết bộ nhớ" hoặc "hết bộ nhớ".
Giới hạn cam kết bằng tổng RAM + kích thước trang. Khi bộ nhớ cam kết được phân bổ, nó sẽ ngay lập tức được tính vào "phí cam kết" mặc dù nó chưa thực sự được sử dụng ... có nghĩa là không có không gian RAM hoặc PF được sử dụng ngay lập tức. Không gian vật lý (cho dù trong RAM hoặc tệp trang) chỉ được sử dụng khi bộ nhớ thực sự được tham chiếu. Từ đó trở đi phải có một nơi nào đó, cho đến khi chương trình giải phóng nó, hoặc toàn bộ quá trình kết thúc.
Ví dụ: Giả sử bạn không có tệp trang, do đó giới hạn cam kết của bạn là 16 GB (kích thước RAM của bạn). Bây giờ, giả sử rằng 8 quy trình mỗi lần thử với Virtual ALLoc (MEM_COMMIT) 1 GB. Kết quả: Phí cam kết được tăng thêm 8 GB. Không có tác động ngay lập tức đến RAM, tuy nhiên! Như thể bạn đã mua một tờ giấy ở cửa hàng văn phòng phẩm, nhưng thực tế bạn không nhận được bất kỳ tờ giấy nào. Tuy nhiên, mỗi khi bạn cần một tờ mới, sẽ xuất hiện một phép màu. Cho đến khi bạn sử dụng hết toàn bộ pad (kích thước của vùng được phân bổ).
Bây giờ, giả sử mỗi quá trình đó chỉ thực sự truy cập 100 MB trong số 1 GB. RAM được sử dụng sẽ chỉ là 800 MB.
Nhưng vì mỗi người trong số họ có thể tham chiếu tất cả 1 GB của mình, nên HĐH phải đảm bảo rằng 8 GB RAM + dung lượng trang ... tốt, chỉ cần RAM trong trường hợp không có trang nào ... chỉ có sẵn trong trường hợp xảy ra . Quay trở lại cửa hàng văn phòng phẩm, họ cần giữ đủ giấy trong kho để cung cấp cho mọi người nhiều tờ như họ đã mua trước đó.
Theo đó, HĐH phải ngừng cho phép VirtualAlloc (MEM_COMMIT) thành công khi số tiền hiện tại đã cam kết đạt đến giới hạn.
Tại sao? Bởi vì quá trình này dự kiến sẽ kiểm tra kết quả của VirtualAlloc để xem liệu nó có thành công hay không. Một khi nó đã làm như vậy và thấy rằng việc phân bổ đã thành công, quá trình này có mọi quyền để mong đợi rằng các tham chiếu tiếp theo của nó tới toàn bộ khu vực cam kết sẽ thành công.
Nếu Windows cho phép phí cam kết vượt quá dung lượng có sẵn để nhận ra không gian đó, thì kỳ vọng đó không phải lúc nào cũng có thể được đáp ứng.
Cách giải quyết nhanh là tăng kích thước mặc định (= ban đầu) của tệp trang của bạn. Từ lời giải thích ở trên, bạn sẽ có thể thấy lý do tại sao điều này sẽ tránh được thông báo lỗi mặc dù không có gì có thể được ghi vào tệp đó . Một lần nữa, HĐH đảm bảo rằng không gian cho tất cả các khoản phí cam kết có sẵn trong trường hợp cần . Khi các quy trình phân bổ bộ nhớ đã cam kết, họ chỉ nói "hey, OS, tôi có thể cần nhiều thứ này." Điều đó không có nghĩa là họ thực sự sẽ sử dụng nó và chắc chắn điều đó không có nghĩa là họ thực sự đã sử dụng nó.
Để biết thêm, xem câu trả lời của tôi ở đây .
Bây giờ .... tại sao bạn đang sử dụng nhiều cam kết đó khi các quy trình của bạn dường như không thêm vào đó là một câu hỏi khác. Để bắt đầu xem xét điều đó, vui lòng hiển thị tab Hiệu suất của Trình quản lý tác vụ, phần Bộ nhớ.