Este artigo é um artigo espelhado de tradução automática, por favor clique aqui para ir para o artigo original.

Vista: 24448|Resposta: 0

[Fonte] . Excesso de memória líquida (System.OutOfMemoryException).

[Copiar link]
Publicado em 14/03/2019 21:47:39 | | | |
Quando ocorre uma OutOfMemonryException? Se tentarmos criar um novo objeto e o coletor de lixo não conseguir encontrar memória livre, podemos capturar a exceção; Outro caso é que, quando o CLR precisa de memória e o sistema não pode fornecê-la, a exceção também será lançada. Mas, neste momento, nossa aplicação não consegue detectar o erro.

Análise de depuração do excesso de memória (OutOfMemoryException).

O espaço de endereçamento do sistema operacional de 32 bits é 4G, do qual 2G é ocupado pelo sistema operacional, o que significa que a memória deixada para o processo do usuário é apenas 2G (o que também deduz parte do espaço ocupado pela imagem quando o programa é carregado, geralmente apenas cerca de 1,6G~1,8G pode ser utilizado). Se um processo precisar solicitar memória enquanto está em execução e o sistema operacional não puder alocar espaço de memória para ele, ele produzirá uma exceção fora de memória, System.OutOfMemoryException em .net (A exceção que é lançada quando não há memória suficiente para continuar a execução de um programa). Embora a manifestação final seja OutOfMemoryException, a causa pode ser diferente e, antes de resolver esse problema, é necessário analisar o status atual de uso da memória do processo para encontrar a causa correta antes de prescrever o medicamento correto. Aqui estão algumas dicas para depurar esses problemas.

Para mais informações, consulte a:http://blog.csdn.net/lazyleland/article/details/6704661

Sistema de Erro de Excesso de Memória do Pool de Aplicações IIS. OutOfMemoryException

Em um servidor web ASP.NET, a quantidade de memória que ASP.NET pode usar geralmente não é igual a toda a quantidade de memória. No arquivo de configuração machine.config, <processModel>há uma propriedade "memoryLimit" na seção de configuração, o valor dessa propriedade é um valor percentual, o padrão é "60", ou seja, o processo ASP.NET (você pode ver o processo ASP.NET no gerenciador de tarefas, aspnet_wp no IIS5, w3wp no IIS6) pode usar 60% de toda a memória física. Quando a quantidade de memória usada por ASP.NET ultrapassar esse limite, o IIS começará a reciclar automaticamente o processo, ou seja, a criar um novo processo para lidar com requisições Http e recuperar a memória ocupada pelo processo antigo.

Quando temos um servidor com uma memória grande, o valor de "memoryLimit" precisa ser ajustado adequadamente. Por exemplo, se prepararmos um servidor com chemas-microsoft-com ffice marttags" />t="on"> memória 4G, então t="on">4G×60%=t="on">2.4G. No entanto, para sistemas operacionais Win32, todo o espaço de memória que um processo pode ocupar é apenas t="on">2G. Quando a memória ocupada pelo processo ASP.NET começa a atingir t="on">2G, porque não atinge o "limiar de reciclagem" de t="on">2.4G, o IIS não iniciará a operação do processo de reciclagem, mas devido às limitações do Win32, é realmente impossível alocar mais memória a esse processo, então a OutOfMemoryException provavelmente será descartada. Para evitar isso, tivemos que reduzir o "memoryLimit" de forma adequada para que o IIS pudesse processar a reciclagem mais cedo.

A Microsoft recomenda que ASP.NET processo ocupe no máximo 60% da memória, e é melhor que o valor real calculado não ultrapasse t="on">800M. Dito isso, para um servidor com t="on" > memória 4G, é melhor definir a propriedade "memoryLimit" para "20". Definir um limiar de reciclagem adequado para o IIS reciclar processos em tempo hábil é muito importante para garantir a operação estável de todo o servidor e evitar o OutOfMemoryException.

No IIS6, o limiar de reciclagem para processos ASP.NET não é mais determinado pela propriedade "memoryLimit" na seção de configuração, mas sim pelas configurações na configuração do pool de aplicações no IIS Manager.

