Skip to content

Java Heapdumps und IBM

Die IBM JVM unterscheidet sich in einigen Aspekten deutlich von der Sun JVM. Im Bereich Betrieb gibt es eine ganze Reihe von Features die im IBM Java Diagnostics Guide (5.0, 6.0) zusammengefasst sind. Einen Bereich - den Java Heapdump - möchte ich hier mal näher beleuchten: Die IBM JVM kennt den klassischen Java Heap Dump, also einen Abzug der Java Objekte im Speicher. Diese Heap Dumps gibt es in verschiedenen Formaten. IBM unterstützt eine Textvariante und das sogenannten Portable Heap Dump Format, eingeschaltet mit -Xdump:heap. Problem ist, dass es nur von IBM Analysetools ausgewertet werden kann. Einer der besten freien Heap Dump Betrachtern ist das von der SAP gestiftete Projekt Eclipse MAT. Im Sun Umfeld sind diese Heap Dumps im HPROF Binary Format. Das Memory Analyser Tool kann deswegen Dumps von Sun, SAP und HP VM lesen. Gerade hat aber IBM ein Eclipse Pluging bereitgestellt, den IBM DTFJ Adapter. Dieses Plugin der den MAT um Import Möglichkeiten erweitert kann aber das PHD Format nicht verarbeiten. Die Java spezifischen Heap Dumps haben ein Vorbild: die Speicherabzüge (Core Dumps) der Betriebsysteme. Core Files oder Dr.Watson Logfiles werden angelegt wenn eine Anwendung eine kritische Ausnahme verursacht (z.B. Zugriffsschutzfehler). Im Falle der IBM VM kann man solche Core Dumps aber ebenfalls für die Analyse von Java Heaps verwenden. Die von IBM genannten System Dumps werden mit der -Xdump:system option bei der VM eingeschaltet. Wenn ein Core Dump stattfindet (entweder bei OutOfMemeoryErrors, bei Signalen, einem echten JVM Crash oder bei frei definierbaren Events) so wird dieser im System spezifischen Format in ein File geschrieben. IBM liefert ein Tool mit das sich jextract nennt (und im JRE Unterverzeichnis des SDK zu finden ist). Man muss dabei die jextract Version direkt aus dem verwendeten JRE nehmem (insbesondere auch auf dem Rechner auf dem der Coredump erzeugt wurde). Dies packt den aufbereiteten Core Dump zusammen mit systemspezifischen Details (z.B. Kopien der Symbole in den Libraries) in ein ZIP File. Dieses bearbeitete ZIP File kann direkt in den MAT (mit IBM Update) importiert werden. Meiner Erfahrung nach klappt dies nur, wenn jextract keine Warnung oder Fehler gemeldet hat. Der Ansatz auf dem Produktivsystem den Dump vorzuverarbeiten finde ich ganz geschickt, denn nicht immer hat der Entwickler Zugriff auf ein System mit vergleichbarer Kapazität. Übrigens kann dieses ZIP auch von dem IBM Diagnose Tool Framework for Java verarbeitet werden, so kann man Analyseprogramme die den Heap durchsuchen auch direkt in Java schreiben und auf dem Produktivserver ausführen.

Bewerbung

