keluar dari kehabisan memori pengecualian di aplikasi yang dikelola yang dijalankan di 64-bit .NET Framework

PENTING: Artikel ini diterjemahkan oleh perangkat lunak penerjemahan mesin Microsoft, dan mungkin telah diedit oleh Masyarakat Microsoft melalui teknologi CTF dan bukan oleh seorang penerjemah profesional. Microsoft menawarkan baik artikel yang diterjemahkan oleh manusia maupun artikel hasil editan terjemahan oleh mesin/komunitas, sehingga Anda dapat mengakses semua artikel di Sentra Pengetahuan yang kami miliki dalam berbagai bahasa. Namun artikel hasil editan mesin atau bahkan komunitas tidak selalu sempurna. Artikel ini dapat mengandung kesalahan dalam hal kosa kata, sintaksis atau tatabahasa, sangat mirip dengan penutur asing yang membuat kekeliruan ketika berbicara dalam bahasa Anda. Microsoft tidak bertanggung jawab atas ketidakakuratan, kesalahan atau kerugian apa pun akibat dari kekeliruan dalam penerjemahan isi atau penggunaannya oleh pelanggan kami. Microsoft juga akan senantiasa memperbarui perangkat lunak penerjemahan mesin dan alat untuk menyempurnakan Editan Hasil Penerjemahan Mesin.

Klik disini untuk melihat versi Inggris dari artikel ini: 3152158
Gejala
Anda memiliki aplikasi yang dikelola yang mentargetkan 64-bit Microsoft .NET Framework 4.6.1. Aplikasi ini mengeliminasi pengecualian out kehabisan memori dari CLR pesan khusus berikut ini:

OutOfMemoryException: "memori tidak cukup berada dalam kisaran ruang alamat penyuratan tertentu untuk melanjutkan eksekusi program."
Penyebab
Pengecualian out kehabisan memori ini disebarkan dengan CLR ketika kode manajer subsistem tidak dapat mengalokasikan kehabisan memori berada dalam kisaran ruang alamat penyuratan tertentu untuk berbahasa langsung. (Ini jump berbahasa terkait dengan metode yang memanggil antara dll yang terdapat 2 GB atau lebih terpisah di ruang alamat penyuratan.) Harus ada ruang radius 2 GB memanggil metode untuk menyimpan rintisan langsung untuk panggilan metode 64-bit. Ada cara aman untuk aplikasi untuk pulih dari galat spesifik ini. Oleh karena itu, status aplikasi setelah mengalami galat ini tidak diketahui dan harus dianggap rusak. Satu-satunya cara untuk memulihkan adalah untuk restart aplikasi.
Teknik pemecahan masalah
Untuk mengatasi masalah ini, gunakan salah satu metode pengaturan berikut ini:
  • Menerapkan pengaturan satu mesin dengan menambahkan bukti kunci registri dan nilai:

    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework

    NGenReserveForjumpStubs= dword:00000005

  • Menerapkan pengaturan level aplikasi dengan menambahkan (atau penggabungan) bagian berikut ini ke file konfigurasi aplikasi:
    <configuration>    <runtime> <NGenReserveForJumpStubs value="5" />    </runtime></configuration>
Penjelasan: NGenReserveForJumpStubs menyebabkan CLR untuk memesan persentase ruang alamat penyuratan untuk berbahasa langsung di setiap gambar NGen dimuat. Kami sarankan Anda menggunakan nilai 5 atau lebih besar jika Anda mengalami pengecualian OutOfMemory ini.
Informasi lebih lanjut

Bagi pengembang

  • .NET Framework menyandikan metode panggilan sebagai relatif lompatan 32-bit untuk alasan kinerja. Pada sistem 64-bit, pemanggil dan callee dapat lebih terpisah dari 2 GB (ruang alamat). Karena ini melebihi kisaran alamat penyuratan offset 32-bit ditandatangani, .NET akan membuat rintisan langsung dalam 2 GB pemanggil. Ini disebut dengan jump rintisan dapat kemudian membuat "lama" langsung ke mana saja di ruang alamat penyuratan 64-bit.
  • JIT dan NGen mitigations bekerja sedikit berbeda. Keduanya cadangan ruang alamat penyuratan tambahan depan, tetapi titik mana reservasi ini dibuat berbeda antara dua.
  • NGenReserveForJumpStubs adalah persentase (ukuran gambar NGen) virtualpercentReserveForJumpStubs).
  • Rintisan khas langsung adalah 12 bita. Untuk informasi selengkapnya, lihat JUMP_ALLOCATE_SIZE.
  • kehabisan memori dialokasikan dan dilindungi undang-undang mendekati alamat penyuratan di mana gambar NGen dimuat (algoritma yang tepat adalah EEJitManager::EnsureJumpStubReserve). kehabisan memori berkomitmen perlu mengalokasikan rintisan langsung, dan ketika ada tidak ada ruang alamat penyuratan cocok lain yang tersedia.
  • Mitigasi disebutkan sebelumnya tidak mengubah konten NGen gambar. Gambar NGen memiliki jejak disk yang sama dengan dan tanpa mitigasi.
  • Ada saat ini tidak ada cara yang baik untuk mendeteksi ketika aplikasi mendapatkan mendekati batas. Anda harus monitor untuk OutOfMemoryException untuk menentukan apakah ruang reserved cukup.
  • Anda mungkin menerima OutOfMemoryException bahkan jika ada banyak kehabisan memori tidak digunakan karena galat spesifik ini berkaitan dengan ketersediaan kehabisan memori radius kisaran alamat penyuratan 2 GB pemanggil.
  • Anda tidak boleh mengubah nilai asali dari CodeHeapReserveForJumpStubs, karena itu mungkin tidak berkaitan dengan masalah yang dijelaskan di atas. Kita tidak melihat kasus yang mana aplikasi yang sebenarnya harus menyesuaikan setelan ini untuk mengatasinya.
  • Pengaturan NGenReserveForJumpStubs ke nilai yang jauh lebih tinggi dapat menyebabkan kinerja dan mengurangi risiko memperlihatkan masalah halus lainnya.

Untuk pengguna TI

  • Masalah ini juga dapat terjadi pada versi .NET Framework lainnya. Namun, solusi saat ini hanya berlaku untuk .NET Framework 4.6.1.
  • Ini adalah masalah yang sangat jarang yang hanya mempengaruhi beban kerja sangat besar yang memiliki pola eksekusi yang sangat khusus. Lebih dari 99 persen dari semua beban kerja akan mengalami masalah ini.
  • Setelah aplikasi mengeliminasi OutOfMemory pengecualian, satu-satunya cara yang disarankan untuk memulihkan adalah untuk restart aplikasi.

Peringatan: Artikel ini telah diterjemahkan secara otomatis

Properti

ID Artikel: 3152158 - Tinjauan Terakhir: 05/10/2016 16:50:00 - Revisi: 3.0

Microsoft .NET Framework 4.6.1

  • kbsurveynew kbtshoot kbexpertiseinter kbmt KB3152158 KbMtid
Tanggapan