www.wikidata.de-de.nina.az
Speicherleck englisch memory leak gelegentlich auch Speicherloch oder kurz memleak bezeichnet einen Fehler in der Speicherverwaltung eines Computerprogramms der dazu fuhrt dass es einen Teil des Arbeitsspeichers zwar belegt diesen jedoch weder freigibt noch nutzt Inhaltsverzeichnis 1 Problematik 2 Losungsmoglichkeiten 2 1 Einschrankung negativer Auswirkungen 2 2 Automatische Speicherbereinigung 2 3 Explizite Speicherfreigabe 2 4 Systematische Tests 2 5 RAII 2 6 Formale Verifikation 3 Beispiele 3 1 C 3 2 Automatische Speicherbereinigung 4 Weblinks 5 EinzelnachweiseProblematik BearbeitenArbeitsspeicher ist ein nur in endlicher Menge verfugbares Betriebsmittel das einem Programm auch nicht ohne weiteres wieder entzogen werden darf Wenn ein Programm durch Speicherlecks zunehmend mehr Arbeitsspeicher belegt kann es dazu kommen dass die Leistungsfahigkeit des Computers sinkt da Teile des Arbeitsspeichers ausgelagert werden mussen Wenn die Menge an Speicher die ein Prozess belegen kann beschrankt wurde ist es dem Programm irgendwann nicht mehr moglich weiter Speicher zu allozieren und es kommt zu einem Programmfehler Bei Betriebssystemen mit unzureichendem Speicherschutz z B bei Embedded Systemen kann im schlimmsten Fall die Uberbelegung des Speichers dazu fuhren dass auch Teile des Betriebssystems nicht mehr korrekt ausgefuhrt werden konnen und das System absturzt Losungsmoglichkeiten BearbeitenUm Speicherlecks aufzuspuren existieren mehrere Moglichkeiten Analyse der Referenzen auf Speicherbereiche z B Smart Pointer diese Analyse erkennt nur nicht mehr zugreifbare Speicherbereiche Analyse des Quelltexts auf formale Korrektheit Analyse konkreter Laufzeit Situationen im Rahmen eines Software Tests Einschrankung negativer Auswirkungen Bearbeiten Der Speicher der hochstens von einem Prozess belegt werden darf kann durch das Betriebssystem beschrankt werden Das behebt den ursprunglichen Fehler nicht aber begrenzt die Auswirkungen auf andere Prozesse Unter Linux existiert eine Kernelfunktion der OOM Killer engl out of memory killer die zum Einsatz kommt wenn alle Versuche fehlschlugen Speicher zu allozieren Sie wahlt unter den laufenden Prozessen u a denjenigen mit dem hochsten Speicherbedarf der kurzesten Laufzeit und der niedrigsten Prioritat und beendet diesen zwangsweise Nach Beendigung des Prozesses wird aller von ihm belegter Arbeitsspeicher wieder freigegeben 1 Automatische Speicherbereinigung Bearbeiten Falls die verwendete Laufzeitumgebung eine automatische Speicherbereinigung Garbage collection bereitstellt versucht diese zu ermitteln auf welche Speicherbereiche ein Prozess nicht mehr zugreifen kann Stellt die Laufzeitumgebung fest dass ein belegter Speicherbereich fur das Programm nicht mehr erreichbar ist wird dieser wieder freigegeben Nicht mehr erreichbar heisst in diesem Zusammenhang dass keine gultige Referenz ausgenommen weak references auf den belegten Speicherbereich mehr existiert Speicherlecks konnen dabei dennoch entstehen wenn der Speicher fur das Programm noch erreichbar ist d h es eine Referenz auf den Speicher halt ihn aber dennoch nicht mehr verwendet Explizite Speicherfreigabe Bearbeiten Im Gegensatz zur automatischen Speicherbereinigung muss der Anwendungsentwickler bei einer manuellen Speicherverwaltung explizit dynamische Speicherbereiche wieder freigeben Versaumt er dies bspw am Ende einer Funktion wird anschliessend die Referenz auf den noch reservierten Speicher geloscht und der Bereich kann nicht mehr freigegeben werden Systematische Tests Bearbeiten Durch systematisches Testen mit Hilfe entsprechender Werkzeuge die mit einer gewissen Sicherheit feststellen konnen welche Speicherbereiche einem Speicherleck zuzuordnen sind kann man den Problemen der formalen Verifikation entgehen Ein bekanntes solches Werkzeug auf Linux Systemen ist memcheck von Valgrind Es fuhrt eine Liste der allozierten Speicherbereiche mit und an welcher Stelle im Programm die Allokation stattfand Bei Programmende uberpruft es ob alle allozierte Bereiche auch wieder freigegeben wurden In sehr einfachen oder sehr gravierenden Fallen kann es ausreichen nur den Speicherverbrauch eines Prozesses im zeitlichen Verlauf zu beobachten RAII Bearbeiten Eine Programmiertechnik die Speicherlecks verhindern kann ist RAII Ressourcenbelegung ist Initialisierung Hierbei wird der Speicherbereich einer Variablen bei ihrer Initialisierung reserviert und beim Verlassen ihres Gultigkeitsbereichs automatisch wieder freigegeben Das hat gegenuber der automatischen Speicherverwaltung den Vorteil dass die Lebensdauer eines Objekts in der Regel genau bekannt ist RAII schutzt nicht in jedem Fall vor Speicherlecks zweiter Art Formale Verifikation Bearbeiten Durch einen Korrektheitsbeweis konnen insbesondere auch Speicherlecks entdeckt werden Dieses Verfahren ist jedoch sehr zeitaufwendig und benotigt Expertenwissen Die auf Speicherlecks spezialisierte Frage kann auch computergestutzt mittels Statischer Code Analyse untersucht werden Beispiele BearbeitenC Bearbeiten Das bekannteste Beispiel fur fehlende automatische Speicherverwaltung ist die Sprache C Neuer Speicher wird hier durch Funktionen wie malloc angefordert Dabei liefern diese einen Zeiger auf den Anfang des entsprechenden Speicherbereichs Der Verweis ist notwendig um die Zuweisung zu identifizieren und sie mittels geeignetem Code wieder freizugeben der Funktion free oder nachtraglich zu modifizieren Geht der Zeiger verloren dann kann der Prozess nicht mehr auf diesen Speicher zugreifen und ihn damit auch nicht freigeben bzw wahrend seiner Laufzeit erneut verwenden Ein verwandtes Problem besteht wenn der Zeiger verandert wird sowie umgekehrt wenn der Speicher falschlicherweise mehrfach deallokiert wird Das folgende Beispiel zeigt die Entstehung solch eines Speicherlecks include lt stdlib h gt int main void int a Zeiger auf einen als Ganzzahl interpretierten Speicherbereich Speicher fur Zeiger reservieren a malloc sizeof int a malloc sizeof int Zeiger auf zuvor allokierten Speicher wird uberschrieben free a Nur der zweite Speicherblock wird freigegeben gt Speicherleck return EXIT SUCCESS Ab dem zweiten a malloc ist es nicht mehr moglich auf den Speicherbereich zuzugreifen auf den a zuvor verwies Der Bereich kann dann regular nicht mehr vom Programm freigegeben werden Automatische Speicherbereinigung Bearbeiten Das folgende Beispiel in Java zeigt dass alleine der Ansatz der automatischen Speicherbereinigung nicht reicht um Speicherlecks aufzudecken private static List lt Integer gt nummern new ArrayList lt gt public void erzeugeSpeicherleck for int i 1 i lt 10000 i nummern add i kein weiterer lesender Zugriff auf die List nummern Man erkennt hier dass der Speicherbedarf standig anwachst es handelt sich also um ein Speicherleck da kein lesender Zugriff mehr auf die Listen Eintrage erfolgt Dieser Fehler ware recht leicht durch statische Analyse zu erkennen wohingegen der Graph aus Referenzen und Speicherbereichen den Fehler nicht erkennen lasst Weblinks BearbeitenDie Arbeitsweise des OOM Killers des Linux Kernels englisch Valgrind Homepage Memory leak detection for WinCE Applications A garbage collector for C C Einzelnachweise Bearbeiten linux mm org Abgerufen von https de wikipedia org w index php title Speicherleck amp oldid 210777204