Immer mal wieder erreichen mich seltsame Blindbewerbungen. Ab und zu frage ich sogar nach, woher denn die Annahme stammt, ich würde Stellen anbieten. Bisher habe ich noch nie eine Reaktion erhalten. Deswegen nehme ich mir die Freiheit das Anschreiben einer solchen Blindbewerbung hier zur Unterhaltung wiederzugeben. Zum besseren Verständnis habe ich meine Gedanken eingefügt :)
Sehr geehrte Damen und Herren, ich bewerbe mich bei Ihnen als Java/J2EE-Entwickler. Nach jahrelangem Studium [ohne Abschluss] mit Schwerpunkten Künstliche Intelligenz und Computergrafik und mit breit angelegter Informatik-Bildung, habe ich mich entschieden, meinen Schwerpunkt einer angehenden Arbeitstätigkeit im Java-Umfeld zu suchen. Ich bin qualifiziert, die von Ihnen [nicht] angebotene Tätigkeit auszuüben, da ich bereits während meines Studiums Erfahrungen mit der Konzeptionierung und Realisierung von Software-Projekten, in Gruppen mit jeweils mehreren Personen [Ah, da hat doch Tatsächlich jemand die Seminare und Übungen besucht] gemacht habe. [Ich habe sonst keinerlei Praxiserfahrung] Während des Studiums habe ich immer wieder mit Java programmiert, zumeist Applets [entsprechend Umfanreich waren diese Gruppenprojekte]. Bis vor kurzem befand ich mich in einer Java-Weiterbildungsmaßnahme [denn ich muss trotz Studium mich vom Arbeitsamt aushalten lassen], um die ich mich selbst seit langem bemüht habe [in der Zeit hätte ich sonst arbeiten müssen], da zum einen in Stellenangeboten frequentiert nach Java-Programmierern nachgefragt wurde, andererseits Java eine mir leicht zur Hand gehende Programmiersprache in Erinnerung geblieben war. [Ist zwar schon Jahre her, aber wenn es sonst keine Jobs gibt...] Ich freue mich, wenn Sie mich zu einem Vorstellungsgespräch einladen würden. Für Rückfragen - auch per E-Mail - stehe ich Ihnen gern auch kurzfristig zur Verfügung. Mit freundlichen Grüßen Name der Redaktion bekannt

Java 6u10 ist da (und 6u7 für Itanium)

In einer Panik-artigen Aktion hat Sun einige neue Features gesammelt und als Update für Java 6 im Project Update-N oder Update 10 zusammengefasst. Darunter fallen Verbesserungen für die Installation (Inkrementeller Download), Beschleunigung von Grafik und Swing und ein neues Java Plugin (für Applets). Am 15. Oktober fand dann die FCS statt, das Java SE 6 Update 10 ist jetzt zum Download verfügbar. Ich bin mal gespannt wie viele Probleme dieses mal auftreten werden in existierenden Anwendungen. Interessant ist auch, dass Sun nach Jahren wieder (Anfang Oktober) ein JDK für Itanium anbietet. Die 64bit JVM wird für Linux und Windows angeboten. Im Bereich Tooling (VisualVM, JavaDB) und Plugin (Applet) sowie im Bereich Multi Media (Linux Alsa Sound) existieren allerdings starke Einschränkungen. Eignet sich so nur für den Server Einsatz. HP dürfte mit seiner JRE für IA64 aber deutlichen Optimierungsvorsprung haben. Update: InfoQ hat einen interessanten engl. Artikel.

Fehlende Sektoren (Dynamic VHD Files)

Ich installiere gerade eine Java Anwendung in einem Windows 2008 Server. Dabei verwende ich ein Windows XP als Host, Sun's VirtualBox als VMM und das Windows 2008 Core Edition liegt als dynamisch wachsende virtuelle Festplatte im VHD Format vor. Jetzt trat das Problem auf, dass der Host nicht mehr genug Speicherplatz für das wachsende Image hatte. Dies wurde dem Java Programm sauber als IOException gemeldet, aber als Reason wird (verständlicherweise) kein "file system full" oder "no space on device" gegeben, sondern die Meldung: "The drive cannot find the sector requested" Dies ist verständlich, wenn man sich vor Augen hält dass der IDE Treiber den Fehlerzustand an das NTFS des Guests melden muss. Ein "Kann den Sektor nicht belegen" ist so ziemlich der passendste Fehler der man sich in der Schicht denken kann. Dieser Bug ist übrigens extrem kritisch. Im Gegensatz zur Platznot im Filesystem - von der sich das Filesystem wieder erholen kann - sind Allocation Fehler von beliebigen Sektoren deutlich kritischer, insbesondere wenn das bei Filesystem Meta Blöcken passiert statt bei Datenblöcken. Schnell kann das Filesystem dann aussteigen. Dies wiederum ist der Tot des Servers, wenn es sich dabei um System-Partition oder Swap-Partition handelt. Diese Laufwerksarten sollte man also in einer virtualisierten Umgebung niemals auf eine virtuelle Disk mit uncommited Speicher legen. Sicher kann man damit etwas Platz sparen und wenn man das ganze überwacht passiert es selten. Aber wenn es passiert, so kann man den Guest erst mal rebooten (worst case).

