Montag, 14. Januar 2013

Java Desktop-Programme und der Speicher

Speicher fressen ist auf dem Desktop unerwünscht und dennoch tut es die Java-VM. Selbst wenn das -client Parameter gesetzt wurde, holt sich die VM Stück für Stück die ihr erlaube Speichermenge. Wie viel das ist, lässt sich mit dem Xmx-Parameter steuern. Weil der per Standard recht knapp bemessen ist, findet sich eigentlich kaum eine Java-Anwendung, die davon keinen Gebrauch macht. Das Parameter -Xmx256m erlaubt der Java-VM also maximal 256MB Ram zu reservieren.

Doof ist auf dem Desktop nur, dass die Java-VM den Speicher nicht mehr hergibt. Der wird nämlich für den späteren Gebrauch reserviert gehalten und nicht wieder freigegeben. Der Benutzer kann das aber nicht sehen. Der erkennt nur, dass die Java-VM irgendwann die vollen 256MB Speicher beansprucht und weniger für andere Programme zur Verfügung steht. Die Java-VM spart dadurch die Zeit für Speicher-Freigaben und erneute Speicher-Allokierungen*.

Um ein günstigeres Desktop-Verhalten zu erreichen, lässt sich die Java-VM mit den passenden Start-Parametern entsprechend konfigurieren. Dafür spielt die Wahl des Garbage-Collector eine Rolle. Der ParNewGC und der SerialGC geben beide nach dem Aufräumen Speicher wieder frei. Auf aktuellen Rechnern mit mehreren Prozessor-Kernen ist der ParNewGC mit seiner parallelen Verarbeitung am günstigsten. Weiter kann mit den Parametern -XX:MinHeapFreeRatio und -XX:MaxHeapFreeRatio ein Prozentwert für die Schwelle definiert werden, ab dem Speicher reserviert und freigegeben wird. Je kleiner diese Werte sind, je dichter ist der Java-VM Speicherbedarf an dem tatsächlichen Speicherbedarf der Anwendung.

Eine günstige Java-VM-Konfiguration für eine Desktop-Anwendung könnte so ausshen. Je nach Bedarf sollte aber z.B. mit VisualVM das tatsächlich Wunschverhalten nachgemessen werden.

java -client -Xmx512m -XX:+UseParNewGC -XX:MinHeapFreeRatio=10 -XX:MaxHeapFreeRatio=20 ...

* Das verhalten kann je nach VM-Version und Betriebssystem abweichen. Ich habe das beschriebene Verhalten mit Oracle-Java 1.6 und 1.7 auf 32bit Windows und 64bit Linux nachstellen können, wo der ParallelOldGC als Standard gesetzt war.

Lesenswert zu diesem Thema der Artikel auf Stefan Krause.blog

Dienstag, 8. Januar 2013

Programmaufrufe aus Java

Manchmal ist das ja die letzte Lösung, einfach ein Kommandozeilen-Programm  aufzurufen. Die Google-Suche spuckt da im groben und ganzen immer den gleichen Tipp aus:

       ...
       Runtime runtime = Runtime.getRuntime();
       Process process = runtime.exec(args);
       InputStream is = process.getInputStream();
       ...

An der Zeile ist zunächst nichts falsch und das aufgerufene Programm wird ordnungsgemäß ausgeführt. Allerdings kann es, vorzugsweise unter Windows, beim lauschen am Input- oder Error-Stream zu einem Deadlock kommen. Hierfür ist ein Windows-Bug verantwortlich, der von der Java-VM nicht umschifft wird. Auch der Aufruf von waitFor ist dazu geeignet niemals zurück zu kommen, jedoch notwendig, wenn mit der Verarbeitung auf das Ende des Aufrufs gewartet werden soll.

Als Lösung bietet sich ein Timeout-Thread an, der den Prozess nach einer vordefinierten Zeit abbricht. Dieses und einiges mehr bietet die Apache Commons Exec-Bibliothek. Die Tutorial-Seite weist auf alles wichtige, wie auch auf Fallstricke, wie der Klassiker mit den Leerzeichen in Pfadangaben hin.

Dazu passend gibt es auf Java Code Geeks eine Javaklasse, die das ganze hübsch in ein objektorientiertes Schema zusammenfasst. Die Klasse und das dazugehörige Interface habe ich mal der Bequemlichkeit halber hier abgelegt: ProcessExecutor.java, ProcessExecutorHandler.java.

Eine lesenswerte Analyse, was da beim Stream lesen nun genau hängt, findet man übrigens auf dem Weblog von Kohsuke Kawaguchi.

Samstag, 5. Januar 2013

Die GEZ und das liebe Geld

Mein Kontoauszug zeigt es deutlich. Die GEZ (Neudeutsch auch Beitragsservice) bucht jetzt nicht mehr nur den kostengünstigen Satz ab, den man als Fernsehfreier Haushalt zu zahlen hat, sondern schlägt jetzt richtig zu. Jedenfalls, wenn man bisher quartalsmäßig hat abbuchen lassen. Anstelle der 17,28 Euro jetzt satte 53,94 Euro. Weil ich das, was ich dafür bekomme aber wenig nutzbringend finde und ich ja außerdem weiß, dass die GEZ, was die Höhe ihre Beiträge angeht, etwas stur ist, habe ich mir mal einen Vorschlag ausgedacht, der ja für alle eigentlich in Ordnung wäre.


