Thử nghiệm ứng suất nhỏ của tôi, phân bổ các mảng độ dài ngẫu nhiên (100,.200MB) trong một vòng lặp, cho thấy hành vi khác nhau trên máy 64 bit Win7 và trên một bit 32 XP (trong máy ảo). Cả hai hệ thống đầu tiên thường phân bổ nhiều mảng như sẽ phù hợp với LOH. Sau đó, các LOH được lớn hơn và lớn hơn cho đến khi không gian địa chỉ ảo có sẵn được lấp đầy. Hành vi mong đợi cho đến nay. Nhưng hơn - trên các yêu cầu tiếp theo - cả hai hoạt động khác nhau:Khi nào và như thế nào là vùng được quản lý .NET bị hoán đổi?
Trong khi trên Win7 một OutOfMemoryException (OOM) được ném, trên XP có vẻ như, heap được tăng lên và thậm chí hoán đổi vào đĩa - ít nhất không có OOM được ném. (Không biết, nếu điều này có thể liên quan đến XP đang chạy trong một hộp ảo.)
Câu hỏi: Thời gian chạy (hoặc HĐH?) Quyết định, cho dù yêu cầu phân bổ bộ nhớ được quản lý, nếu nó quá lớn để được cấp phát, một OOM được tạo ra hoặc heap đối tượng lớn đang được tăng lên - cuối cùng thậm chí hoán đổi vào đĩa? Nếu nó được hoán đổi, khi nào thì một OOM occour hơn?
IMO câu hỏi này rất quan trọng đối với tất cả các môi trường sản xuất, có khả năng xử lý các tập dữ liệu lớn hơn. Bằng cách nào đó nó cảm thấy "an toàn" hơn để biết, hệ thống sẽ khá chậm lại trong những tình huống như vậy (bằng cách hoán đổi) hơn là chỉ đơn giản là ném một OOM. Ít nhất, nó bằng cách nào đó phải được xác định, đúng không?
@Edit: ứng dụng là một ứng dụng 32 bit, do đó chạy trong chế độ 32 bit trên Win 7.
"cho đến khi không gian địa chỉ thực" không phải bạn có nghĩa là không gian địa chỉ ảo của quá trình đó? – CodesInChaos
Và chương trình của bạn có được đặt thành AnyCPU hoặc 32BitOnly không? Trong số những kỷ niệm trong một chương trình 64 bit không nên xảy ra dễ dàng. Tôi hy vọng máy tính sẽ dừng lại do sự trao đổi quá nhiều trước đó. – CodesInChaos
bạn đúng: "không gian địa chỉ ảo" có nghĩa là. Và có, prog biên dịch cho một ứng dụng 32 bit, chạy WOW trên Win7. – user492238