Excepción de la memoria en una aplicación administrada que se ejecuta en el.NET Framework de 64 bits

IMPORTANTE: Este artículo ha sido traducido por un software de traducción automática de Microsoft (http://support.microsoft.com/gp/mtdetails) en lugar de un traductor humano. Microsoft le ofrece artículos traducidos por un traductor humano y artículos traducidos automáticamente para que tenga acceso en su propio idioma a todos los artículos de nuestra base de conocimientos (Knowledge Base). Sin embargo, los artículos traducidos automáticamente pueden contener errores en el vocabulario, la sintaxis o la gramática, como los que un extranjero podría cometer al hablar el idioma. Microsoft no se hace responsable de cualquier imprecisión, error o daño ocasionado por una mala traducción del contenido o como consecuencia de su utilización por nuestros clientes. Microsoft suele actualizar el software de traducción frecuentemente.

Haga clic aquí para ver el artículo original (en inglés): 3152158
Síntomas
Tiene una aplicación administrada que tiene como destino de.NET Framework de Microsoft de 64 bits 4.6.1. Esta aplicación, produce una excepción de la memoria de CLR con el siguiente mensaje específico:

OutOfMemoryException: "memoria insuficiente dentro del intervalo de direcciones especificado espacio para continuar con la ejecución del programa."
Causa
Esta excepción de la memoria se propaga por el CLR cuando el subsistema administrador de código no puede asignar la memoria dentro de un intervalo de espacio de direcciones específico de código auxiliar de salto. (Estos códigos auxiliares de saltar corresponden al método que llama entre archivos DLL que se encuentran a 2 GB o más separados en el espacio de direcciones.) Debe haber espacio dentro de un radio de 2 GB de método de llamada para almacenar el código auxiliar de salto para una llamada al método de 64 bits. No hay ningún método seguro para una aplicación para recuperarse de este error específico. Por lo tanto, se desconoce el estado de la aplicación después de detectar este error y se debe considerar dañado. Es la única manera de recuperar reiniciar la aplicación.
Solución
Para evitar este problema, utilice uno de los siguientes métodos de configuración:
  • Implementar una configuración de todo el equipo agregando la siguiente clave del registro y valor:

    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework

    NGenReserveForjumpStubs= dword:00000005

  • Implementar una configuración de nivel de aplicación agregando (o combinación) la siguiente sección al archivo de configuración de la aplicación:
    <configuration>    <runtime> <NGenReserveForJumpStubs value="5" />    </runtime></configuration>
Explicación: NGenReserveForJumpStubs hace que el CLR reservar un porcentaje del espacio de direcciones de código auxiliar de salto cerca de cada imagen cargada de NGen. Se recomienda utilizar un valor de 5 o superior si experimenta esta excepción OutOfMemory.
Más información

Para los desarrolladores

  • El.NET Framework codifica el método llamadas como saltos de 32-bit relativas por motivos de rendimiento. En un sistema de 64 bits, llamador y destinatario pueden estar más separados de 2 GB (en el espacio de direcciones). Dado que esto supera el intervalo de direcciones de un desplazamiento de 32 bits con signo, NET creará un código auxiliar de salto dentro de 2 GB del llamador. Este salto de código auxiliar pueden entonces hacer "larga" salta en cualquier lugar en el espacio de direcciones de 64 bits.
  • Las mitigaciones de JIT y NGen funcionan de forma ligeramente distinta. Ambos reservan espacio de direcciones adicional por adelantado, pero el punto en que se haga esta reserva difiere entre los dos.
  • NGenReserveForJumpStubs es un porcentaje del tamaño de imagen () virtual NGenpercentReserveForJumpStubs).
  • Un código auxiliar de salto típico es de 12 bytes. Para obtener más información, vea JUMP_ALLOCATE_SIZE.
  • La memoria asignada y reservada cerca de la dirección donde se ha cargado la imagen NGen (el algoritmo exacto es EEJitManager::EnsureJumpStubReserve). La memoria se confirma cuando hay una necesidad de asignar un código auxiliar de salto, y cuando no hay ningún otro espacio de direcciones adecuado disponible.
  • La mitigación mencionada anteriormente no modifica el contenido de las imágenes de NGen. Las imágenes de NGen tienen la misma superficie del disco con y sin reducción.
  • Actualmente no hay ninguna buena manera de detectar cuando la aplicación se está aproximando al límite. Debe supervisar el OutOfMemoryException determinar si el espacio reservado es suficiente.
  • Puede recibir la excepción OutOfMemoryException incluso si hay mucha memoria no utilizada, ya que este error específico está relacionado con la disponibilidad de memoria en un radio de intervalo de direcciones de 2 GB del llamador.
  • No debe cambiar el valor predeterminado de CodeHeapReserveForJumpStubs, ya que puede no estar relacionado con el problema descrito anteriormente. No hemos visto casos donde la aplicación real tendría para ajustar esta configuración como una solución temporal.
  • Establecer NGenReserveForJumpStubs en un valor significativamente superior puede conducir a disminución del rendimiento y el riesgo de exponer otros problemas sutiles.

Los usuarios de TI

  • Este problema también puede producirse en otras versiones de la de.NET Framework. Sin embargo, la solución actualmente sólo es aplicable a los de.NET Framework 4.6.1.
  • Éste es un problema muy raro que sólo afecta a las cargas de trabajo muy grandes que tienen un modelo de ejecución muy concreta. Más del 99 por ciento de todas las cargas de trabajo nunca experimentarán este problema.
  • Después de la aplicación inicia una excepción OutOfMemory, es el único método recomendado para recuperar reiniciar la aplicación.

Advertencia: este artículo se tradujo automáticamente

Propiedades

Id. de artículo: 3152158 - Última revisión: 05/10/2016 16:40:00 - Revisión: 3.0

Microsoft .NET Framework 4.6.1

  • kbsurveynew kbtshoot kbexpertiseinter kbmt KB3152158 KbMtes
Comentarios