\begin{slide}{Automatische Freigabe}

Müllsammeln (garbage collection)

\begin{itemize}
\item
  Verweiszähler
\item
  markierende Kollektoren
\item
  kopierende (kompaktierende) Kollektoren
\item
  Generationen
\item
  nebenläufige Ausführung, 
  Platzbedarf, Zeitgarantien
\end{itemize}

\begin{verbatim}
java -Xloggc:Foo.gc Foo
\end{verbatim}

\end{slide}

\begin{slide}{Verweiszähler}

\begin{itemize}
\item
  jedes Objekt $x$ hat Zähler
  für Anzahl der Verweise auf $x$.
\item
  bei Anlegen eines Verweise Zähler erhöhen
\item
  bei Löschen verringern
\item
  bei Zähler 0 freigeben und verwiesene
  Zähler verringern (usw.)
\item
  Zähler brauchen Platz
\item
  Löschen ist aufwendig
\item
  geht nicht bei Kreisverweisen
\end{itemize}

\end{slide}

\begin{slide}{Markierende Kollektoren}

\begin{itemize} \itemsep2pt\parskip 3pt
\item
  bei Speicheranforderung, 
  die nicht erfüllt werden kann:
\item
  alle \emph{lebenden}, d. h. von Wurzeln 
  erreichbaren Objekte werden markiert (mark)
\item
  restliche in Freispeicherliste (sweep)
\item
  Markierung nur ein Bit;
  Zeit $\sim$ Speicher, auch bei viel Müll.
\item
  ist \emph{konservativ}: anwendbar auch
  bei Sprachen, bei denen Zeiger nicht sicher
  erkennbar sind 
\item
  \url{http://www.hpl.hp.com/personal/Hans_Boehm/gc/}

  (z. B. benutzt in GNU JVM)
\end{itemize}


\end{slide}

\begin{slide}{Kopieren/Kompaktieren}


\begin{itemize}
\item
  (wenigstens) zwei Speicherbereiche:
  Fromspace und Tospace
\item
  lebende Zellen im Fromspace
  werden nach Tospace kopiert,
\item
  dabei Verweise passend umgebogen
\item
  was nicht kopiert wurde (Rest des Fromspaces),
  ist Müll
\item
  Zeit $\sim$ lebender Anteil des Speichers
\item
  muß alles kopieren (auch Nicht-Zeiger).
\end{itemize}

\end{slide}

\begin{slide}{Generationen usw.}


\begin{itemize}
\item
  Generation $k$: Speicherbereich
  für die Objekte, die schon $k$ 
  garbage collections überlebt haben
\item
  je älter, desto weniger Elemente
\item
  Kollektor arbeitet bevorzugt
  auf neuester Generation
\item
  Spezialbehandlung für Verweise von alt nach neu
\end{itemize}

Siehe auch: 

Hans Boehm: Allocation and GC Myths
\url{http://www.hpl.hp.com/personal/Hans_Boehm/gc/myths.ps}


Brian Goetz: Garbage collection in the HotSpot JVM
\url{http://www-128.ibm.com/developerworks/java/library/j-jtp11253/}

Garbage Collection FAQ
\url{http://java.sun.com/docs/hotspot/gc1.4.2/faq.html}


\end{slide}

\begin{slide}{Übung GC}

Richtig viel Müll erzeugen:
\begin{verbatim}
import java.util.*;
class Garbage {
    static long sum (int top) {
        List<Integer> l = new LinkedList<Integer>();
        for (int x = 0; x < top; x++) {
            l.add (x);
        }
        long result = 0;
        for (int x : l) {
            result += x;
        }
        return result;
    }
    public static void main (String [] args) {
        for (int i = 0; i < 1000*1000; i+=10000) {
            System.out.println ( i + " : " + sum(i));
        }
    }
}
\end{verbatim}
ausführen mit:
\begin{verbatim}
time java  -Xmx400M -XX:NewSize=40M -XX:+PrintGCDetails  Garbage    
\end{verbatim}
verschiedene Werte für NewSize ausprobieren,
Messungen erklären.
\end{slide}


%%% Local Variables: 
%%% mode: latex
%%% TeX-master: t
%%% End: 
