Zjištění paměť nevrací v společného jazykového modulu runtime.

Souhrn

Tento článek popisuje, jaké paměti jsou úniky a jsou uvedeny některé možné příčiny nevrácené paměti. Kromě toho tento článek popisuje nevracení paměti zjištěné a jak to může být špatně interpretován jako nevracení paměti na hodnotu true.

Další informace

Nevracení paměti může způsobit vyčerpání prostředků aplikace a může způsobit selhání aplikace. Je důležité k identifikaci nevracení paměti. Problém nevracení paměti má plagued vývojáři jazyka C a C++ pro let. V aplikaci Microsoft Visual Studio 2005 nebo Microsoft Visual Studio .NET úplné uvolnění paměti kolekce balíček a spravované paměti můžete zastavit nevracení paměti, ale za určitých okolností může zdát nevrací paměť programu.

Definice nevracení paměti

Nevrací paměť při paměti je přidělen v programu a nikdy se vrátí do operačního systému i v případě, že program nepoužívá paměti déle. Následují čtyři základní typy nevracení paměti:
  • V prostředí ručně spravované paměť: paměť dynamicky přidělené a odkazuje na ukazatel. Ukazatel je vymazat dříve, než je paměť uvolněna. Po ukazatele budou vymazána paměť již nelze použít a proto nemůže být uvolněna.
  • V prostředí dynamicky spravované paměti: paměť odbyt ale nikdy shromážděny, protože odkaz na objekt je stále aktivní. Vzhledem k tomu, že je odkaz na objekt stále aktivní uvolňování shromažďuje nikdy této paměti. Tato situace může nastat s odkazem, který je nastaven systém nebo program.
  • V prostředí dynamicky spravované paměti: uvolňování může shromažďovat a volného paměti nikdy však vrátí jej zpět do operačního systému. K tomu dochází při uvolňování nelze přesunout objekty, které jsou stále v jedné části paměti pomocí a ostatní zdarma.
  • V jakémkoli prostředí paměti: špatné paměti řízení může způsobit mnoho velké objekty jsou deklarovány a nikdy povoleno opustit oboru. V důsledku toho paměti používá a nikdy uvolněno.

Diskuse

Z důvodu uvolnění paměti kolekce balíček, který je implementován v Microsoft rozhraní.NET Framework není možné mít nevracení paměti ve spravovaném kódu. To naznačuje dvě otázky: jak pak může dojít k nevrácení paměti? Proč ukázalo, že máte nevracení paměti?

Nevracení paměti může dojít v aplikaci rozhraní.NET Framework při použití nespravovaného kódu jako součást aplikace. Tento nespravovaný kód může způsobit únik paměti a modul runtime rozhraní.NET Framework nelze řešit tento problém.

Navíc projekt může pouze zdá nevracení paměti. Tato situace může nastat, pokud jsou deklarovány a potom přidán do kolekce (například DataSet) mnoho velkých objektů (například objekty DataTable ). Nikdy mohou být uvolněny prostředky, které vlastní tyto objekty a prostředky jsou ponechány alive pro spuštění celého programu. To se zdá být netěsnost, ale ve skutečnosti je naznačuje způsob, jakým je přidělené paměti v programu.

Máte například objekt DataSet. Při každém spuštění nového dotazu přidáte nový objekt DataTable prvek této datové sady obsahují data, která je vrácena. Pokud existuje velké množství dat, která nikdy vyřazení, data zůstala naživu tak dlouho, dokud objekt DataSet je stále používán. V tomto případě dostatek času, je možné spustit nedostatek paměti. Toto není nevracení paměti, ale místo toho je problém ve správě paměti. Naleznete v následujícím příkladu kódu:
  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

Poznámka: Tento příklad je fragment kódu. Tento příklad předpokládá, že je nainstalován Microsoft SQL Server v místním počítači a že uživatel, který je spuštěn tento kód má přístup k databázi Northwind , která je součástí serveru SQL Server.

I když tento kód je zjevně neefektivní a není praktické, měl by prokázat, že v případě, že objekty jsou přidány do kolekce (například přidání tabulky do kolekce DataSet ), objekty jsou i nadále aktivní, dokud kolekce zůstane naživu. Pokud kolekce je deklarována na globální úrovni programu a objekty jsou deklarovány v celém programu a přidán do kolekce, to znamená, že přestože objekty jsou již v oboru, objekty zůstává aktivní, vzhledem k tomu, že se stále odkazuje.

Pokaždé, když k tomu dojde, množství paměti, že program používá zvyšuje. Paměť poklesu až do ukončení programu nebo uvolnění objektů z kolekce. Při sledování programu na sledování výkonu, to se zdá být nevracení paměti, ale není. Program stále nemá vliv paměť, ale se rozhodl ji vydat. Skutečnost, že program stále má ovládací prvek zabrání toto nevracení paměti, ale skutečnost, že program sleduje zvýšení množství paměti používané může usnadnit zdá nevracení paměti.

Příznaky nevracení paměti

Když velikost paměti, který používá program pokračuje zvýšit při spuštění, je to příznakem nevracení paměti. (Můžete sledovat počet paměti pomocí nástroje Sledování výkonu.) Množství paměti, které program používá, mohou způsobit nedostatek prostředků a selhání spuštění programu.

Odkazy

Následuje seznam témat nápovědy Další informace o paměti a jeho řízení:
  • GC třída
  • Čítače výkonu paměti
  • Automatická správa paměti
  • Spolupráce s nespravovaným kódem
Další informace získáte v následujícím článku znalostní báze Microsoft Knowledge Base:

317297 Přehled ladění zablokuje, nevracení paměti, zablokování a konflikty časování v jazyce Visual Basic .NET

Další informace naleznete na následujících webech Microsoft Developer Network (MSDN):
Vlastnosti

ID článku: 318263 - Poslední kontrola: 16. 1. 2017 - Revize: 1

Váš názor