2009-04-29 31 views
12

Tôi có ứng dụng C# phải liên kết với thư viện 32 bit và cũng cần sử dụng số lượng bộ nhớ tối đa có thể (ứng dụng hình ảnh); chúng tôi chạy ứng dụng trên máy tính để bàn XP64, do đó chúng tôi đang sử dụng WOW64, nhắm mục tiêu xây dựng trong Visual Studio cho x86 (và thực hiện một bài đăng sau khi xây dựng editbin /largeaddressaware). Chúng tôi đang gặp phải một vài vấn đề:Phát triển và gỡ lỗi mem-hogging C# apps

  • Trong Visual Studio tích hợp trình gỡ lỗi, chúng tôi chỉ có thể bao giờ sử dụng 2GB bộ nhớ (~ 1.5GB để ứng dụng, cộng thêm chi phí)

  • Chạy từ dòng lệnh, ứng dụng có thể thấy 3gb bộ nhớ, nhưng các tài liệu của Microsoft dường như nói rằng chúng ta sẽ thấy 4gb.

Bất cứ ai có thể cho tôi biết cách tải ứng dụng WOW64 C# để xem toàn bộ 4GB mà nền tảng có thể cung cấp?

Ngoài ra, bất cứ ai có thể cho tôi biết làm thế nào để có được trình gỡ lỗi Visual Studio (VS 2008, còn được gọi là VS90) tuân theo bit /largeaddressaware và dừng giới hạn bộ nhớ ứng dụng xuống 2GB?

Tôi thấy cùng một hành vi trong VS80 và VS90; cũng không có sự khác biệt giữa .NET Framework 3.5, 3.0 và 2.0. Đây là một chương trình C# tầm thường minh họa các vấn đề; xây dựng cho x86, editbin /largeaddressaware, sau đó chạy trong trình gỡ lỗi tích hợp so với chạy từ dòng lệnh để xem sự khác biệt trong bộ nhớ có sẵn cho C#.

namespace MemoryAllocTest 
{ 
class Program 
{ 
    static void Main(string[] args) 
    { 
     const int allocSize = 1024 * 1024; 
     List<byte[]> myMem = new List<byte[]>(); 
     UInt64 totalAlloc = 0; 

     while (true) 
     { 
      myMem.Add(new byte[allocSize]); 
      totalAlloc += allocSize; 
      Console.WriteLine("{0} allocs: {1}MB total", 
      myMem.Count, totalAlloc/(1024 * 1024)); 
     } 
    } 
} 
} 
+0

Bạn có thể chạy editbin trên các tệp MSIL exe không? –

Trả lời

2

Từ Microsoft:

Không gian địa chỉ ảo của tiến trình và các ứng dụng vẫn còn hạn chế đến 2 GB trừ trường hợp chuyển đổi/3GB được sử dụng trong lại file Boot.ini. Khi RAM vật lý trong hệ thống vượt quá 16 GB và chuyển đổi/3 GB được sử dụng, hệ điều hành sẽ bỏ qua RAM bổ sung cho đến khi nút chuyển/3GB bị xóa. Điều này là do kích thước tăng của hạt nhân cần thiết để hỗ trợ nhiều hơn Trang mục nhập bảng. Giả định là làm cho quản trị viên thay vì không mất chức năng/3GB âm thầm và tự động; do đó, yêu cầu quản trị viên phải thay đổi rõ ràng cài đặt này. Nút chuyển đổi/3 GB phân bổ 3 GB không gian địa chỉ ảo cho ứng dụng sử dụng IMAGE_FILE_LARGE_ADDRESS_AWARE trong tiêu đề quy trình. Công tắc này cho phép ứng dụng giải quyết 1 GB số không gian địa chỉ ảo bổ sung trên 2 GB.

+0

Bộ chuyển đổi/3GB (được gọi là thông số điều chỉnh 4GT) không áp dụng cho hệ điều hành 64 bit. Xem thêm: http://msdn.microsoft.com/en-us/library/aa366778.aspx –

2

Bạn đang sử dụng phiên bản .NET chính xác nào? This Connect report là về cùng một vấn đề (như xa như tôi có thể nói), nhìn thấy trên .NET 2.0 nhưng cố định trong .NET 2.0SP1.

Nếu máy x64 của bạn không có 2.0SP1 (hoặc mới hơn) trên, nó có giá trị một thử ...

