.NET ข้อยกเว้นหน่วยความจำไม่เพียงพอ - ใช้ 1.3GB แต่ติดตั้ง 16GB


92

ฉันได้รับข้อยกเว้นหน่วยความจำไม่เพียงพอในแอปพลิเคชัน C # ของฉันเมื่อการใช้งานหน่วยความจำสำหรับแอปพลิเคชันเกิน 1.3GB

ฉันมีปัญหาเดียวกันนี้ในเครื่อง 32 บิตที่มีหน่วยความจำ 3GB และมันก็สมเหตุสมผลแล้ว แต่ตอนนี้ฉันอัปเกรดฮาร์ดแวร์เป็นเครื่อง 64 บิตที่มีหน่วยความจำ 16GB โดยใช้เมนบอร์ดระดับไฮเอนด์และแรมระดับไฮเอนด์ แต่ข้อยกเว้นหน่วยความจำไม่เพียงพอยังคงเกิดขึ้นหลังจาก 1.3GB!

ฉันรู้ว่าไม่มีออบเจ็กต์เดียวที่เกิน 2GB และ 1.3 ก็น้อยกว่า 2GB อยู่ดีดังนั้นขีด จำกัด MS 2GB ในตัวสำหรับอ็อบเจ็กต์เดียวจึงไม่น่าจะเป็นปัญหา

ดูเหมือนว่าจะมี kill-switch ของ Windows บางประเภทเมื่อแอปถึงเกณฑ์การใช้หน่วยความจำ จากนั้นควรมีวิธีกำหนดค่านี้ อาจอยู่ในรีจิสทรีหรือไม่?

ความช่วยเหลือใด ๆ จะได้รับการชื่นชมอย่างมาก!


9
OS 64 บิตของคุณด้วยหรือไม่?
fge

9
แม้ว่าระบบปฏิบัติการของคุณจะเป็น 64 บิต แต่ตรวจสอบให้แน่ใจว่ากระบวนการของคุณเป็น 64 บิต (หรือ AnyCPU) ด้วย
Knowleech

คำตอบ:


90

ไม่มีความแตกต่างจนกว่าคุณจะคอมไพล์เป็นสถาปัตยกรรมเป้าหมายเดียวกัน ฉันคิดว่าคุณกำลังรวบรวม32สถาปัตยกรรมบิตในทั้งสองกรณี

เป็นมูลค่าการกล่าวขวัญที่OutOfMemoryExceptionสามารถเพิ่มขึ้นได้หากคุณได้รับ2GBหน่วยความจำที่จัดสรรโดยคอลเลคชันเดียวในCLR (พูดList<T>) ทั้งในสถาปัตยกรรม32และ64บิต

เพื่อให้ได้รับประโยชน์จากความดีของหน่วยความจำบน64สถาปัตยกรรมบิตคุณต้องรวบรวม64สถาปัตยกรรมบิตการกำหนดเป้าหมายรหัสของคุณ หลังจากนั้นตามธรรมชาติไบนารีของคุณจะทำงานเฉพาะใน64บิต แต่จะได้รับประโยชน์จากความเป็นไปได้ที่มีพื้นที่มากขึ้นสามารถใช้ได้ในแรม


1
ใช่ AnyCPU เป็นตัวเลือกเช่นกันโดยที่คุณมีตัวเลือกสำหรับรหัสที่ขึ้นกับสถาปัตยกรรม JIT แต่การกำหนดเป้าหมายสถาปัตยกรรมที่เฉพาะเจาะจงยังคงเป็นประโยชน์ในกรณีที่คุณมีทรัพยากรที่ไม่มีการจัดการ (พูด) ฉันไม่รู้ว่าสถาปัตยกรรมของ OP เกี่ยวกับอะไร
กราน

4
ฉันรู้ว่า :) - ขอบคุณ Tigran ฉันสร้างโซลูชันใหม่ใน x64 และข้อยกเว้นก็หายไป
Paceman

65

ดังที่ได้กล่าวไปแล้วการรวบรวมแอปใน x64 ช่วยให้คุณมีหน่วยความจำที่พร้อมใช้งานมากขึ้น

แต่ในกรณีที่ต้องสร้างแอปใน x86 มีวิธีเพิ่มขีด จำกัด หน่วยความจำจาก 1,2GB เป็น 4GB (ซึ่งเป็นขีด จำกัด จริงสำหรับกระบวนการ 32 บิต):