No entanto, mesmo que essas configurações estejam configuradas corretamente, não há garantia de que as OutOfMemoryExceptions serão completamente evitadas, e as razões podem ser variadas e complexas, como operações de recuperação de memória que podem ser muito demoradas. Os desenvolvedores devem sempre ter em mente de não usar e desperdiçar memória desnecessariamente em seu código. :)

Se você tem um servidor com uma memória grande e está frustrado com o limite de usar t="on" >2G no sistema operacional Win32, existem duas soluções alternativas:

  • Inicie o computador no modo /3GB e siga o link após o artigo de participação no método
  • Use Windows Server 2003 64bits Edição


Vários elementos para evitar o excesso de memória

Se quiser criar um array, certifique-se de que ele seja do tamanho correto.

Certifique-se de ter memória suficiente para uso interno e novos objetos hospedados.

Se você está programando no .NET Compact Framework, o runtime da linguagem pública lança essa exceção quando não há memória suficiente para uso interno ou para um novo objeto gerenciado. Para evitar essa exceção, você deve evitar escrever métodos grandes que ocupem 64KB ou mais de memória.

O uso excessivo de memória gerenciada é frequentemente causado por:

  • Leia grandes conjuntos de dados na memória.
  • Criar entradas em cache demais.
  • Faça upload ou baixe arquivos grandes.
  • Use expressões regulares demais ou strings ao analisar arquivos.
  • Status de visualização excessiva.
  • Há dados demais ou sessões demais no estado da sessão.
  • Essa exceção pode ser criada quando um método é chamado em um objeto COM e o método retorna um tipo definido pelo usuário que contém um array seguro (um array de tamanhos indefinidos) com uma mensagem adicional "Não há espaço de armazenamento suficiente para completar esta operação". Isso ocorre porque o .NET Framework não pode escalar campos estruturais com tipos de array seguros.


Um exemplo de sobrecarga de memória causada pelo uso inadequado de arrays de bytes


Se o arquivo de saída for particularmente grande, ele pode reportar diretamente System.OutOfMemoryException. A maneira correta de fazer isso é exportar o fluxo de bytes do arquivo em segmentos, mas existe asp.net método pronto chamado Response.WriteFile(filePath) que faz exatamente isso.

A seguir está a forma correta de escrever:

Quando um asp.net sofre um transbordamento de memória, uma maneira fácil de lidar com isso é recuperar o pool de aplicações imediatamente. Mas isso não resolveu completamente o problema.

Excesso de memória ao criar um tipo de Imagem (System.OutOfMemoryException)

Código de erro: System.Drawing.Image myimg=System.Drawing.Image.FromFile(file. Nome Completo);

Exceções que são lançadas quando um arquivo aberto não é um arquivo imagem:



MSDN: Este método lança uma exceção OutOfMemoryException se o arquivo não tiver um formato de imagem válido, ou se o GDI+ não suportar o formato de pixel do arquivo.

Informações tão anormais são facilmente enganosas.

<processModel> elemento

Configure as configurações do modelo de processo ASP.NET no servidor web dos Serviços de Informação da Internet (IIS). A seção só pode ser definida no arquivo <processModel> Machine.config, e afeta todos os ASP.NET aplicativos rodando no servidor.

Aviso Para informações sobre este elemento, por favor, leia a seção "Notas".

Exemplo de configuração da estrutura:

exegese

O sistema de configuração de código gerenciado não lê <processModel> as configurações de configuração. Em vez disso, é lido diretamente pela DLL não gerenciada aspnet_isapi.dll. As mudanças desta seção entram em vigor depois que você reinicia o IIS.

Se você instalar ASP.NET em um controlador de domínio, deve tomar medidas especiais ou a instalação não funcionará. Para mais informações, veja Localizado emhttp://support.microsoft.comO artigo da Microsoft na Knowledge Base CHS315158 "ASP.NET não pode usar a conta ASPNET padrão em controladores de domínio".

