Abstract

Der Artikel beschreibt was unter Memory Leaks verstanden wird, wie diese in Sprachen wie Java überhaupt entstehen können, wie man diese verhindert und was nur scheinbar Memory Leaks sind.

Description

In C lassen sich schnell Leaks erstellen indem ausgefasster Speicher nicht ans System zurückgegeben wird - doch wie soll das in Java gehen? Ganz einfach: 1. Beispiel ein Server der in einer HashMap Objekte zu jedem Client speichert und diese nicht entfernt. Ergo die Map wird immer größer obgleich die Clients schon lange nicht mehr mit dem Server kommunizieren. 2. Beispiel Swing EventListener eines Buttons - ein Callback. Der Listener wird nicht mehr beim Button ausgetragen. Kein Problem? Der Listener ist ja klein? Was aber wenn er wie üblich als Anonyme Klasse in einem Ausdruck mit Referenzen auf die OuterClass erzeugt wurde? Dann wird auch die OuterClass nicht mehr freigegeben und alles was diese referenziert. Lösung: Was auf Maschinenebene das ausfassen und zurückgeben von Speicher ist, besitzt in Hochsprachen wie Java ein Analogon die Benutzung von Resourcenverwaltungen wie HashMap, Listen, Streams, andere Container, ... Wichtig ist die Dualität einzuhalten. Erst registrieren und zum Schluss wieder austragen. Memory Leaks besitzen zwei wichtige Kennzeichen: 1. Es entstehen ungewollte Referenzen (Erreichbarkeit von Objekten die zukünftig nie mehr benötigt werden) 2. Diese Referenzen entstehen im Programmverlauf immer wieder - Akkumulation.

Links and resources

Tags