Momentan sunteți offline, așteptați să vă reconectați la internet

Exceção de falta de memória em um aplicativo gerenciado que está executando o.NET Framework de 64 bits

IMPORTANTE: Este artigo foi traduzido pelo software de tradução automática da Microsoft e eventualmente pode ter sido editado pela Microsoft Community através da tecnologia Community Translation Framework (CTF) ou por um tradutor profissional. A Microsoft oferece artigos traduzidos automaticamente por software, por tradutores profissionais e editados pela comunidade para que você tenha acesso a todos os artigos de nossa Base de Conhecimento em diversos idiomas. No entanto, um artigo traduzido pode conter erros de vocabulário, sintaxe e/ou gramática. A Microsoft não é responsável por qualquer inexatidão, erro ou dano causado por qualquer tradução imprecisa do conteúdo ou por seu uso pelos nossos clientes.

Clique aqui para ver a versão em Inglês deste artigo: 3152158
Sintomas
Você tem um aplicativo gerenciado que tem como alvo o.NET Framework de Microsoft de 64-bit 4.6.1. Este aplicativo lança uma exceção de memória insuficiente de CLR com a seguinte mensagem específica:

OutOfMemoryException: "memória insuficiente no intervalo de espaço de endereço especificado para continuar a execução do programa".
Causa
Essa exceção de memória insuficiente é propagada pelo CLR quando o subsistema do Gerenciador de código não é possível alocar memória dentro de um intervalo de espaço de endereço específico para stubs de salto. (Esses stubs de salto corresponde ao método que chama DLLs que estão localizados entre os 2 GB ou mais afastado no espaço de endereçamento.) Deve haver espaço dentro de um raio de 2 GB do método chamado para armazenar o stub de salto para uma chamada de método de 64 bits. Não há nenhuma maneira segura de um aplicativo para recuperar após esse erro específico. Portanto, o estado do aplicativo depois de encontrar o erro é desconhecido e deve ser considerado corrompido. A única maneira de recuperar é reiniciar o aplicativo.
Como Contornar
Para contornar esse problema, use um dos seguintes métodos de configuração:
  • Implemente uma configuração de máquina, adicionando a seguinte chave do registro e o valor:

    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework

    NGenReserveForjumpStubs= dword:00000005

  • Implementar uma configuração de nível de aplicativo, adicionando (ou mesclar) a seção a seguir ao arquivo de configuração de aplicativo:
    <configuration>    <runtime> <NGenReserveForJumpStubs value="5" />    </runtime></configuration>
Explicação: NGenReserveForJumpStubs faz com que o CLR reservar uma porcentagem do espaço de endereço de salto stubs perto de cada imagem carregada do NGen. Recomendamos que você use um valor de 5 ou superior, se houver essa exceção OutOfMemory.
Mais Informações

Para desenvolvedores

  • O.NET Framework codifica método chamadas como relativos saltos de 32 bits por motivos de desempenho. Em um sistema de 64 bits, chamador e o receptor podem ser ainda mais que 2 GB (no espaço de endereço). Como isso excede o intervalo de endereço de um deslocamento de 32 bits assinado, .NET criará um stub de salto dentro de 2 GB do chamador. Esse salto stub pode, então, fazer "longa" vai para qualquer lugar no espaço de endereçamento de 64 bits.
  • Atenuações JIT e NGen funcionam de modo ligeiramente diferente. Ambos reservar espaço de endereço adicional com antecedência, mas o ponto em que essa reserva é feita difere entre os dois.
  • NGenReserveForJumpStubs é uma porcentagem do virtual (de tamanho de imagem NGenpercentReserveForJumpStubs).
  • Um stub de salto típico é de 12 bytes. Para obter mais informações, consulte JUMP_ALLOCATE_SIZE.
  • A memória é alocada e reservada perto o endereço onde a imagem NGen foi carregada (o algoritmo exato é EEJitManager::EnsureJumpStubReserve). A memória é confirmada quando há a necessidade de alocar um stub de salto e quando não há nenhum outro espaço de endereço adequado disponível.
  • A atenuação mencionada anteriormente não modifica o conteúdo de imagens NGen. As imagens NGen têm o mesmo espaço de disco com e sem atenuação.
  • Atualmente é uma boa maneira de detectar quando o aplicativo está recebendo próximo ao limite. Você deve monitorar a OutOfMemoryException determinar se o espaço reservado é suficiente.
  • Você pode receber a OutOfMemoryException, mesmo se houver uma grande quantidade de memória não utilizada, porque esse erro específico está relacionado à disponibilidade de memória dentro de um raio de intervalo de endereço de 2 GB do chamador.
  • Você não deve alterar o valor padrão de CodeHeapReserveForJumpStubs, porque ele não pode estar relacionado ao problema descrito acima. Não vimos casos em que o aplicativo real teria para ajustar essa configuração como uma solução alternativa.
  • Definir NGenReserveForJumpStubs para um valor significativamente maior pode levar à redução de desempenho e o risco de expor outras questões sutis.

Para os usuários de TI

  • Esse problema também pode ocorrer em outras versões do.NET Framework. No entanto, a solução é aplicável somente para o.NET Framework 4.6.1 no momento.
  • Este é um problema muito raro que afeta apenas as cargas de trabalho muito grandes com um padrão de execução muito específico. Mais de 99% de todas as cargas de trabalho nunca terá esse problema.
  • Depois que o aplicativo gera uma exceção OutOfMemory, a única maneira recomendada para recuperar é reiniciar o aplicativo.

Proprietăți

ID articol: 3152158 - Ultima examinare: 05/10/2016 16:52:00 - Revizie: 2.0

Microsoft .NET Framework 4.6.1

  • kbsurveynew kbtshoot kbexpertiseinter kbmt KB3152158 KbMtpt
Feedback
ms.js"> d"; document.getElementsByTagName("head")[0].appendChild(m);