Quando ASP.NET está rodando no modo nativo IIS versão 6, ele usa o modelo de processo IIS 6 e ignora <processModel> as configurações na seção. Para configurar valores de identidade de processo, reciclagem ou outros modelos de processo, use a interface do Internet Services Manager para configurar processos de trabalho IIS para sua aplicação.

O valor de tempo é formatado como "horas:minutos:segundos". Se apenas um número for dado sem dois pontos, o valor é assumido como minutos; Portanto, timeout="4" é equivalente a timeout="00:04:00".

Se um aplicativo ASP.NET faz com que ASP.NET processos de trabalho (Aspnet_wp.exe no Windows 2000 e Windows XP Professional e W3wp.exe no Windows Server 2003) reiniciem e emita uma mensagem de erro indicando que o reinício é devido a uma condição suspeita de bloqueio, isso deve aumentar configuração responseDeadlockInterval.

Armazene nomes de usuário e senhas no registro

Armazene nomes de usuário e senhas no registro

Para criptografar nomes de usuário e senhas e armazená-los no registro, defina o nome de usuário e a senha da seguinte forma.

userName="registry:HKLM\Software\AspNetProcess,Name"

password="registry:HKLM\Software\AspNetProcess,Pwd"

A parte da cadeia que vem após o registro de palavras-chave e antes da vírgula indica o nome da chave do registro que ASP.NET abre. A parte após a vírgula contém um nome de valor de string do qual o ASP.NET lê as credenciais. Vírgulas são necessárias e credenciais devem ser armazenadas na unidade de configuração HKLM. Se a configuração estiver formatada incorretamente, ASP.NET não iniciará o processo de trabalho e aparecerá no caminho do código de falha de criação de conta atual.

As credenciais devem estar em REG_BINARY formato e conter a saída de uma chamada para a função API do Windows CryptProtectData. Você pode criar e armazenar credenciais de criptografia no registro com o aplicativo Console de Registro de Configurações ASP.NET (Aspnet_setreg.exe), que usa o CryptProtectData para completar a criptografia. Para baixar o código-fonte Aspnet_setreg.exe e Visual C++ e obter ajuda, visite o sitewww.asp.nete procure por "aspnet_setreg".

Você deve configurar o acesso às chaves do registro que armazenam credenciais criptografadas para que o acesso esteja disponível apenas para Administradores e SISTEMA. Como a chave do registro será lida pelo processo ASP.NET executado como SYSTEM, você deve definir as seguintes permissões:

Administrators:F

SYSTEM:F

CRIADOR PROPRIETÁRIO: F

ProcessAccount:R

Isso fornecerá duas linhas de defesa para proteger os dados:

Permissões ACL exigem acesso a dados com a identidade de Administrador.
O atacante teria que executar código (CryptUnprotectData) no servidor para recuperar as credenciais da conta.

exemplo

O exemplo a seguir especifica várias <processModel> configurações de configuração.

O exemplo a seguir especifica que o nome de usuário e a senha criptografados são armazenados no item definido pelo usuário do registro, AspNetProcess.

Requisitos

  • Incluído em: <system.web>
  • Plataforma web: IIS 5.0, IIS 5.1, IIS 6.0
  • Arquivos de configuração: Machine.config, Web.config
  • Manipulador de seção de configuração: System.Web.Configuration.ProcessModelConfigurationHandler


http://doc.51windows.net/iismmc/ ... essmodelelement.htm





Anterior:C# determina se o arquivo enviado é uma imagem e impede os uploads do cavalo de Troia
Próximo:Compartilhamento de coleções de e-books em língua C
Disclaimer:
Todo software, material de programação ou artigos publicados pela Code Farmer Network são apenas para fins de aprendizado e pesquisa; O conteúdo acima não deve ser usado para fins comerciais ou ilegais, caso contrário, os usuários terão todas as consequências. As informações deste site vêm da Internet, e disputas de direitos autorais não têm nada a ver com este site. Você deve deletar completamente o conteúdo acima do seu computador em até 24 horas após o download. Se você gosta do programa, por favor, apoie um software genuíno, compre o registro e obtenha serviços genuínos melhores. Se houver qualquer infração, por favor, entre em contato conosco por e-mail.

Mail To:help@itsvse.com