2010-03-08 26 views
15

Tôi hiện đang có ứng dụng 32 bit .Net (trên x86 Windows) yêu cầu nhiều bộ nhớ. Gần đây nó bắt đầu ném System.OutOfMemoryException's.Quy trình Giới hạn bộ nhớ của quy trình 64 bit

Vì vậy, tôi dự định chuyển nó sang nền tảng x64 dưới dạng quy trình 64 bit. Vì vậy, điều này sẽ giúp với các trường hợp ngoại lệ bộ nhớ. Tôi đã đọc bài viết này từ MSDN Memory limits for Windows

Vì vậy, câu hỏi của tôi là nếu tôi biên dịch ứng dụng 64 bit .Net, nó sẽ có IMAGE_FILE_LARGE_ADDRESS_AWARE đặt làm mặc định (Như bài viết gợi ý)? tức là tôi có thể tận dụng lợi thế của không gian địa chỉ ảo chế độ người dùng 8GB không?

Trả lời

9

Giới hạn bộ nhớ tối đa cho các quy trình x64 là 8 TB, nhưng giới hạn thực tế ít hơn nhiều tùy thuộc vào dung lượng bộ nhớ vật lý và kích thước tệp trang trên hệ thống của bạn. Xem this post để biết thêm chi tiết về điều này.

IMAGE_FILE_LARGE_ADDRESS_AWARE ảnh hưởng đến quy trình x86 chạy trên hệ điều hành x64 (hoặc hệ điều hành x86 có chỉ thị/3GB). Ứng dụng x64 của bạn không cần thiết lập cờ nhận thức địa chỉ lớn và nó sẽ có thể sử dụng tất cả bộ nhớ ảo có sẵn trên hệ thống của bạn.

6

Thực ra, bài viết đó cho biết bạn sẽ có quyền truy cập vào 8 TB không gian địa chỉ ảo (và có, điều này là đúng).

+0

và đó là không cần phải làm gì thêm để đặt IMAGE_FILE_LARGE_ADDRESS_AWARE. tức là quy trình 64 bit theo mặc định có chuyển đổi đó. Tôi có đúng không? – SysAdmin

+0

Nếu chúng tôi giới hạn mình với Windows x64: Tôi nghĩ bạn muốn nói * bạn _can_ có quyền truy cập vào 8TB *, vì bạn bị giới hạn bởi bộ nhớ vật lý hiện có và bất cứ nơi nào tệp trang đang được lưu trữ. Chúng tôi chưa có ổ cứng 8TB. –

6

Thực tế trên hệ điều hành x64 nếu ứng dụng của bạn được biên dịch cho AnyCPU thì bạn không cần phải làm gì đặc biệt. JIT sẽ tạo một hình ảnh x64 tại thời gian chạy hoặc một hình ảnh x86 khi chạy trên một hệ thống 32 bit.

11

IMAGE_FILE_LARGE_ADDRESS_AWARE chỉ phù hợp với quy trình 32 bit. Lý do là không gian địa chỉ trên Windows 32 bit được chia thành hai: 2 GB cho không gian hạt nhân và 2 GB cho không gian người dùng. Để giải quyết 2 GB bạn cần 31 bit. I E. các con trỏ trong một ứng dụng 32 bit không cần bit cuối cùng để giải quyết.

Một số ứng dụng có thể đã sử dụng bit phụ này cho các mục đích tùy chỉnh, vì vậy nếu trình quản lý bộ nhớ Windows đột nhiên đưa cho họ một địa chỉ 32 bit thực mà họ không thể xử lý. Bằng cách kích hoạt cờ IMAGE_FILE_LARGE_ADDRESS_AWARE ứng dụng về cơ bản cho hệ điều hành biết rằng nó có thể xử lý toàn bộ không gian địa chỉ 32 bit.

Nếu bạn chạy ứng dụng IMAGE_FILE_LARGE_ADDRESS_AWARE trên Windows 32 bit, bạn có thể truy cập 3 GB. Nếu bạn chạy cùng một ứng dụng 32 bit trên 64 bit, Windows thực sự sẽ chiếm toàn bộ không gian địa chỉ 4 GB.

Nếu bạn chạy một ứng dụng 64 bit trên 64 bit, Windows không gian địa chỉ người dùng là 8 TB (với 8 TB khác dành riêng cho không gian địa chỉ hạt nhân). Các ứng dụng .NET được đặt thành AnyCPU sẽ tự động là các ứng dụng 64 bit trên x64, do đó bạn không phải làm bất cứ điều gì để giải quyết bộ nhớ bổ sung. Tuy nhiên, xin lưu ý rằng CLR áp đặt giới hạn 2 GB cho bất kỳ đối tượng nào, vì vậy trong khi ứng dụng của bạn có thể sử dụng nhiều bộ nhớ, bạn không thể tạo một mảng 2 TB chẳng hạn. Xem thêm thông tin trong câu hỏi này: Single objects still limited to 2 GB in size in CLR 4.0?

+1

Đối với các lược đồ địa chỉ 32 bit (tổng cộng đến 4 GB địa chỉ) cửa sổ đã chia toàn bộ không gian thành hai tức là 2 GB cho hạt nhân OS và 2 GB cho quá trình người dùng. Đối với sơ đồ địa chỉ 64 bit, có vẻ như họ KHÔNG dùng đường đó để chia toàn bộ không gian địa chỉ thành hai phần bằng nhau. Tổng số sơ đồ địa chỉ 64 bit cho 16777216 TB nhưng chúng đã giới hạn không gian hạt nhân và quy trình người dùng đến 8 TB. – RBT

4

        Di chuyển đến một chút 64 chắc chắn sẽ giúp cắt ra OutOfMemoryExceptions, nhưng bạn có thể muốn tập trung vào kiến ​​trúc hệ thống của bạn và mã hóa các cơ chế để tránh những vì nó sẽ chỉ là một vấn đề thời gian trước khi chúng xuất hiện trên máy 64 bit.
        Một lợi thế nữa của việc chuyển sang máy 64 bit là với 8 TB không gian địa chỉ ảo, Bộ sưu tập rác cho .NET thường xuyên xảy ra. Điều này cải thiện hiệu suất ứng dụng bằng cách tăng không gian ảo có sẵn cho chương trình của bạn.

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