Chapitre 1 Architecture JVM et Java
JVM expliquée par Song Hongkang de Shang Silicon Valley: lien bilibili
1. Introduction
- Avez-vous rencontré ces problèmes?
- Le système en ligne en cours d'exécution se fige soudainement, le système n'est pas accessible, même directement OOM!
- Vous voulez résoudre le problème du GC JVM en ligne, mais vous ne parvenez pas à démarrer
- Le nouveau projet est en ligne et je suis confus au sujet des différents paramètres de JVM, il suffit de le définir par défaut, puis juste de JJ
- Avant chaque entretien, vous devez réciter certains des principes et concepts de la JVM. Cependant, l'intervieweur vous demande souvent comment régler les paramètres de la JVM et comment résoudre des problèmes tels que GC et MOO dans des projets réels, avec une expression déconcertée.
- La plupart des développeurs Java, en plus d'utiliser diverses technologies de haute technologie liées à la plate-forme Java dans leurs projets, ont peu de connaissances sur la machine virtuelle Java de base de la technologie Java.
-
Comment les développeurs voient-ils le cadre de niveau supérieur?
- Certains développeurs ayant une certaine expérience de travail estiment que SSM, microservices et autres technologies de haut niveau sont les points clés, et les technologies de base ne sont pas importantes. Il s'agit en fait d'un «état morbide» qui met la charrue avant les boeufs.
- Si nous comparons l'API de la bibliothèque de classes de base à une formule mathématique, alors la connaissance de la machine virtuelle Java est comme le processus de dérivation de formule
-
Le système informatique va de plus en plus loin pour nous Il est facile d'écrire du code de programme dans un langage de haut niveau sans comprendre l'implémentation sous-jacente. Mais en fait, les ordinateurs ne connaissent pas les langages de haut niveau
-
À quoi les architectes pensent-ils chaque jour?
- Comment puis-je accélérer mon système?
- Comment éviter les goulots d'étranglement dans le système?
-
Il y a un post sur Zhihu: Comment dois-je consulter les informations de recrutement, à travers le salaire annuel de 500 000+?
- Participer à l'optimisation des performances et à la reconstruction du système existant pour assurer les performances et la stabilité de la plateforme
- En fonction des scénarios et des besoins commerciaux, déterminer la direction technique et faire la sélection technique
- Capacité à structurer et à concevoir indépendamment des solutions distribuées concurrentes sous des données massives pour répondre aux exigences fonctionnelles et non fonctionnelles
- Résolvez divers risques potentiels du système, l'architecture des fonctions de base et l'écriture de code
- Analyser les goulots d'étranglement du système, résoudre diverses maladies insolubles, optimiser les performances, etc.
-
Pourquoi devrions-nous apprendre JVM?
- Besoins en entretien (pour les entretiens BATJ, TMD et PKQ)
- Compétences essentielles pour les programmeurs intermédiaires et avancés
- Gestion de projet et besoins de réglage
- Poursuivez l'esprit des geeks
- Par exemple: algorithme de garbage collection, JIT, principes sous-jacents
-
Java contre C ++
2 Cibler la foule et bibliographie
-
Pour la foule
- Développeurs de plates-formes Java avec une certaine expérience du développement
- Concepteur logiciel, architecte
- Tuner système
- Les programmeurs qui ont une certaine base de programmation Java et veulent en savoir plus sur Java
- Passionnés de machine virtuelle, praticiens JVM
-
Comment enseignez-vous cette classe?
- Le temps théorique est plus que le temps de code
- Populaire, facile à comprendre et à parler humain
- Diagramme
-
bibliographie
3 Introduction à Java et JVM
-
Classement de la popularité des langues: URL
-
Écosystème Java
- En tant que plateforme : la machine virtuelle Java joue un rôle central. Groovy, Scala, JRuby, Kotlin, etc. font tous partie de la plateforme Java
- En tant que culture :
- Logiciels et frameworks open source tiers. Tels que Tomcat, Struts, MyBatis, Spring, etc.
- Même JDK et JVM eux-mêmes ont de nombreuses implémentations open source, telles que OpenJDK et Harmony.
- En tant que communauté : Java a les soutiens les plus techniques au monde et le soutien de la communauté open source, il existe d'innombrables forums et informations.
-
Java: un langage multiplateforme
- Spécification de la machine virtuelle Java
- JVM: plateforme multilingue
-
Avec la sortie officielle de Java7, les concepteurs de la machine virtuelle Java ont essentiellement implémenté la spécification JSR-292 pour exécuter des programmes écrits dans des langages non Java sur la plate-forme de machine virtuelle Java.
-
La machine virtuelle Java ne se soucie pas du tout de la langue dans laquelle le programme qui s'exécute est écrit, elle se soucie du fichier "bytecode" .
-
Java n'est pas le langage le plus puissant, mais JVM est la machine virtuelle la plus puissante.
-
Le bytecode java que nous disons habituellement se réfère au bytecode écrit en langage java. Pour être précis, tout format de bytecode pouvant être exécuté sur la plate-forme jvm est le même. Il devrait donc être collectivement appelé: jvm bytecode .
-
Différents compilateurs peuvent compiler le même fichier bytecode, et le fichier bytecode peut également s'exécuter sur différentes JVM.
-
La machine virtuelle Java n'est pas nécessairement liée au langage Java. Elle est uniquement associée à un format de fichier binaire spécifique - le format de fichier de classe. Le fichier de classe contient le jeu d'instructions de la machine virtuelle Java (ou appelé bytecode, Bytecodes).) Et le table des symboles, ainsi que d'autres informations auxiliaires.
-
Programmation mixte multilingue
- La programmation mixte multilingue sur la plate-forme Java est appelée le courant dominant. La résolution de problèmes dans des domaines spécifiques à travers des langages spécifiques est une direction pour le développement logiciel actuel pour répondre aux exigences de plus en plus complexes des projets .
- Imaginez que dans un projet, le traitement parallèle est écrit en langage Clojure, la couche d'affichage utilise JRuby / Rails et la couche intermédiaire utilise Java. Chaque couche d'application utilisera un langage de programmation différent pour terminer, et l'interface est pour chaque couche. Développeurs sont transparents, et il n'y a aucune difficulté d'interaction entre différents langages, tout aussi pratique que d'utiliser PAI natif dans leur propre langue, car ils finissent tous par fonctionner sur une machine virtuelle .
- Pour ces langages qui s'exécutent sur la machine virtuelle Java et autres que Java, le support système et de bas niveau se développe rapidement. Une série de projets et d'améliorations fonctionnelles centrées sur JSR-292 (comme le projet DaCinci Machine, le moteur Nashorn, InvokeDynamic), package Java.lang.invoke, etc.) pour favoriser le développement de la machine virtuelle Java d'une "machine virtuelle en langage Java" vers une "machine virtuelle multilingue" .
-
Comment vraiment comprendre JVM?
4 événements majeurs dans le développement de Java
5 Machine virtuelle et machine virtuelle Java
-
machine virtuelle
- La soi-disant machine virtuelle (Virtual Machine) est un ordinateur virtuel. C'est un logiciel utilisé pour exécuter une série d'instructions d'ordinateur virtuel. En général, les machines virtuelles peuvent être divisées en machines virtuelles système et programmer des machines virtuelles .
- La célèbre Vitural Box, VMware fait partie de la machine virtuelle du système, elle est une simulation d'un ordinateur physique et fournit une plate-forme logicielle capable d'exécuter un système d'exploitation complet.
- Le représentant typique de la machine virtuelle de programme est la machine virtuelle Java, spécialement conçue pour exécuter un seul programme informatique. Les commandes exécutées dans la machine virtuelle Java sont appelées instructions de bytecode Java.
- Qu'il s'agisse d'une machine virtuelle système ou d'une machine virtuelle programme, le logiciel qui s'exécute dessus est limité aux ressources fournies par la machine virtuelle
- La soi-disant machine virtuelle (Virtual Machine) est un ordinateur virtuel. C'est un logiciel utilisé pour exécuter une série d'instructions d'ordinateur virtuel. En général, les machines virtuelles peuvent être divisées en machines virtuelles système et programmer des machines virtuelles .
-
Machine virtuelle Java
- La machine virtuelle Java est un ordinateur virtuel qui exécute le bytecode Java. Il possède un mécanisme d'exploitation indépendant et le bytecode Java qu'elle exécute peut ne pas être écrit dans le langage Java.
- Les différents langages de la plate-forme JVM peuvent partager la multiplate-forme de la machine virtuelle Java, un excellent garbage collector et un compilateur juste à temps fiable.
- Le cœur de la technologie Java est la machine virtuelle Java (JVM, machine virtuelle Java), car tous les programmes Java s'exécutent à l'intérieur de la machine virtuelle Java
- Fonction: La machine virtuelle Java est l'environnement d'exploitation du bytecode binaire , qui est chargé d'y installer le bytecode et d'interpréter / de compiler dans l'exécution des instructions de la machine de la plate-forme correspondante. Pour chaque commande Java, la spécification de la machine virtuelle Java contient des définitions détaillées, telles que la façon d'obtenir les opérandes et l'emplacement des résultats du traitement.
- Fonctionnalités
- Compilez une fois, exportez et exécutez
- Gestion automatique de la mémoire
- Fonction de ramassage automatique des ordures
-
Emplacement de la JVM
- Structure du système Android de Google
Dalvik Virtal Machine interprète et exécute les fichiers .dex
6 Structure générale de la JVM
7 Flux d'exécution de code Java
8 Modèle d'architecture JVM
-
Le flux d'instructions entré par le compilateur Java est fondamentalement une architecture de jeu d'instructions basée sur la pile , et l'autre architecture de jeu d'instructions est une architecture de jeu d'instructions basée sur des registres .
-
Plus précisément: la différence entre ces deux architectures:
- Caractéristiques de l'architecture basée sur la pile :
- Conception et mise en œuvre simples, adaptées aux systèmes à ressources limitées;
- Évitez le problème de l'allocation de registre: utilisez la méthode d'instruction d'adresse zéro pour allouer.
- La plupart du flux d'instructions est constitué d'instructions à adresse nulle et son exécution dépend de la pile d'opérations. Le jeu d'instructions est plus petit et le compilateur est facile à implémenter.
- Pas besoin de support matériel, meilleure portabilité, meilleure multiplateforme
- Basé sur les caractéristiques de l'architecture du registre
- L'application typique est le jeu d'instructions binaires x86: comme le PC traditionnel et la machine virtuelle Davlik d'Android.
- L'architecture du jeu d'instructions dépend entièrement du matériel et la portabilité est médiocre
- Excellente performance et exécution efficace;
- Il faut moins d'instructions pour terminer une opération.
- Dans la plupart des cas, le jeu d'instructions basé sur l'architecture de registre est souvent dominé par des instructions à une adresse, des instructions à deux adresses et des instructions à trois adresses, tandis que le jeu d'instructions basé sur l'architecture de la pile est dominé par des instructions à adresse nulle.
- Caractéristiques de l'architecture basée sur la pile :
-
Exemple: décompiler javap
public class StackStruTest { public static void main(String[] args) { //int i = 2 + 3; int i = 2; int j = 3; int k = i + j; } }
-
Pour résumer:
- En raison de la conception multiplateforme, les instructions Java sont conçues en fonction de la pile . Différentes plates-formes ont des architectures de processeur différentes, elles ne peuvent donc pas être conçues comme basées sur des registres. L'avantage est qu'il est multiplateforme, le jeu d'instructions est petit et le compilateur est facile à implémenter, mais l'inconvénient est que les performances sont réduites et que plus d'instructions sont nécessaires pour réaliser la même fonction.
- Aujourd'hui, bien que la plate-forme intégrée ne soit plus la plate-forme courante courante des programmes Java (pour être précis, l'environnement hôte de HotSpotVM ne se limite plus aux plates-formes intégrées), alors pourquoi ne pas changer l'architecture en une architecture basée sur des registres? En effet, cette méthode est simple à implémenter; en outre, les résultats basés sur la pile peuvent être utilisés sur différentes plates-formes et il n'est pas nécessaire de les remplacer.
9 Cycle de vie JVM
-
Démarrage de la machine virtuelle
- Le démarrage de la machine virtuelle Java est effectué en créant une classe initiale par le chargeur de classe d'amorçage, qui est spécifiée par l'implémentation spécifique de la machine virtuelle.
-
Exécution de la machine virtuelle
- Une machine virtuelle Java en cours d'exécution a une tâche claire: exécuter des programmes Java.
- Il s'exécute au démarrage du programme et s'arrête à la fin du programme.
- Lors de l'exécution d'un programme dit Java, ce qui est réellement exécuté est un processus appelé la machine virtuelle Java .
-
Sortie de la machine virtuelle
-
Il existe plusieurs situations comme suit:
- Le programme se termine normalement
- Le programme a rencontré une exception ou une erreur lors de l'exécution et s'est terminé anormalement
- Le processus de la machine virtuelle Java se termine en raison d'une erreur dans le système d'exploitation
- Un thread appelle la méthode exit de la classe Runtime ou la classe System, ou la méthode halt de la classe Runtime, et le gestionnaire de sécurité Java autorise également cette opération de sortie ou d'arrêt.
- En outre, la spécification JNI (Java Native Interface) décrit la sortie de la machine virtuelle Java lors de l'utilisation de l'API d'invocation JNI pour charger ou décharger la machine virtuelle Java.
-
Système
public final class System { // ... public static void exit(int status) { Runtime.getRuntime().exit(status); } // ... }
-
Durée
public class Runtime { private static Runtime currentRuntime = new Runtime(); public static Runtime getRuntime() { return currentRuntime; } /** Don't let anyone else instantiate this class */ private Runtime() { } // ... public void exit(int status) { SecurityManager security = System.getSecurityManager(); if (security != null) { security.checkExit(status); } Shutdown.exit(status); } // ... public void halt(int status) { SecurityManager sm = System.getSecurityManager(); if (sm != null) { sm.checkExit(status); } Shutdown.halt(status); } // ... }
Un processus correspond à une JVM et une JVM correspond à un Runtime
-
10 L'histoire du développement de JVM
Changez le fichier .apk au format .zip, puis décompressez-le, le contenu affiché à l'intérieur est le suivant, nous pouvons voir le fichier .dex
- La structure de la mémoire d'une JVM spécifique dépend en fait de son implémentation. Les JVM de différents fournisseurs, ou différentes versions d'une même version prospère, peuvent présenter certaines différences. Ce cours utilise principalement Oracle HotSpot VM comme machine virtuelle par défaut.
- Comment savoir quelle technologie apprendre?
- Faites attention à la technologie utilisée par les grandes entreprises. Par exemple, Ali s'est entièrement tourné vers Flink en termes de big data. Nous devrions apprendre Flink.