Verspielte Zusammenarbeit

Virtuelle Realitäten wie Second Life werden ja schon für Geschäftsmeetings (z.B. Vorträge) genutzt. Sun arbeitet mit Project Wonderland an einer Plattform, die speziell für die Zusammenarbeit in Teams ausgelegt ist. Hier ein nettes Demo Movie der Telefon Integration in Wonderland. Und eine ältere Demo des "virtuellen" Sun Gebäudes MPK20. Das ganze ist verspielt, und es muss sich erst zeigen ob Konferenzteilnehmer dadurch wirklich Produktivität gewinnen und nicht verlieren, aber unterhaltsam ist es allemal.

Terminkonflikt

Heute finden an der Uni-Karlsruhe gleich zwei interessante Termine statt. Die Java User Group Karlsruhe musste deswegen in den Raum -102UG in der Informatik Fakultät ausweichen, dort gibt es um 19:15Uhr (-21:15) einen Vortrag von Dr. Patrick Schemitz (Netpioneer GmbH) zum Thema Grundladen [Web] Security Auditing. In -101UG spricht Dr. York Sure von SAP Research im Rahmen der GI/ACM Regionalgruppe Karlsruhe über Internet of Services. Dabei geht es um den Einsatz von Semantischen Technologien bei der Vermarktung von Internet Services. Beide Termine finden sich auf dem IT-Kalender des Stadtblog KA. Dort findet sich auch eine Ankündigung für Morgen: Gründung des "Verein der Karlsruher Software-Ingenieure" um 16:00-18:00 am FZI. Näheres dazu in der Presseerklärung von FZI, KIT, adrena objects, 1&1, SAP und HsK. Ich werde wohl bei der JUG-KA vorbeischauen heute Abend und mir Morgen die Info Veranstaltung ansehen.

Optimierungen beim Java Threading

Dieses mal nur schnell einen Pointer zu einer Artikelserie von Jeroen Borgers auf InfoQ. Ich weise ausdrücklich darauf hin dass der erste Teil des Artikels nicht ohne den zweiten Teil genossen werden sollte. Zusätzlich möchte ich noch auf den Micro Benchmark Runner von Brent Boyer verweisen. Dieser spart ein wenig die manuelle Korrektur und Anpassung der Warmup-Phasen und liefert aussagekräftige statistische Auswertungen. Die developerWorks Artikelserie geht auf diese Verfahren auch noch etwas genauer ein:

Null returns in Java

Das Thema der null Referenzen in Java, insbesondere als Rückgabewert von Methoden ist umstritten. Generell führt es zu einer erhöhten Gefahr von (aussagelosen) NullPointerExceptions. An manchen stellen kann man diese einfach vermeiden: finder die eine Liste von Objekten zurückliefern sollten eine leere Ergebnismenge (die ohne Fehler zustande gekommen ist) nicht mit einem null; Rückgabewert signalisieren, sondern mit einer leeren Collection: "return List.EMPTY_LIST;". An anderen Stellen ist die Vermeidung von null nicht immer unumstritten. Auf die Diskussion will ich mich hier jetzt garnicht einlassen. Deswegen habe ich hier eine einfache Policy - falls null Rückgabe Werte doch zulässig sein sollten: Wenn schon null als Rückgabe Wert einer Methode, so darf dies nur passieren wenn:
  1. im Javadoc erwähnt wird "@returns the Object requested or null"
  2. der null Wert im Code durch ein explizites "return null;" angegeben wird.