Gebühreneinzugszentrale (GEZ)
50656 Köln


Liebe GEZ,

wie Sie an meiner Kundenhistorie sicher erkennen können, schaue ich bereits seit
vielen Jahren kein Fernsehen. Von den teuren Sport-Übertragungsrechte und Fernseh-Produktionen der öffentlich rechtlichen Fernsehsender habe ich also gar nichts. Seit Anfang diesen Jahres helfe ich, dank der neuen Gebührenverordnung, finanziell dabei mit, meinen Mitmenschen das Fernsehprogramm zu verschönern.

Das finde ich prinzipiell auch eine gute Sache, meine jedoch, dass dadurch eine gewisse Ungleichgewichtung entsteht, weil ich ja wirklich nichts für mein Geld bekomme. Für die Rente bezahle ich heute und bekomme morgen bestimmt auch etwas, von meinen Steuern werden Straßen in Ordnung gehalten und Kinder in Schulen geschickt, damit die mal schlau werden. Von allem habe ich auch etwas. Sie verstehen, worauf ich hinaus möchte?

Weil ich aber nicht immer an allem rummäkeln möchte, würde ich Ihnen gerne einen Vorschlag machen. Weil unterm Weihnachtsbaum eines dieser modernen Empfangsgeräte lag, könnten Sie mir doch einfach einen Verrechnungsgutschein für den Google-Play-Store oder für den Amazon-Store zuschicken. Dann kann ich die Medien konsumieren, die mir gefallen und für die ich ja dann auch schon bezahlt hätte. Damit wäre dann allen geholfen. Dann muss das Fernsehen keine Sendungen mehr für mich mitproduzieren, wo ich die doch gar nicht sehe, Arbeitsplätze in der Medienindustrie gehen auch nicht verloren, weil ich das Geld ja weiter zweckgebunden abgebe und ich kann mich informieren und unterhalten lassen wo und wie ich gerne möchte.

Wegen mir könnte man das auch direkt machen. Also die Fernsehsender würden ihre Sendungen bei Google einstellen und ich kaufe dort jeden Monat einen Gutschein für 17,98 Euro. Dann hätten Sie auch nicht mehr so viel zu tun und müssten wegen der ganzen Umstellung nicht so viele neue Leute einstellen und anlernen.

Aber zurück zu meinem Anliegen. Ich fände einen Gutschein über 10,00 Euro angemessen, den Sie mir jeden Monat zusenden könnten, weil ich ja auch weiter ein Radio habe, das ich zwar auch schon eine Weile nicht mehr benutze, aber der Besitz reicht ja aus, wie mir mal erklärt wurde. Schließlich will so ein Radiomoderator und die ganze Musik die da läuft auch bezahlt sein. Ich würde mir zwar die Musik, so wie bei Google, auch gern selbst aussuchen können, ich will da aber jetzt nicht kleinlich sein.

Über Ihre Antwort, am besten mit beiliegendem Gutschein, würde ich mich sehr freuen.

Mit freundlichen Grüßen



Ich hoffe nur, dass die das richtig verstehen und mir am Ende nicht Gutscheine für den ZDF-Fernsehgarten oder das Musikantenstadl zuschicken.

Google Drive mit Linux

Eigentlich benutze ich Dropbox und das schon seit langem. Schließlich gehörte Dropbox zu den ersten Web-Drive Anbietern mit ordentlich funktionierendem Linux-Client. Inzwischen hat auch Google etwas vergleichbares im Angebot. Allerdings ist außer dem Versprechen daran zu arbeiten von einem Linux-Client nichts in Sicht.

Eine komfortable Möglichkeit bietet Insync mit seinem Synchronsations-Dienst der auf dem Google-Drive aufbaut. Die Funktion ist der von Dropbox ähnlich und Linux-Clients sind für verschiedene Distributionen vorhanden. Insync richtet ebenso wie Dropbox ein Verzeichnis ein, das automatisch mit dem Google-Drive synchronisiert wird. Die Dokumente aus Google-Docs sind jedoch nicht im Zugriff.

Die Installation auf meinem Mint 14 funktionierte allerdings nicht Out-Of-the-Box und das Repository von Insync wollte auch nicht mehr als ein "Permission Denied" hergeben. Die Pakete lassen sich aber auch einfach runterladen und installieren.

Für Mint 14 werden die Pakete insync-beta-cinnamon und insync-beta-gnome-cinnamon-common benötigt. Dann gibt es noch eine Abhängigkeit zu dem Paket nemo-python, das aber nicht per apt installierbar ist. Man bekommt es aber aus dem Launchpad gwendal-lebihan-dev.

Sind alle Pakete beisammen lässt sich Insync installieren. Nur noch /usr/bin/insync zu den Programmstartern hinzufügen bzw. zunächst manuell ausführen und Insync erstellt im Home-Verzeichnis seinen Insync-Ordner. Außerdem erscheint im Panel ein Insync-Icon, das einen zur Webseite mit den notwendigen Anmeldefreigaben weiterleitet.

Mein erster Eindruck ist positiv. Insync tut was es soll und synchronisiert alle Daten aus dem Insync-Verzeichnis mit dem Google-Drive Account. Es fehlen jedoch die Finessen, die Dropbox mit der Nautilus-Integration bietet.

Links: Insync Download, Launchpad gwendal-lebihan-dev