2011-01-16 30 views
5

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.

+0

"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

+0

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

+0

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

Trả lời

8

Các quy tắc thông thường áp dụng, một quá trình quản lý không được đối xử khác biệt bởi người quản lý bộ nhớ Windows. Nguồn cuối cùng cho khối bộ nhớ là trình quản lý bộ nhớ Windows. Nếu nó không thể tìm thấy một lỗ hổng trong không gian địa chỉ bộ nhớ ảo để phù hợp với cấp phát bộ nhớ được yêu cầu thì nó không thực hiện được cuộc gọi VirtualAlloc() và CLR tạo ra OOM.

Tương tự cho hành vi hoán đổi, nếu các trang trong RAM là cần thiết để ánh xạ các trang của các quy trình khác hoặc thậm chí các trang của cùng một quy trình thì chúng sẽ được hoán đổi. Điều này không được liên kết với OOM.

Bạn không thể giả định nó sẽ hoạt động giống như trên XP giống như trên Win7 x64. Bắt OOM trên x64 khi bạn xây dựng chương trình của bạn nhắm mục tiêu AnyCPU là khá bất thường, một hệ điều hành 64-bit có một không gian địa chỉ bộ nhớ ảo rất lớn. Giới hạn trên được đặt bởi kích thước tối đa của tệp hoán trang. Một chương trình 32 bit sẽ chạy trong lớp mô phỏng WOW, nó có thể có một không gian địa chỉ 4 GB nếu bạn thiết lập bit tùy chọn LARGEADDRESSAWARE với Editbin.exe.

Bạn có thể sử dụng tiện ích VMMap của SysInteral để xem không gian địa chỉ của quá trình được khắc lên như thế nào.

+1

"Nếu nó không thể tìm thấy một lỗ hổng trong không gian địa chỉ bộ nhớ ảo để phù hợp với phân bổ bộ nhớ được yêu cầu thì nó không thực hiện được lời gọi HeapAlloc() và CLR tạo ra OOM." - nhưng tại sao hack nó không phân trang hơn? Ít nhất nó nên, nếu không gian ảo chưa được sử dụng hết, nhưng không có RAM khác có thể được tìm thấy? – user492238

+1

Hai * rất * những thứ khác nhau. Phân trang xảy ra khi không gian bộ nhớ * vật lý * cần được tìm thấy. RAM. Phân bổ bộ nhớ xảy ra trong bộ nhớ * ảo *. Một quá trình 32-bit có 2 gigabyte của nó, không có vấn đề bao nhiêu RAM được cài đặt. Tổng của tất cả bộ nhớ ảo được phân bổ bởi tất cả các quy trình chỉ bị giới hạn bởi tệp hoán trang, không phải RAM. –

+1

Vì vậy, 2GB (một số TB trên 64bit) chỉ là giới hạn lý thuyết?Quản lý bộ nhớ hoán đổi cho đến khi kích thước của pagefile * part * được dành riêng cho quá trình đã được lấp đầy? Và nếu phần đó thậm chí phù hợp với RAM, nó thậm chí không hoán đổi chút nào? Điều này sẽ trả lời câu hỏi – user492238

Các vấn đề liên quan