Java Heap-Dump erzwingen

Wer es mal brauchen sollte, einen Heap-Dump eines Java-Prozesses unter z. B. UBUNTU auf der Kommandozeile zu erhalten: Dazu muss ein Kernel-Parameter temporär auf ‚0‘ gesetzt werden. Als Tante ‚root‘ führt man folgendes aus:

‚echo „0“ > /proc/sys/kernel/yama/ptrace_scope‘.

Dann klappt auch unser Heap-Dump auf Kommandozeile:

‚jmap -F –dump:format=b,file=/tmp/XXXXXX.hprof <PID>‘

Ansonsten, wenn man nicht auf ein Terminal angewiesen ist, kann man z. B. die jconsole zu einem Heap-Dump veranlassen. Aber nicht vergessen, die Datei heißt so, wie der erste String-Parameter des Funktionsaufrufes. Das ist Default „String“ 🙂

jconsole_heapdump

Sucht man die PID laufender Java-Prozesse, kann man ‚jps‘ benutzen. Für Startparameter und anderes kommt ‚jinfo <PID>‘ zum Einsatz. Diese ‚unsupported‘ Tools sind im JDK enthalten.

Oracle 12 Docker-Image

Benötigt man ein Oracle 12, dann kann man selbstverständlich ein 30 GB VBox-Image benutzen. Es gibt aber auch die Möglichkeit, mit einem leichtgewichtigeren Docker-Image zu arbeiten, zumindest wenn man auf Linux-Basis arbeiten kann. Mit der richtigen Anleitung von Wouter Scherphof ist das Ganze relativ einfach.

Allerdings wird hier ein Grund-Image benutzt, für welches kein Dockerfile angegeben wird. Das ist aus Sicherheitsgründen nicht wirklich gut, da ein Benutzer mit Docker-Root auch auf dem Hostsystem Root ist, zumal beim Ausführen auch das ‚--privileged‚ Flag gesetzt wird.

Um dies zu umgehen kann man auf Git-Hub ein offizielles Oracle-Linux benutzen und es anstatt des vom Autor zur Verfügung gestellten benutzen. Bis auf eine Zeile in Step 1 kann man alles soweit übernehmen.

# RUN userdel oracle && rm -rf /home/oracle && rm
/var/spool/mail/oracle

Danke an Martin und an Seppel für die Hilfe.

ClassCastException with ElementNSImpl during unmarshalling

Dieser Fehler beim JAXB-Unmarshall brachte mich zu einem Fall einer XML-Annotation an einer Instanz-Variable generischem Typ:

@XmlElement(name=“begin“);
T begin;

Erst in einer Spezialisierung von der Basis-Klasse<T> wird ‚T‘ zu einem BigDecimal.

Erster Versuch war, Delegate-Getter an der Spezialisierung-Klasse anzubringen und entsprechend zu annotieren.

@XmlElement(name=“begin“, type=BigDecimal.class);
BigDecimal getBegin();

Das brachte noch nicht den Erfolg. Auch das Entfernen sämtlicher XML-Annotationen an unserer Basis-Klasse.

Erst, als in der Basis-Klasse der Member-Variablen ein neuer Name für die XML-Behandlung gegeben wurde, funktioniert es auch, zumindest für meinen Fall.

@XmlElement(name=“begin_intern“);
T begin;

Zum Prüfen ist es übrigens ziemlich hilfreich, sich die XSD erzeugen zu lassen.

D3 – Graphen visualisieren

Ich suchte für die Visualisierung eines fachlichen Graphen eine schnelle, flexible und „gut aussehende“ Möglichkeit. Aufgabe ist die Analyse eines Fehlerfalles bei einem Kunden und ich möchte diese Visualisierung zu einer Lupe auf die Bewegungsdaten formen.

Java schien mir hier zu schwerfällig und da ich mich sowieso momentan in JavaScript einarbeite befragte ich hierzu die entsprechenden Wissensträger. Einhelliges Meinung: Schau dir mal D3 an. Nach wenig Suchen fand ich auch ein sehr ansprechendes und genau passendes Tutorial bzgl. Graphen.

Nach 2 Stunden konnte ich mir die ersten Ergebnisse ansehen. Wenn man sich die Benutzung von Force-Layout etwas angeschaut hat, dann ist das Verhältnis Aufwand zu Möglichkeiten extrem günstig.

 

Tutorials, Tutorials, …

 

Unique-Constraint greift nur bei Nicht-null Einträgen

Bei einem Unique-Constraint über mehrere Spalten verhalten sich Null-Values nicht, wie man es erwartet. Bei zwei Spalten A und B in einem Unique-Constraint, kann nur eine Zeile mit Werten (‚a‘, ‚b‘) einfügen.

Hingegen funktioniert das Einfügen beliebig vieler Zeilen mit z. B. den Werten („a“, null). Da lohnt es sich, wieder mal in die Definitionen zu schauen.

Prusa i3 Teil 1

DL1HX_PRUSAi320160205_202745

Zwei Päckchen kamen bei mir an. Das eine ist mein Mechanikpäckchen mit aus Siebdruckplatte CNC-geschnittenen Rahmen, Gewindestangen, Achsen, Lager etc. Ich entschied mit für diese Variante, da hier eine hohe Stabilität durch die hölzerne Rahmenkonstruktion gegeben ist und man sich hier über rechte Winkel keine Gedanken machen muss. Zu meiner Überraschung besitzen die vorgefertigten Holz-Teile eine exzellente Qualität und Passgenauigkeit.

