Como identificar memória fugas de common language runtime

Traduções de Artigos Traduções de Artigos
Artigo: 318263 - Ver produtos para os quais este artigo se aplica.
Expandir tudo | Reduzir tudo

Nesta página

Sumário

Este artigo descreve que são fugas de memória e lista algumas causas possíveis fugas de memória. Além disso, este artigo aborda a fuga de memória perceptível e interpretado como este pode ser incorrectamente como uma fuga de memória true.

Mais Informação

Fugas de memória podem causar uma aplicação para ficar sem recursos e fazer com que uma aplicação falha. É importante identificar fugas de memória. O problema de fugas de memória tem plagued programadores no C e C++ para anos. No Microsoft Visual Studio 2005 ou no Microsoft Visual Studio. NET, um pacote de conjunto lixo abrangente e memória gerida podem parar de fugas de memória, mas, em algumas circunstâncias, poderá parecer ser uma fuga de memória um programa.

Definição de fuga de memória

Uma fuga de memória ocorre quando memória atribuída num programa e nunca é devolvida ao sistema operativo, mesmo que o programa não utiliza a memória já. Seguem-se os quatro tipos básicos de fugas de memória:
  • Num ambiente de memória manualmente gerido: memória é dinamicamente atribuída e referenciada por um ponteiro. O ponteiro é apagado antes da memória é libertada. Depois do ponteiro é apagado, a memória já não pode ser acedida e, por isso, não pode ser libertada.
  • Num ambiente memória dinamicamente gerido: memória é vendido/abatida mas nunca recolhida, porque uma referência para o objecto está activa. Uma vez que uma referência para o objecto é ainda activa, o recolector de lixo recolhe nunca que a memória. Isto pode ocorrer com uma referência que é definida pelo sistema ou o programa.
  • Num ambiente memória dinamicamente gerido: pode recolher O Recolector de lixo e livre a memória mas nunca devolve-lo para o sistema operativo. Isto ocorre quando o recolector de lixo não é possível mover os objectos que ainda estão a ser utilizam para uma parte da memória e libertar o resto.
  • Em qualquer ambiente de memória: memória fraco gestão pode resultar quando muitos objectos grandes são declarados e nunca são permitidos para sair do âmbito. Como resultado, memória é utilizada e nunca é libertada.

Debate

Porque do pacote de conjunto lixo é implementado no Microsoft .NET Framework, não é possível ter uma fuga de memória em código gerido. Isto sugere duas perguntas: como, em seguida, pode ocorrer uma fuga de memória? Porque é aparece se tem uma fuga de memória?

Uma fuga de memória pode ocorrer numa aplicação do .NET Framework quando utilizar o código não gerido como parte da aplicação. Este código não gerido pode divulgar memória e o .NET Framework runtime não pode resolver esse problema.

Além disso, um projecto pode apenas parecem ter uma fuga de memória. Esta condição pode ocorrer se muitos objectos grandes (tais como objectos de DataTable ) são declarados e, em seguida, adicionados a uma colecção (tal como um DataSet ). Nunca podem ser libertados os recursos que estes objectos e os recursos são deixados activos para ficar todo o programa. Isto parece ser uma fuga de, mas na realidade é apenas um sintoma da forma como memória atribuída no programa.

Por exemplo, ter um DataSet . Sempre que for executada uma nova consulta, adicione um novo elemento de DataTable que DataSet para conter os dados que são devolvidos. Se existirem grandes quantidades de dados nunca dispor do, os dados permanece activos desde que o DataSet seja ainda em utilização. Se isto ocorrer suficiente vezes, é possível executar memória esgotada. Não se trata de uma fuga de memória, mas em vez disso é um problema na gestão de memória. Consulte o seguinte exemplo de código:
  Dim DS As DataSet
  Dim cn As New SqlClient.SqlConnection("data source=localhost;initial catalog=Northwind;integrated security=SSPI")
  cn.Open()
 
  Dim da As New SqlClient.SqlDataAdapter("Select * from Employees", cn)
  Dim i As Integer
  DS = New DataSet()

  For i = 0 To 1000
      da.Fill(DS, "Table" + i.ToString)
  Next
				
