Como identificar memória vazamentos no common language runtime

Traduções deste artigo Traduções deste artigo
ID do artigo: 318263 - Exibir os produtos aos quais esse artigo se aplica.
Expandir tudo | Recolher tudo

Neste artigo

Sumário

Este artigo discute o que são vazamentos de memória e lista algumas causas possíveis vazamentos de memória. Além disso, este artigo discute o vazamento de memória percebida e como ele pode ser mal interpretado como um vazamento de memória true.

Mais Informações

Vazamentos de memória podem causar a execução de recursos de um aplicativo e podem fazer com que um aplicativo falhar. É importante identificar vazamentos de memória. O problema de vazamentos de memória tem plagued desenvolvedores em C e C++ há anos. No Microsoft Visual Studio 2005 ou no Microsoft Visual Studio. NET, um pacote de coleta de lixo abrangente e memória gerenciada podem parar de vazamentos de memória, mas, em algumas circunstâncias, um programa pode parecer estar com vazamento de memória.

Definição de vazamento de memória

Um vazamento de memória ocorre quando a memória é alocada em um programa e nunca é retornada para o sistema operacional, mesmo que o programa não usa mais a memória. A seguir é os quatro tipos básicos de vazamentos de memória:
  • Em um ambiente de memória gerenciada manualmente: memória é alocada dinamicamente e referenciada por um ponteiro. O ponteiro é apagado antes que a memória é liberada. Depois que o ponteiro é apagado, a memória não pode mais ser acessada e, portanto, não pode ser liberada.
  • Em um ambiente de memória gerenciada dinamicamente: memória é descartada, mas nunca coletada, porque uma referência ao objeto ainda está ativa. Porque uma referência ao objeto ainda está ativa, o coletor de lixo nunca coleta que a memória. Isso pode ocorrer com uma referência é definida pelo sistema ou o programa.
  • Em um ambiente gerenciado dinamicamente memória: O coletor de lixo pode coletar e a liberar a memória, mas nunca retorna para o sistema operacional. Isso ocorre quando o coletor de lixo não é possível mover os objetos que ainda estão em usam para uma parte da memória e liberar o restante.
  • Em qualquer ambiente de memória: memória ruim gerenciamento pode resultar quando muitos objetos grandes são declarados e nunca permitidos para sair do escopo. Como resultado, memória é usada e liberada nunca.

Discussão

Por causa do pacote de coleção lixo que é implementado no Microsoft .NET Framework, não é possível ter um vazamento de memória em código gerenciado. Isso sugere duas perguntas: como, em seguida, um vazamento de memória pode ocorrer? Por que ele aparece se você tem um vazamento de memória?

Um vazamento de memória pode ocorrer em um aplicativo .NET Framework quando você usar o código não gerenciado como parte do aplicativo. Esse código não gerenciado pode vazar memória e o .NET Framework runtime não é possível resolver esse problema.

Além disso, um projeto só pode aparecer com um vazamento de memória. Essa condição pode ocorrer se muitos objetos grandes (tais como objetos DataTable ) são declarados e, em seguida, adicionados a uma coleção (como um DataSet ). Os recursos que esses objetos possuem nunca podem ser liberados e os recursos são deixados ativos para todo o executar do programa. Esta parece ser um vazamento, mas, na verdade, é apenas um sintoma da maneira que memória está sendo alocada no programa.

Por exemplo, você tem um DataSet . Sempre que uma nova consulta é executada, você adiciona um novo elemento de DataTable ao que DataSet para armazenar os dados que são retornados. Se houver grandes quantidades de dados que você nunca descarta, os dados fica ativos desde que o DataSet esteja ainda em uso. Se isso ocorrer suficiente, é possível executar com memória insuficiente. Isso não é um vazamento de memória, mas em vez disso é um problema no gerenciamento 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
				
Observação Este exemplo é apenas um trecho de código. Este exemplo assume que o Microsoft SQL Server é instalado no computador local e que o usuário que está executando este código tem acesso ao banco de dados Northwind , que está incluído no SQL Server.

Embora esse código seja obviamente ineficiente e não prático, ele serve para demonstrar que se objetos forem adicionados a uma coleção (como adicionar as tabelas para a coleção DataSet ), os objetos são mantidos ativos, desde que a coleção permanece ativa. Se uma coleção é declarada no nível global do programa, e objetos são declarados em todo o programa e adicionados à coleção, isso significa que mesmo que os objetos não estejam no escopo, os objetos permanecem alive porque eles ainda estão sendo referenciados.

Cada vez que isso ocorre, a quantidade de memória que o programa está usando aumenta. A memória não diminui até o fim do programa ou o lançamento dos objetos da coleção. Quando você observar o programa em um monitor de desempenho, isso parece ser um vazamento de memória, mas não é. O programa ainda tem controle sobre a memória, mas optou por não liberá-lo. O fato de que o programa ainda tem controle impede isso um vazamento de memória, mas o fato de que o programa mantém aumentar a quantidade de memória usada pode fazer parecer ser um vazamento de memória.

Sintomas de vazamento de memória

Quando a quantidade de memória que está usando um programa continua a aumentar durante a execução, isso é um sintoma de um vazamento de memória. (Você pode observar essa contagem de memória por meio de um monitor de desempenho). A quantidade de memória que o programa usa eventualmente pode causar a execução de check-out dos recursos e a falha do programa.

Referências

A seguir está uma lista de tópicos da Ajuda para obter mais informações sobre memória e gerenciamento de:
  • Classe GC
  • Contadores de desempenho de memória
  • Gerenciamento automático de memória
  • Interoperar com código não gerenciado
Para obter mais informações, clique no número abaixo para ler o artigo na Base de dados de Conhecimento da Microsoft:
317297Mapa para depuração trava, vazamentos de memória, deadlocks e condições de corrida no Visual Basic .NET
Para obter mais informações, visite os seguintes sites do Microsoft Developer Network (MSDN) da:
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

ID do artigo: 318263 - Última revisão: quarta-feira, 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 Edition
  • 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 traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes 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