Jump to content

RAM leeren, wenn man Variableninhalt löscht


Direkt zur Lösung Gelöst von mwiederkehr,
Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Empfohlene Beiträge

Geschrieben

Guten Tag.

Zeile:

$Auflistung = Get-Childitem -Literalpath 'c:\windows\servicing' -Recurse -Force -ErrorAction:SilentlyContinue

RAM wird dadurch von 35 auf 1400 MB gefüllt.

Keiner von Varianten leert die RAM:

1.

$Auflistung = $Null

2.

for ($i = 0; $i -le ($Auflistung.length -1); $i++)
{
$Auflistung[$i] = $null
}

Kann man RAM leeren ohne, daß man die Sitzung schließt?
 

  • Beste Lösung
Geschrieben

Da das Aufräumen durch den Garbage Collector Ressourcen benötigt, macht er es nur, wenn nötig. Es bringt nichts, alle paar Millisekunden aufzuräumen, wenn vielleicht ein paar Sekunden später der ganze Prozess entsorgt werden kann. Ein Kriterium für das Starten des Aufräumvorgangs ist Speicherknappheit. Wahrscheinlich hast Du in Deinem Rechner genügend RAM, sodass es auf das Gigabyte mehr oder weniger nicht ankommt. Selbst wenn man den Garbage Collector mit "[System.GC]::Collect()" manuell startet, räumt er ohne Zwang nicht auf. Das scheint aber spezifisch für die PowerShell zu sein, bei .NET macht er es sonst schon. Zwingen kann man ihn mit "[System.GC]::GetTotalMemory(‘forcefullcollection’) | out-null". (Vorher muss natürlich die Variable mit "Clear-Variable" geleert werden.) Quelle: https://www.jhouseconsulting.com/2017/09/25/addressing-the-powershell-garbage-collection-bug-1825

 

Aber das sollte nicht notwendig sein. Ich betreibe .NET-Dienste, die wochenlang laufen und täglich grosse Datenmengen verarbeiten. Wenn man die Objekte sauber leert, macht der GC seine Arbeit zuverlässig und man hat keine Memory Leaks zu befürchten.

Geschrieben

Moin,

 

[OT] mir fällt bei sowas immer der Garbage Collector des C64 ein, der das System minutenlang - oder auch dauerhaft - lahmlegen konnte. Den konnte man auch triggern (PRINT FRE(0)), aber das war keine Freude.

[/OT]

 

Gruß, Nils

  • Haha 1
Geschrieben

Danke. "System.GC" bietet hier das, was ich suche. Ich werde mich dann weiter einlesen.

Habe einfach gemerkt, daß wenn ich eine Variable, wie ggf $Auflistung, leere und sie neu belege, steigt RAM-Belegung weiter. Wann es automatisch freigegeben wird, will ich nicht warten - Verbrauch kann groß sein. Und wenn die automatische Bereinigung mitten in der Bearbeitung, kurz bevor es auf SSD geschrieben wird, passiert, dann mache ich es lieber früher, wenn es so wie so wegen interaktive Pause nichts läuft.
Nebenbei habe ich beim experimentieren mit der Klasse gemerkt, daß wenn ich mehrere unterschiedlich genannte Auflistungen mache und eine, welche ich irgendwo am Anfang gemacht habe, lösche, dann wird RAM nur freigegeben, wenn man [System.GC]::Collect(2,1,$true,$true) macht. Scheint die konsequenteste Methode zu sein.
 

Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Erstelle ein Benutzerkonto oder melde dich an, um zu kommentieren

Du musst ein Benutzerkonto haben, um einen Kommentar verfassen zu können

Benutzerkonto erstellen

Neues Benutzerkonto für unsere Community erstellen. Es ist einfach!

Neues Benutzerkonto erstellen

Anmelden

Du hast bereits ein Benutzerkonto? Melde dich hier an.

Jetzt anmelden
×
×
  • Neu erstellen...