Prusa i3 Teil 1 weiterlesen

Zwei Seiten einer Medaille: Frontend und Backend

Der Hype um browserseitige Programmierung ebbt nicht ab. Natürlich hatte ich schon JavaScript geschrieben, jQuery verwendet und die Webseiten so lange gedengelt, wie bis sie funktioniert haben, fremden JS-Code gefixt weil der Kollege unabkömmlich in anderen Projekten versenkt wurde oder mich über nicht erwartetes Verhalten des Codes in einem neuen Browser gewundert.

Frontend-Entwicklung als eigene Domaine

Auf die Dauer ist das aber nicht nur unbefriedigend, sondern die wachsende Kommunikation mit den Frontend-Entwicklern erfordert eine tiefer gehende Kenntnis von der Programmierung im Browser. Die Weiterentwicklung in der IT haben den Frontend-Entwickler als vollständige Domaine die letzten Jahre herausgetrieben.

Es ist das Auseinanderentwickeln des klassischen Backends mit Frontend-Anhängsel und der Programmierung im Frontend selbst, die das Backend nur noch als JSON-Datenbelieferung betrachtet. Hier fehlt im alltäglichen Projektbetrieb spürbar eine Vermittlung dieser beiden Seiten. Aus der früheren Anforderung, dass der Frontend-Entwickler die fertige Oberfläche mit CSS und JS noch einmal schön anmalen soll, ist die Abstimmung der beiden Welten über Schnittstellen wie REST, ajax-Call, WebServices geworden.

Projektrisiko – Trennung beider Welten

Oft fehlen Entwickler, welche in beiden Welten zu Hause sind. Die wissen, wann es z. B. notwendig ist, dass man das Backend nicht mit ein und derselben Abfrage lahmlegt, sondern die Antwort cacht. Oder anders herum, die Webservice-Schnittstelle nicht zu fein oder zu grob granuliert, um dem Frontend die Aufrufe und Datenaufbereitung zu vereinfachen. Man kennt die Möglichkeiten und den Impakt von Anforderungen in der jeweils anderen Welt nicht genug.

Hier liegt nicht zuletzt ein größeres Projektrisiko. Der Code funktioniert auf Entwickler-Ebene prinzipiell. Proof of concept ist ok, die Implementierung stabil, der Jenkins ist grün und Sonar meldet keine großen Auffälligkeiten.

Der erste Lasttest

Dann aber kommt der erste Lasttest. Selbstverständlich viel zu spät, kurz vor Auslieferung wird er gemacht, weil dem Kunden die Ergebnisse des Lasttests laut Vertrag zustehen (Augenzwinker). Dann bricht plötzlich die Performance massiv ein und Fehler tauchen auf, die es vorher nicht gab. Dann ist guter Rat im Wortsinn teuer. Erwähnte ich schon, dass das Budget aufgebraucht ist?

Das ist dann genau der Augenblick, in dem sich alle am Code zusammensetzen und das Verhalten auf Backend-, Frontend- und Middelware-Ebene analysieren. Jetzt spricht man sich ab, wundert sich. Man unterhält sich nicht nur formal über die notwendigen Parameter der Schnittstelle, sondern deren Aufbau in die Tiefe, Zeitverhalten, Nebenläufigkeiten (ganz wichtig). Dies hätte eigentlich schon vor Monaten passieren müssen – eigentlich. Nun wird es stressig und wahrscheinlich teuer.

Vermittlungsebene

Es leuchtet jetzt ein. dass man von Anfang an jemanden dabei haben sollte, der sich in beiden Welten gut auskennt. Das sind oft genau die Kollegen, die man bei Problemen gerne befragt und die man hoffentlich jetzt mit hinzuzieht und es schafft, das Verhalten zu stabilisieren.

Das ist auch einer der Gründe gewesen, weswegen ich begonnen habe, mich noch einmal ganz grundsätzlich mit JavaScript resp. ECMAScript zu beschäftigen. Davon abgesehen, dass man sowieso von Zeit zu Zeit eine neue Programmiersprache lernen sollte.

Nach einigem Suchen auf Youtube fand ich folgenden Beitrag ‚JavaScript: Understanding the Weird Parts – The First 3.5 Hours‘. Der erste Teil ist kostenlos und hat mich überzeugt.

JUGH: Lutz Huehnken, Von Enterprise zu Reactive

Reactive, was ist das eigentlich? Was bedeutet das für jemanden, der wie ich aus der J2EE-Business-Welt kommt?

Genau diesen Fragen ging Lutz Huehnken nach.
Er orientierte sich am Reactive Manifesto und übersetzte es in eine konkrete und am Entwickler orientierten Form: Kein Servlet-Container, kein blocking IO, Sub-Thread-Einheiten, kein Two-Phase-Commit.

DL1HX_jugh20151203_184723.1

Es hat mir sehr gut gefallen. Nicht einfach alles wegwerfen und auf neuen Paradigmen reiten. Sondern über die einzelnen Anforderungen nachdenken, nachdenken, ob ich überhaupt z. B. eine Transaktion so und an dieser Stelle benötige. Die Stellen zu isolieren, wo ich durch Zwänge nicht um blocking IO oder Two-Phase-Commit herumkomme.

Die Jugh-Vorträge erscheinen auch nach und nach auf Youtube, einfach mal danach suchen.

Gerade Events mit auch promienten Speakern, die Rede und Antwort stehen, gefallen mir immer besser … und ich nehme mir auch einfach die Zeit hierfür.