NOTA: este exemplo é apenas um fragmento de código. Este exemplo assume que o Microsoft SQL Server está instalado no computador local e de que o utilizador que está a executar este código tem acesso a base de dados Adamastor que está incluído no SQL Server.

Embora este código seja obviamente ineficaz e não é prático, destina para demonstrar que se forem adicionados objectos a uma colecção (como, por exemplo, adicionar as tabelas para a colecção de DataSet ), os objectos são mantidos activos desde que o conjunto permanece activo. Se uma colecção está declarada no nível global do programa e objectos são declarados durante o programa e ao que recolha, isto significa que, mesmo que os objectos já não estejam no âmbito, os objectos permanecem activos uma vez que ainda estão a ser referenciadas.

Cada vez que esta situação ocorre, a quantidade de memória que o programa está a utilizar aumenta. A memória não diminuem até ao fim do programa ou a versão do objectos a partir da colecção. Quando observar o programa no monitor de desempenho, este parece ser uma fuga de memória, mas não se trata. O programa ainda tem controlo sobre a memória mas optou por não libertar. O facto de que o programa ainda tem controlo impede que este seja uma fuga de memória, mas o facto de que o programa mantém aumentar a quantidade de memória utilizada pode tornar-se que parece ser uma fuga de memória.

Sintomas de fuga de memória

Quando a quantidade de memória que um programa está a utilizar continua a aumentar durante a execução, este é um sintoma de uma fuga de memória. (Pode ver nesta contagem de memória através de um monitor de desempenho.) A quantidade de memória que o programa utiliza pode, eventualmente, fazer com que o programa executar fora de recursos e a falha.

Referências

Segue-se uma lista de tópicos de ajuda para obter mais informações sobre como memória e gestão de:
  • Classe de GC
  • Contadores de desempenho de memória
  • Gestão de memória automática
  • Interagir com o código não gerido
Para obter mais informações, clique no número de artigo que se segue para visualizar o artigo na Microsoft Knowledge Base:
317297Informações gerais para a depuração não reage, fugas de memória, impasses e condições de conflito entre tarefas concorrentes no Visual Basic .NET
Para obter mais informações, visite os seguintes Web sites da Microsoft Developer Network (MSDN):
http://msdn.microsoft.com/en-us/library/x98tx3cf.aspx

http://msdn.microsoft.com/en-us/library/fz5w87ad.aspx

http://msdn.microsoft.com/en-us/library/kxx6e7z6.aspx

http://msdn.microsoft.com/en-us/library/s3aw423e.aspx

Propriedades

Artigo: 318263 - Última revisão: 6 de dezembro de 2006 - Revisão: 4.7
A informação contida neste artigo aplica-se a:
  • Microsoft Common Language Runtime (included with the .NET Framework) 1.0
  • Microsoft Common Language Runtime (included with the .NET Framework 1.1)
  • Microsoft Visual Studio 2005 Standard Edition
  • Microsoft Visual Studio 2005 Professional
  • Microsoft Visual Studio .NET 2003 Professional Edition
  • Microsoft Visual Studio .NET 2003 Enterprise Architect
  • Microsoft Visual Studio .NET 2003 Enterprise Developer
  • Microsoft Visual Studio .NET 2003 Academic Edition
  • Microsoft Visual Studio .NET 2002 Professional Edition
  • Microsoft Visual Studio .NET 2002 Enterprise Architect
  • Microsoft Visual Studio .NET 2002 Enterprise Developer
  • Microsoft Visual Studio .NET 2002 Academic Edition
  • Microsoft Visual Basic 2005
  • Microsoft Visual Basic .NET 2002 Standard Edition
  • Microsoft Visual Basic .NET 2003 Standard Edition
  • Microsoft Visual C++ .NET 2003 Standard Edition
  • Microsoft Visual C++ .NET 2002 Standard Edition
  • Microsoft Visual C# .NET 2003 Standard Edition
  • Microsoft Visual C# .NET 2002 Standard Edition
  • Microsoft Visual J# .NET 2003 Standard Edition
Palavras-chave: 
kbmt kbvs2005swept kbvs2005applies kbinfo KB318263 KbMtpt
Tradução automática
IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine translation ou MT), não tendo sido portanto revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática? erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 318263

Submeter comentários

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com