Ngoại lệ hết bộ nhớ trong quản lý ứng dụng đang chạy trên 64-bit Khuôn khổ .NET

QUAN TRỌNG: Bài viết này được dịch bằng phần mềm dịch thuật của Microsoft và có thể được Cộng đồng Microsoft chỉnh sửa lại thông qua công nghệ CTF thay vì một biên dịch viên chuyên nghiệp. Microsoft cung cấp các bài viết được cả biên dịch viên và phần mềm dịch thuật thực hiện và cộng đồng chỉnh sửa lại để bạn có thể truy cập vào tất cả các bài viết trong Cơ sở Kiến thức của chúng tôi bằng nhiều ngôn ngữ Tuy nhiên, bài viết do máy dịch hoặc thậm chí cộng đồng chỉnh sửa sau không phải lúc nào cũng hoàn hảo. Các bài viết này có thể chứa các sai sót về từ vựng, cú pháp hoặc ngữ pháp, Microsoft không chịu trách nhiệm về bất kỳ sự thiếu chính xác, sai sót hoặc thiệt hại nào do việc dịch sai nội dung hoặc do hoạt động sử dụng của khách hàng gây ra.

Nhấp chuột vào đây để xem bản tiếng Anh của bài viết này: 3152158
Triệu chứng
Bạn có một ứng dụng quản lý 64-bit Microsoft Khuôn khổ .NET 4.6.1 nhắm mục tiêu. Ứng dụng này gây ra ngoại lệ hết bộ nhớ từ CLR với thông báo cụ thể sau:

OutOfMemoryException: "không đủ bộ nhớ trong phạm vi địa chỉ định dung lượng để tiếp tục thực hiện chương trình."
Nguyên nhân
Ngoại lệ hết bộ nhớ này được chuyển vào CLR khi hệ thống quản lí mã không thể cấp phát bộ nhớ trong phạm vi dấu kiểm địa chỉ cụ thể cho nhảy khai. (Các nhảy khai tương ứng với phương pháp gọi trong dll nằm 2 GB hoặc khác nhau trong không gian địa chỉ.) Phải có dung lượng trong bán kính 2 GB gọi phương pháp để lưu trữ ngẫu nhiên bước cho cuộc gọi phương pháp 64-bit. Có một cách không an toàn cho ứng dụng để khôi phục từ lỗi cụ thể này. Do đó, ứng dụng sau khi gặp phải lỗi này là không xác định và nó sẽ được coi là bị hỏng. Cách duy nhất để khôi phục là khởi động lại ứng dụng.
Cách giải quyết khác
Để khắc phục sự cố này, sử dụng một trong các phương pháp cài đặt chuyên biệt sau:
  • Thực hiện cài đặt chuyên biệt phạm vi máy bằng cách thêm các khoá kiểm nhập sau và giá trị:

    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework

    NGenReserveForjumpStubs= dword:00000005

  • Thực hiện một cài đặt chuyên biệt ứng dụng cấp bằng cách thêm (hoặc ghép) phần tệp cấu hình ứng dụng sau:
    <configuration>    <runtime> <NGenReserveForJumpStubs value="5" />    </runtime></configuration>
Giải thích: NGenReserveForJumpStubs khiến CLR dự trữ phần trăm không gian địa chỉ cho bài nhảy gần mỗi NGen tải ảnh. Chúng tôi khuyên bạn sử dụng giá trị 5 hoặc cao hơn nếu bạn đang gặp phải trường hợp ngoại lệ OutOfMemory này.
Thông tin thêm

Dành cho nhà phát triển

  • Khuôn khổ .NET mã hoá phương pháp gọi là tương đối 32-bit nhảy vì lý do hiệu suất. Trên hệ thống 64-bit, gọi và callee có thể thêm nhỏ hơn 2 GB (trong không gian địa chỉ). Bởi vì điều này vượt quá phạm vi địa chỉ bù 32-bit ký, .NET sẽ tạo ngẫu nhiên nhảy trong 2 GB người gọi. Nhảy ngẫu nhiên có thể này thì hãy "dài" chuyển sang bất kỳ vùng nào trong không gian địa chỉ 64-bit.
  • JIT và NGen mitigations hoạt động hơi khác nhau. Cả hai dự trữ không gian địa chỉ phụ trước, nhưng điểm nơi dự phòng này được thực hiện khác nhau giữa hai.
  • NGenReserveForJumpStubs là một phần trăm ảo NGen ảnh kích thước (percentReserveForJumpStubs).
  • Khai nhảy điển hình là 12 byte. Để biết thêm thông tin, hãy xem JUMP_ALLOCATE_SIZE.
  • Bộ nhớ được phân bổ và dành gần địa chỉ nơi ảnh NGen đã được nạp (thuật toán chính xác là EEJitManager::EnsureJumpStubReserve). Bộ nhớ là cam khi cần phân bổ ngẫu nhiên nhảy khi có sẵn không gian địa chỉ phù hợp khác.
  • Giảm thiểu được đề cập trước đây không sửa đổi nội dung của hình ảnh NGen. Hình ảnh NGen có đĩa chân cùng với và không có giảm nhẹ.
  • Hiện không có cách nào tốt để phát hiện khi ứng dụng được gần đạt giới hạn. Bạn phải theo dõi cho OutOfMemoryException để xác định không gian dành riêng là đủ.
  • Bạn có thể nhận được OutOfMemoryException ngay cả khi có nhiều bộ nhớ sử dụng do lỗi cụ thể này có liên quan đến sự sẵn có của bộ nhớ trong bán kính khoảng 2 GB địa chỉ của người gọi.
  • Bạn không nên thay đổi giá trị mặc định của CodeHeapReserveForJumpStubs, bởi vì nó không có liên quan đến sự cố được mô tả ở trên. Chúng tôi không thấy trường hợp trong đó ứng dụng thực tế sẽ phải điều chỉnh thiết đặt này như một giải pháp.
  • Thiết lập NGenReserveForJumpStubs giá trị cao có thể dẫn đến giảm hiệu suất và nguy cơ lộ vấn đề tinh tế khác.

Đối với người dùng đó

  • Vấn đề này cũng có thể xảy ra trên các phiên bản Khuôn khổ .NET. Tuy nhiên, giải pháp áp dụng hiện nay chỉ cho Khuôn khổ .NET 4.6.1.
  • Đây là một vấn đề rất hiếm chỉ ảnh hưởng đến các luồng công việc rất lớn có kiểu rất cụ thể thực hiện. Hơn 99 phần trăm của tất cả các luồng công việc sẽ không gặp vấn đề này.
  • Sau khi ứng dụng gây ra ngoại lệ OutOfMemory, được giới thiệu cách duy nhất để khôi phục là khởi động lại ứng dụng.

Cảnh báo: Bài viết này được dịch tự động

Властивості

Ідентифікатор статті: 3152158 – останній перегляд: 05/10/2016 19:37:00 – виправлення: 2.0

Microsoft .NET Framework 4.6.1

  • kbsurveynew kbtshoot kbexpertiseinter kbmt KB3152158 KbMtvi
Зворотний зв’язок