2013-01-06 24 views
68

Tôi nhận được một ngoại lệ bộ nhớ ngoài trong ứng dụng C# của tôi khi sử dụng bộ nhớ cho ứng dụng này vượt quá khoảng 1,3 GB..NET Out Of Memory Exception - Được sử dụng 1.3GB nhưng có 16GB cài đặt

Tôi gặp vấn đề tương tự trên máy 32 bit với bộ nhớ 3gb và lúc này tôi đã nâng cấp phần cứng lên máy 64 bit với bộ nhớ 16GB với bo mạch chủ và RAM cao cấp nhưng Out of Memory ngoại lệ vẫn xảy ra sau 1.3GB!

Tôi biết rằng không có đối tượng duy nhất trên 2GB và 1.3 là ít 2GB anyway, do đó giới hạn trong xây dựng MS 2GB trên một đối tượng duy nhất là không có khả năng có vấn đề ...

Dường giống như có một cửa sổ kill-switch của một số loại khi một ứng dụng đạt đến một ngưỡng sử dụng bộ nhớ nhất định ... Sau đó, cần có một cách để cấu hình này là trong registry có lẽ?

Bất kỳ trợ giúp nào sẽ được đánh giá rất nhiều!

+9

HĐH 64bit của bạn phải không? – fge

+8

Ngay cả khi hệ điều hành của bạn là 64bit, hãy đảm bảo quá trình của bạn cũng là 64bit (hoặc AnyCPU) – Knowleech

+0

Phiên bản .NET nào? –

Trả lời

77

Không có sự khác biệt cho đến khi bạn biên dịch kiến ​​trúc cùng một mục tiêu. Tôi giả sử bạn đang biên dịch cho kiến ​​trúc bit 32 trong cả hai trường hợp.

Đó là đáng nói đến là OutOfMemoryException cũng có thể được tăng lên nếu bạn nhận được 2GB bộ nhớ được phân bổ bởi một bộ sưu tập duy nhất trong CLR (nói List<T>) trên cả kiến ​​trúc 3264 bit.

Để có thể hưởng lợi từ trí nhớ tốt trên kiến ​​trúc bit 64, bạn phải biên dịch mã nhắm mục tiêu 64 kiến ​​trúc bit của bạn. Sau đó, tự nhiên, nhị phân của bạn sẽ chạy chỉ trên 64 bit, nhưng sẽ được hưởng lợi từ khả năng có nhiều dung lượng trống hơn trong RAM.

+8

Còn AnyCPU thì sao? – dtb

+1

Có, AnyCPU cũng là một tùy chọn, trong đó bạn có tùy chọn mã JIT phụ thuộc vào kiến ​​trúc. Nhưng nhắm mục tiêu kiến ​​trúc cụ thể vẫn còn có thể có lợi, trong trường hợp bạn không có tài nguyên (nói). Tôi không biết kiến ​​trúc của OP là gì. – Tigran

+4

Tôi biết điều đó :) - Cảm ơn Tigran, tôi đã xây dựng lại giải pháp trong x64 và ngoại lệ đã biến mất. – Paceman

2

Dường như bạn có bản đồ 64 bit, tốt - nhưng phiên bản 32 bit của thời gian chạy .NET và/hoặc phiên bản 32 bit của Windows.

Và như vậy, không gian địa chỉ có sẵn cho quy trình của bạn vẫn như cũ, nó không thay đổi so với thiết lập trước đó của bạn.

Nâng cấp lên cả một hệ điều hành 64bit và một phiên bản .NET 64bit;)

1

Ứng dụng của bạn có đang chạy với quy trình 64 hoặc 32 bit không? Bạn có thể kiểm tra điều này trong trình quản lý tác vụ.

Có thể, nó đang chạy dưới dạng 32 bit, mặc dù toàn bộ hệ thống đang chạy trên 64 bit.

Nếu 32bit, thư viện của bên thứ ba có thể gây ra điều này. Nhưng trước tiên hãy đảm bảo rằng ứng dụng của bạn đang biên dịch cho "CPU bất kỳ", như đã nêu trong các nhận xét.

52

Như đã đề cập, việc biên dịch ứng dụng trong x64 cung cấp cho bạn nhiều bộ nhớ khả dụng hơn.

Nhưng trong trường hợp người ta phải xây dựng một ứng dụng trong x86, có một cách để nâng cao giới hạn bộ nhớ từ 1,2GB đến 4GB (mà là giới hạn thực tế cho quá trình 32 bit):

Trong VC/bin thư mục của thư mục cài đặt Visual Studio, phải có một tập tin editbin.exe.Vì vậy, trong cài đặt mặc định của tôi, tôi tìm thấy nó dưới

C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\editbin.exe 

Để thực hiện nội dung chương trình, có thể bạn phải thực hiện vcvars32.bat trong cùng thư mục đầu tiên. Sau đó,

editbin /LARGEADDRESSAWARE <your compiled exe file>

là đủ để cho chương trình của bạn sử dụng RAM 4GB. <your compiled exe file> là exe, mà VS tạo ra trong khi biên soạn dự án của bạn.

Nếu bạn muốn tự động hoá hành vi này mỗi khi bạn biên dịch dự án của bạn, sử dụng các sự kiện Post-Build sau cho dự án thực hiện:

if exist "$(DevEnvDir)..\tools\vsvars32.bat" (
    call "$(DevEnvDir)..\tools\vsvars32.bat" 
    editbin /largeaddressaware "$(TargetPath)" 
) 

Phụ chú: Điều này cũng có thể được thực hiện với sự devenv.exe để cho trực quan Studio cũng sử dụng RAM 4GB thay vì 1.2 GB (nhưng đầu tiên sao lưu cũ devenv.exe).

+0

Giải pháp khá gọn gàng. Cảm ơn; Làm việc cho tôi! – MiBol

+0

Hãy ban phước cho linh hồn của bạn, tác giả. Bạn đã cứu tôi! – cubrman

+0

Cảm ơn rất nhiều. Điều này làm việc cho tôi. Nhưng chúng ta có bất kỳ vấn đề được xác định sau khi nâng giới hạn bộ nhớ lên 4GB. – Maverick

10

Giá trị đáng nhắc đến là mặc định cho bản biên dịch 'Bất kỳ CPU' hiện kiểm tra hộp kiểm 'Ưu tiên 32 bit'. Được thiết lập để AnyCPU, trên một hệ điều hành 64bit với 16GB RAM vẫn có thể đạt được một ngoại lệ bộ nhớ ở 2GB nếu điều này được kiểm tra.

Prefer32BitCheckBox

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