+0

Cảm ơn con trỏ - nhưng không may mắn! Tôi có 3.5sp1 và tất cả các phiên bản hỗ trợ/bao gồm (2,0, 3,0, 3,5) tất cả cho thấy hành vi 3gb .... Drat. –

+0

Và tò mò, phần bổ sung quan trọng tất cả kb cố định thành 3.5sp1 không áp dụng cho XP64. –

1

Bạn có thể gửi nơi nó ngụ ý rằng bạn có thể xem tất cả 4 GB?Ooh, có lẽ ở đây: thông tin Thú vị at this link

Chênh lệch Addressable Memory

Điều đầu tiên hầu hết các nhà phát triển nhận thấy là bộ vi xử lý 64-bit cung cấp một bước nhảy vọt lớn trong số tiền của vật chất và bộ nhớ ảo có thể được gọi là .

* 32-bit applications on 32-bit platforms can address up to 2 GB 
* 32-bit applications built with the /LARGEADDRESSAWARE:YES linker flag 

trên 32-bit Windows XP hoặc Windows Server 2003 với tùy chọn khởi động đặc biệt/3gb thể địa chỉ lên đến 3 GB. Điều này ràng buộc hạt nhân để chỉ 1 GB có thể gây ra một số trình điều khiển và/hoặc dịch vụ không thành công.

* 32-bit applications built with the /LARGEADDRESSAWARE:YES linker flag 

trên các phiên bản 32-bit của Windows Vista, và trên các phiên bản 32-bit của Windows server Code Name "Longhorn" hoạt động hệ thống, có thể giải quyết bộ nhớ lên đến số xác định bởi các cấu hình khởi động phần tử dữ liệu (BCD) TăngUserVa. TăngUserVa có thể có giá trị từ 2048, mặc định là , đến 3072 (khớp với số lượng bộ nhớ được cấu hình theo tùy chọn khởi động /3gb trên Windows XP). phần còn lại của 4 GB được phân bổ cho hạt nhân và có thể dẫn đến lỗi cấu hình trình điều khiển và dịch vụ .

Để biết thêm thông tin về BCD, hãy xem Dữ liệu cấu hình khởi động trên MSDN.

* 32-bit applications on 64-bit platforms can address up to 2 GB, or up 

đến 4 GB với/LARGEADDRESSAWARE: CÓ cờ liên kết. * Ứng dụng 64 bit sử dụng 43 bit để xử lý, cung cấp 8 TB địa chỉ ảo cho các ứng dụng và 8 TB dành riêng cho hạt nhân.

Vì vậy, có vẻ như bạn nên (trên một mục tiêu XP64) có thể thấy 4 GB.

2

Tôi đã tạo ứng dụng mẫu đơn giản của bạn từ bài đăng, đã gặp sự cố và đính kèm WinDbg vào nó.

!address -summary sẽ hiển thị cho bạn không gian địa chỉ chế độ người dùng hiệu quả cho quy trình.

0:003> !address -summary 
TEB fffdd000 in range fffdb000 fffde000 
TEB fffda000 in range fffd8000 fffdb000 
TEB fffd7000 in range fffd5000 fffd8000 
TEB fffaf000 in range fffad000 fffb0000 
ProcessParametrs 004c2b40 in range 004c0000 00535000 
Environment 004c1978 in range 004c0000 00535000 

-------------------- Usage SUMMARY -------------------------- 
    TotSize (  KB) Pct(Tots) Pct(Busy) Usage 
    e7d2e000 (3798200) : 90.56% 98.77% : RegionUsageIsVAD 
    1547b000 ( 348652) : 08.31% 00.00% : RegionUsageFree 
    2887000 ( 41500) : 00.99% 01.08% : RegionUsageImage 
    3ff000 ( 4092) : 00.10% 00.11% : RegionUsageStack 
      0 (  0) : 00.00% 00.00% : RegionUsageTeb 
    1c0000 ( 1792) : 00.04% 00.05% : RegionUsageHeap 
      0 (  0) : 00.00% 00.00% : RegionUsagePageHeap 
     1000 (  4) : 00.00% 00.00% : RegionUsagePeb 
      0 (  0) : 00.00% 00.00% : RegionUsageProcessParametrs 
      0 (  0) : 00.00% 00.00% : RegionUsageEnvironmentBlock 
     **Tot: ffff0000 (4194240 KB)** Busy: eab75000 (3845588 KB) 

