Approaching Java / JVM internals [fermé]

15

Je programme en Java depuis environ 8 ans et je connais assez bien le langage en tant que développeur, mais mon objectif est d'approfondir ma connaissance des internes. J'ai suivi des cours de premier cycle en conception de PL, mais ce sont des aperçus académiques très larges (dans Scheme, IIRC).

Quelqu'un peut-il suggérer un itinéraire pour commencer à fouiller les détails? Plus précisément, y a-t-il des sujets particuliers (par exemple, la collecte des ordures) qui pourraient être plus accessibles ou constituer un bon point de départ? Existe-t-il un livre de haut niveau décent sur les composants internes de la JVM et la conception du langage de programmation Java? Mon approche actuelle consistera à commencer par la spécification JVM et à effectuer des recherches au besoin.

plaque tournante
la source
2
Mon approche personnelle serait (et est) de trouver la vraie raison de tous ces petits cas "pourquoi ça marche exactement comme ça" en Java. Comment la boxe automatique est-elle définie, comment fonctionnent les types génériques. Et var-args? Que fait SUPERréellement l' indicateur dans les fichiers de classe? La plupart de cela est décrit dans la spécification JVM elle-même, mais cela nécessite un peu de travail pour le sortir de là et dans votre cerveau ;-)
Joachim Sauer

Réponses:

13

J'ai fait un peu de cela lorsque j'ai commencé avec Java, il y a des années. Mon approche était de lire la spécification VM et de regarder la sortie de javap -c, qui affiche le bytecode désassemblé d'une classe. J'ai également essayé de créer des classes java avec un bytecode particulier, en utilisant un assembleur de bytecode java. Il y a un assembleur appelé jasmin , si vous voulez essayer ça.

Vous pouvez également consulter le document Lambda Expression Translation que Brian Goetz d'Oracle a publié, qui couvre la stratégie qui sera utilisée pour traduire les lambdas (fermetures, essentiellement) qui sont ajoutées dans Java 8.

Vous pouvez également obtenir le code source de la machine virtuelle Hotspot depuis OpenJDK , et la version à accès anticipé du compilateur javac avec prise en charge lambda (référentiel hg) pour JDK 8, si vous avez vraiment envie de plonger dans le fond de la piscine.

Examiner la collecte des ordures est probablement une bonne idée. Une recherche rapide a révélé cet article de Dr. Dobbs sur le GC le premier de Java. Je ne sais pas si c'est une bonne introduction. Je suppose que vous connaissez déjà les ramasseurs d'ordures de marquage et de balayage et générationnels; sinon, vous voudrez d'abord les lire.

David Conrad
la source
3

Quelques idées supplémentaires:

  • Impliquez-vous dans le projet OpenJDK . Rien ne vaut la compréhension des internes de certains logiciels en les piratant!
  • Regardez comment d'autres langages JVM (par exemple Clojure ou Scala) génèrent du code pour la JVM
  • Faites un mini-projet qui vous intéresse et nécessite l'utilisation des internes de la JVM. Peut-être en utilisant quelque chose comme ASM pour manipuler le bytecode ..
mikera
la source
2

Si vous n'êtes pas encore familier avec le format de bytecode Java, alors envisagez d'écrire un petit compilateur qui crée un code d'octet Java valide (ou un assembleur Jasmin) et faites-le fonctionner correctement.

Voir "Hello World" ou "4" (donné 2 + 2) généré par votre code est très satisfaisant.


la source
1

En plus de ce que tout le monde a dit, consultez la page Java Performance Tuning . Il contient de nombreux articles sur la récupération de place et le réglage des performances en général. Il contient également une liste de livres de réglage des performances qui pourraient également être intéressants pour vous.

Andreas Johansson
la source