Ein Negativbeispiel ist dies hier (der Code mit der Entscheidungsfindung ist hier deutlich übersichtlicher als bei größeren Methoden mit state variablen in der Praxis:
public IThing getCarOrBike(int distance, Person p) {
  IThing ret = null;

  if (distance > 1000) {
    ret = new Car();
    ret.add(p);
  }

  if (distance > 100) {
    ret = new Bike();
    ret.add(p);
  }

  return ret; // BAD
}
Mit einem expliziten return wird dies klarer, entweder (die von mir oftmals bevorzugte Early-Out Variante):
public IThing getCarOrBike(int distance, Person p) {

  if (distance < 0 || p == null)
    throw new IllegalArgumentException("You must specify a person and positive distance");

  if (distance <= 100)
    return null; // pedestrian

  IThing ret;

  if (distance > 1000) {
    ret = new Car();
  } else {
    ret = new Bike();
  }
 
  ret.add(p);

  return ret;
}
Oder eine if/else Cascade:
/**
 * Return Transportation for given distance.
 * <P>
 * This will return instances of Car or Bike. If the distance
 * is short enough, null will be returned.
 *
 * @return null or new instance of Car or Bike with person added
 */
public IThing getCarOrBike(int distance, Person p) {
  IThing ret = null;

  if (distance > 1000) {
    ret = new Car();
  } else if (distance > 100) {
    ret = new Bike();
  } else {
    return null; // pedestrian
  }

  ret.add(p);
  return ret;
}
Wichtig ist dabei immer, dass im Code klar wird, was die Intention ist - also: soll null wirklich zurückgegeben werden oder wurde nur eine Fallunterscheidung vergessen. Wenn man sich dazu überwindet "return null;" zu schreiben, so ist es zugegebenermaßen manchmal etwas langatmiger, aber dafür eindeutig. Eine Code Policy wie "jede Methode darf nur einen return punkt haben" ist übrigens nicht nur weil es dieses Idiom verbietet unsinnig. Das führt nur zu extremen Verschachtelungen. Dank Java finally gibt es dazu auch sehr selten Grund. Übrigens versuche ich auch die returns innerhalb eines entsprechenden try/finally Blocks zu haben und vermeide "Alibi" returns am ende der Methode - die beschwichtigen nur erwünschte Warnings.

Bilder von der OpenExpo

Bilder des ersten Tages der Open Expo in Karlsruhe habe ich auf meinem Ipernity account abgelegt. Es war nicht allzu voll, die beteiligten Open Source Projekt-Aussteller haben sich aber sehr gut versorgt gefühlt. Mir persönlich hat eine Moderation und Betreuung der Redner gefehlt. Bis auf die Keynote von Mike Milinkovich (Executive Director Eclipse Foundation) waren die Vorträge teils Produkt/Marketing related und teils Vorträge von Praktikern. Witzigerweise haben die meisten davon auf Ihre High-Profile Kollegen die den gleichen Vortrag auf dem Linuxtag halten werden verwiesen. Heute ist der erste Tag an dem die Veranstaltung parallel zur Webinale stattfindet, bin mal gespannt wie die Besuchsberichte so ausfallen. Ich werde heute nicht dort sein, dafür aber Abends als Gast auf dem Geek Girl Dinner (Fotos bei Mela).

jug-ka: SAP Memory Analyser

ka-duke
Die Java User Group Karlsruhe veranstaltet einen Vortrag über den SAP Memory Analyser, der nun Teil der Eclipse Infrastruktur ist. Als Referent wird am Mittwoch 2008-05-07 19:15 der SAP Mitarbeiter Markus Kohler den Vortrag in der Informatik Fakultät der Uni-Karlsruhe halten. Ankündigung bei Google Groups Update: ein Artikel des Referenten gibt es in der Eclipse DZone.