-------------------- Type SUMMARY -------------------------- 
    TotSize (  KB) Pct(Tots) Usage 
    1547b000 ( 348652) : 08.31% : <free> 
    2aa3000 ( 43660) : 01.04% : MEM_IMAGE 
    1f6a000 ( 32168) : 00.77% : MEM_MAPPED 
    e6168000 (3769760) : 89.88% : MEM_PRIVATE 

-------------------- State SUMMARY -------------------------- 
    TotSize (  KB) Pct(Tots) Usage 
    db838000 (3596512) : 85.75% : MEM_COMMIT 
    1547b000 ( 348652) : 08.31% : MEM_FREE 
    f33d000 ( 249076) : 05.94% : MEM_RESERVE 

Largest free region: Base fbfc0000 - Size 03fed000 (65460 KB) 

Dựa trên Tot: ffff0000 (4194240 KB), chúng tôi có 4GB không gian chế độ người dùng hiệu quả.

Ngoài ra, khối miễn phí lớn nhất của chúng tôi là 65,460KB, điều này có nghĩa là chúng tôi có thể phân bổ nhiều bộ nhớ hơn.

5

bất cứ ai có thể cho tôi biết làm thế nào để có được Visual Studio (VS 2008, hay còn gọi là VS90) debugger để tuân theo/LARGEADDRESSAWARE bit và dừng giới hạn bộ nhớ ứng dụng 2GB?

Điều này đòi hỏi hai bước - cả trong các thuộc tính dự án:

  • trên tab xây dựng các sự kiện, thiết lập một bước postbuild để chạy editbin /largeaware $ (TargetPath)
  • trên tab gỡ lỗi, bỏ chọn Bật Visual Studio lưu trữ quy trình

Với hai bước này, bạn chương trình đơn giản đang chạy đến 3045MB

+0

Dave, cảm ơn vì điều này - bỏ chọn 'bật quá trình lưu trữ phòng thu trực quan' đã thực sự tải ứng dụng lên 3gb. Nhưng làm thế nào để đi khoảng cách cuối cùng đến 4GB?! Cảm ơn bạn một lần nữa! –

3

Nhờ mọi người đã trả lời; trang web này thực sự đá!

Dường như chúng tôi thực sự nhận được không gian người dùng 4GB trong WOW64, nhưng dường như với tôi (phỏng đoán nhẹ) rằng chi phí thu gom rác (hoặc có thể là mức an toàn) trở nên lớn do bộ nhớ được cấp phát bởi mã được quản lý phát triển. Chạy ứng dụng thử nghiệm của tôi trên WOW64 (dòng lệnh, với LARGEADDRESSAWARE), tôi nhận được tổng số phân bổ là 3175MB; chạy trên một máy WIN32 XP với bộ tham số 4GT, tôi nhận được tổng số phân bổ là 2857MB: do đó, một gig đầy đủ bộ nhớ chế độ người dùng bổ sung sẽ tăng chỉ 318MB ở cấp ứng dụng C#!

(Tôi đã sửa đổi chương trình thử nghiệm của mình giảm một nửa kích thước đơn vị phân bổ khi phân bổ không thành công và cũng đã thêm các cuộc gọi để thu gom rác một cách chiến lược trong nỗ lực vượt quá giới hạn của ứng dụng 'bình thường' có thể lấy - thả ghi chú ở đây nếu bạn muốn tôi đăng mã đã sửa đổi.)

Dù sao, cảm ơn mọi người; có vẻ như hệ thống đang hoạt động chính xác nhưng môi trường được quản lý sẽ được cải thiện ít hơn so với bộ nhớ bổ sung của bộ nhớ so với dự kiến.

+0

Như một lưu ý cuối cùng, tôi sẽ đề cập đến rằng khi tôi loại bỏ bit LARGEADDRESSAWARE, tôi nhận được tổng số phân bổ là 1,9 GB trên cả WOW64 và XP32. Vì vậy, tò mò, chuyển từ bộ nhớ 2GB sang bộ nhớ 3GB mang lại lợi ích đầy đủ cho cấp ứng dụng C#, nhưng việc di chuyển từ bộ nhớ 3GB sang bộ nhớ người dùng 4GB (môi trường WOW64) chỉ mang lại mức ứng dụng C# một lợi ích ~ 320MB. ... –

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