Annäherung an Java / JVM-Interna


15

Ich habe ungefähr 8 Jahre in Java programmiert und kenne die Sprache ziemlich gut als Entwickler, aber mein Ziel ist es, meine Kenntnisse der Interna zu vertiefen. Ich habe Grundstudiengänge in PL-Design besucht, aber es waren sehr breite akademische Übersichten (in Schema, IIRC).

Kann jemand eine Route vorschlagen, um die Details zu untersuchen? Speziell, gibt es bestimmte Themen (zB Garbage Collection), die zugänglicher oder ein guter Ausgangspunkt sein könnten? Gibt es ein anständiges Buch über die Interna der JVM und das Design der Java-Programmiersprache? Mein aktueller Ansatz wird darin bestehen, mit der JVM-Spezifikation zu beginnen und nach Bedarf zu recherchieren.


2
Mein persönlicher Ansatz wäre (und ist), den wahren Grund für all die kleinen "Warum genau funktioniert das so?" - Fälle in Java zu finden. Wie ist Auto-Boxing definiert, wie funktionieren generische Typen? Was ist mit var-args? Was macht das SUPERFlag in den Klassendateien eigentlich? Das meiste davon ist in der JVM-Spezifikation selbst beschrieben, aber es erfordert einige Arbeit, um es von dort in Ihr Gehirn zu bekommen ;-)
Joachim Sauer

Antworten:


13

Ich habe ein bisschen davon gemacht, als ich vor Jahren mit Java angefangen habe. Mein Ansatz war es, die VM-Spezifikation zu lesen und die Ausgabe von javap -c zu betrachten, die den disassemblierten Bytecode einer Klasse anzeigt. Ich habe auch versucht, Java-Klassen mit einem bestimmten Bytecode mithilfe eines Java-Bytecode-Assemblers zu erstellen. Es gibt einen Assembler namens Jasmin , wenn Sie das versuchen wollen.

Vielleicht möchten Sie auch das Dokument Lambda Expression Translation lesen , das Brian Goetz von Oracle veröffentlicht hat und das die Strategie zum Übersetzen der in Java 8 hinzugefügten Lambdas (Closures, im Wesentlichen) beschreibt.

Sie können auch den Quellcode für die Hotspot-VM von OpenJDK und die Early-Access-Version des Javac-Compilers mit Lambda-Unterstützung (hg-Repository) für JDK 8 erhalten, wenn Sie wirklich Lust haben, in die Tiefe des Pools zu tauchen.

Ein Blick in die Müllabfuhr ist wahrscheinlich eine gute Idee. Eine schnelle Suche ergab diesen Dr. Dobbs-Artikel über Javas Garbage-First-GC. Ich weiß nicht, ob das eine gute Einführung ist. Ich nehme an, Sie kennen sich bereits mit Mark-and-Sweep-Sammlern und generationsübergreifenden Müllsammlern aus. Wenn nicht, sollten Sie diese zuerst nachlesen.


3

Einige zusätzliche Ideen:

  • Beteiligen Sie sich am OpenJDK- Projekt. Es gibt nichts Schöneres, als die Interna einer Software zu verstehen, wenn man sie hackt!
  • Sehen Sie sich an, wie andere JVM-Sprachen (z. B. Clojure oder Scala) Code für die JVM generieren
  • Führen Sie ein Miniprojekt durch, das Sie interessiert und die Verwendung von JVM-Interna erfordert. Vielleicht mit etwas wie ASM , um den Bytecode zu manipulieren.

2

Wenn Sie mit dem Java-Bytecode-Format noch nicht vertraut sind, sollten Sie einen winzigen Compiler schreiben, der gültigen Java-Bytecode (oder Jasmin-Assembler) erstellt und ihn korrekt ausführen lässt.

Es ist sehr befriedigend, "Hello World" oder "4" (gegeben 2 + 2) zu sehen, die von Ihrem Code generiert wurden.


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.