Heap Dumps unter Java auswerten

Manchmal kommt es vor das man eine Java Applikation geschrieben hat, welche aus irgendeinem Grund mehr Speicher verbraucht als sie sollte. Im schlimmsten Fall führt dies zu einem OutOfMemory-Error. Möchte man dem Übeltäter auf die Spur kommen, kann man im ersten Schritt einen Heap Dump bei einem OutOfMemory-Error vornehmen. Dazu fügt man den VM Optionen der JVM den Parameter:

-XX:+HeapDumpOnOutOfMemoryError

hinzu. Dieser Parameter sorgt dafür, das im Falle eines OutOfMemory-Error, ein Dump des Heaps auf der Festplatte landet. Das Problem an diesem Dump ist allerdings, das er sich händisch schlecht auswerten lässt. Abhilfe schafft hier das freie Werkzeug Eclipse Memory Analyser.

Eclipse Memory Analyser

Eclipse Memory Analyser

Mit diesem ist es möglich den Heap Dump einzulesen und anschließend unter Zuhilfenahme der Analysefunktion dem Memory Leak auf die die Spur zu kommen. Bezogen werden kann das Tool über die offizielle Webseite. Lizenziert ist der Memory Analyser unter der Eclipse Public License und damit freie Software.

Auto Activation unter Eclipse immer aktivieren

Wenn man mittels Eclipse in Java entwickelt, so kann man mit der Tastenkombination Strg + Space den Content Assistant aktivieren. Ich persönlich bevorzuge es wenn dieser an so vielen Stellen wie möglich aktiviert wird, da dies die Entwicklung aus meiner Sicht wesentlich komfortabler macht.

Die Auto Activation Optionen

Die Auto Activation Optionen

Dazu müssen die Einstellungen unter Window -> Preferences -> Java -> Editor -> Content Assist aufgerufen werden. Dort gibt es den Punkt Auto Activation. In das Feld Auto activation triggers for Java trägt man nun:

.abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ

ein und bestätigt das Ganze. Damit wird der Content Assistant immer aktiviert, was die Entwicklung beschleunigt, da man schneller an entsprechende Vorschläge kommt.

Befehlszeile mittels JewelCli unter Java auswerten

Die Methodensignatur der Standardeinsprungsmethode sieht unter Java wie folgt aus:

public static void main(String[] args)

Übergeben wird hierbei ein String-Array welches die Argumente der Befehlszeile enthält. Möchte man diese auswerten, kann man das natürlich von Hand machen. Alternativ kann man eine Bibliothek nutzen, welche einem diese Arbeit abnimmt. Eine dieser Bibliotheken ist JewelCli. JewelCli arbeitet auf Basis von Annotationen. Im ersten Schritt muss dazu ein Interface definiert werden:

public interface CommandLineOptions {
    @Unparsed
    List getFiles();

    @Option
    boolean isRecursive();

    @Option(defaultValue="localhost")
    String getDatabase();

    @Option(helpRequest = true)
    boolean getHelp();
}

In diesem Interface werden die verfügbaren Optionen über Annotationen definiert. So werden in den ersten zwei Zeilen die Unparsed-Optionen definiert. Das sind Optionen ohne Schlüssel, welche dann z.B. als Dateinamen interpretiert werden können. Die zweite Option welche im Interface definiert wird ist ein Schalter. So kann später in der Befehlszeile der Wert -recursive definiert werden, was sich auf den Wert der Rückgabe von isRecursive() auswirkt. Bei der dritten Option wird ein String übergeben welcher in der Befehlszeile mittels –database db.example.com definiert werden kann. Der Parameter ist dabei optional, so wird der Wert localhost angenommen, wenn der Wert nicht über die Befehlszeile definiert wurde. Die letzte Option dient der Implementation der Hilfe-Funktionalität. Wird der Parameter angegeben, so erzeugt JewelCli automatische die entsprechende Hilfsausgabe für die definierten Parameter. Daneben gibt es noch eine Reihe weiterer Nutzungsmöglichkeiten. Wenn das Interface definiert ist, ist der Großteil der Arbeit abgeschlossen. Nun muss die Auswertung der Parameter angestoßen werden:

CommandLineOptions result;

try {
    result = CliFactory.parseArguments(CommandLineOptions.class, args);
}
catch (ArgumentValidationException e)
{
    System.out.println(e.getMessage());
    return;
}

Dazu wird die Methode parseArguments der Klasse CliFactory genutzt, welche die Argumente unter Nutzung des definierten Interfaces auswertet. Schlägt dies fehl wird eine Exception ausgelöst und die Nachricht dieser auf der Konsole ausgegeben. Der Quelltext von JewelCli kann unter anderen auf GitHub bezogen werden. Lizenziert ist die Bibliothek unter der Apache-Lizenz und damit freie Software.

Autoformatierung unter Eclipse

Wenn man unter Eclipse in Java entwickelt, so möchte man natürlich das dieser Code formatiert wird. Dafür gibt es je nach System die Kombination Strg + Shift + F oder unter Mac OS X die Kombination Command + Shift + F. Damit wird der aktuell geöffnete Quelltext formatiert.

Die Save Actions in den Eclipse Einstellungen

Die Save Actions in den Eclipse Einstellungen

Alternativ kann Eclipse so eingestellt werden, das der Quelltext beim Speichern neu formatiert wird, was auf Dauer natürlich praktischer ist. Dazu müssen die Einstellungen unter Window -> Preferences -> Java -> Editor-> SaveActions aufgerufen werden. Dort kann die automatische Formatierung der Quellcodes beim Speichern aktiviert werden.

Gogs aktualisieren

Nutzt man die freie Git-Hosting-Lösung Gogs, so kommt man regelmäßig in den Genuss von Updates. Möchte man das Upgrade einspielen, so gibt es einige Dinge zu beachten. Im ersten Schritt sollte der Dienst auf dem Server natürlich beendet werden:

service gogs stop

Anschließend wird in den Kontext des Nutzers gewechselt unter welchem Gogs betrieben wird:

su git
cd

Der nächste Schritt ist der Download der neuen Version, sowie die Verschiebung der alten Version und das Kopieren der Konfigurationsdatei von der alten zur neuen Version:

mv gogs gogs_old
wget https://github.com/gogits/gogs/releases/download/v0.8.10/linux_amd64.zip
unzip linux_amd64.zip 
cp -R gogs_old/custom gogs
cp -R gogs_old/data gogs
cp -R gogs_old/log gogs

Danach wird in den Gogs Ordner gewechselt und Gogs manuell gestartet.

cd gogs
./gogs web

Bei diesem Start wird die Migration der Datenbank durchgeführt. Anschließend kann Gogs wie gehabt genutzt werden. Die heruntergeladene Datei sowie der Ordner gogs_old können anschließend entfernt werden.