ในโฟลเดอร์ VC / bin ของไดเร็กทอรีการติดตั้ง Visual Studio ต้องมีeditbin.exeไฟล์ ดังนั้นในการติดตั้งเริ่มต้นของฉันฉันพบว่ามันอยู่ภายใต้

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

เพื่อให้โปรแกรมทำงานได้บางทีคุณอาจต้องดำเนินการvcvars32.batในไดเร็กทอรีเดียวกันก่อน จากนั้นก

editbin /LARGEADDRESSAWARE <your compiled exe file>

ก็เพียงพอที่จะให้โปรแกรมของคุณใช้ RAM 4GB <your compiled exe file>คือ exe ซึ่ง VS สร้างขึ้นในขณะที่รวบรวมโปรเจ็กต์ของคุณ

ถ้าคุณต้องการทำให้พฤติกรรมนี้เป็นอัตโนมัติทุกครั้งที่คุณรวบรวมโปรเจ็กต์ของคุณให้ใช้เหตุการณ์หลังสร้างต่อไปนี้สำหรับโปรเจ็กต์ที่ดำเนินการ:

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

Sidenote: สามารถทำได้เช่นเดียวกันdevenv.exeเพื่อให้ Visual Studio ใช้ RAM 4GB แทน 1.2GB (แต่สำรองข้อมูลเก่าก่อนdevenv.exe)


ขอบคุณมาก. สิ่งนี้ใช้ได้กับฉัน แต่เรามีปัญหาที่ระบุหรือไม่หลังจากเพิ่มขีด จำกัด หน่วยความจำเป็น 4GB
Maverick

28

มูลค่าการกล่าวขวัญว่าค่าเริ่มต้นสำหรับการคอมไพล์ 'CPU ใด ๆ ' จะทำเครื่องหมายในช่องทำเครื่องหมาย "ต้องการ 32 บิต" เมื่อตั้งค่าเป็น AnyCPU บนระบบปฏิบัติการ 64 บิตที่มี RAM 16gb จะยังคงมีข้อยกเว้นหน่วยความจำเหลืออยู่ที่ 2gb หากเลือกไว้

ต้องการ 32BitCheckBox


2
วิธีนี้ช่วยแก้ปัญหาหน่วยความจำไม่
เพียงพอ

2

ดูเหมือนว่าคุณจะมีไฟล์เก็บถาวร 64 บิต แต่เป็นรันไทม์. NET เวอร์ชัน 32 บิตและ / หรือ Windows เวอร์ชัน 32 บิต

ด้วยเหตุนี้พื้นที่ที่อยู่ที่สามารถใช้ได้กับกระบวนการของคุณจึงยังคงเหมือนเดิมไม่มีการเปลี่ยนแปลงจากการตั้งค่าก่อนหน้านี้

อัปเกรดเป็นทั้งระบบปฏิบัติการ 64 บิตและเวอร์ชัน 64 บิต. NET;)


1

แอปพลิเคชันของคุณทำงานเป็นกระบวนการ 64 หรือ 32 บิตหรือไม่ คุณสามารถตรวจสอบได้ในตัวจัดการงาน

อาจเป็นไปได้ว่ามันทำงานเป็น 32 บิตแม้ว่าระบบทั้งหมดจะทำงานบน 64 บิตก็ตาม

หากเป็น 32 บิตไลบรารีของบุคคลที่สามอาจทำให้เกิดสิ่งนี้ แต่ก่อนอื่นตรวจสอบให้แน่ใจว่าแอปพลิเคชันของคุณกำลังรวบรวม "CPU ใด ๆ " ตามที่ระบุไว้ในความคิดเห็น


0

หากคุณมี Windows 32 บิตวิธีนี้จะไม่ทำงานหากไม่มีการตั้งค่าต่อไปนี้

  1. เรียกใช้พร้อมต์ cmd.exe (สำคัญ: Run As Administrator)
  2. พิมพ์ bcdedit.exe แล้วเรียกใช้
  3. ดูที่พารามิเตอร์ "เพิ่มขึ้น" และไม่มีแล้วเขียนข้อความต่อไปนี้
  4. bcdedit / set เพิ่มขึ้น userva 3072
  5. และอีกครั้งขั้นตอนที่ 2 และตรวจสอบพารามิเตอร์

เราได้เพิ่มการตั้งค่านี้และบล็อกนี้ก็เริ่มต้นขึ้น

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

ข้อมูลเพิ่มเติม - คำสั่งincreaseuserva: https://docs.microsoft.com/en-us/windows-hardware/drivers/devtest/bcdedit--set

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.