Chapitre 1 Architecture JVM et Java

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.

Insérez la description de l'image ici

  • 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

Insérez la description de l'image ici

  • À 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 ++

Insérez la description de l'image ici

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

    URL canonique java8

Insérez la description de l'image ici

Insérez la description de l'image ici

Insérez la description de l'image ici

Insérez la description de l'image ici

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

Insérez la description de l'image ici

  • Spécification de la machine virtuelle Java

Insérez la description de l'image ici

  • JVM: plateforme multilingue

Insérez la description de l'image ici

  • 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?

Insérez la description de l'image ici

4 événements majeurs dans le développement de Java

Insérez la description de l'image ici
Insérez la description de l'image ici
Insérez la description de l'image ici

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
  • 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

Insérez la description de l'image ici

Insérez la description de l'image ici

  • Structure du système Android de Google

Insérez la description de l'image ici

Dalvik Virtal Machine interprète et exécute les fichiers .dex

6 Structure générale de la JVM

Insérez la description de l'image ici

Insérez la description de l'image ici

7 Flux d'exécution de code Java

Insérez la description de l'image ici

Insérez la description de l'image ici

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.
  • 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;
        }
    }
    

Insérez la description de l'image ici

Insérez la description de l'image ici

Insérez la description de l'image ici

Insérez la description de l'image ici

Insérez la description de l'image ici

Insérez la description de l'image ici

  • 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

Insérez la description de l'image ici

Insérez la description de l'image ici

Insérez la description de l'image ici

Insérez la description de l'image ici

Insérez la description de l'image ici

Insérez la description de l'image ici

Insérez la description de l'image ici

Insérez la description de l'image ici

Insérez la description de l'image ici

Insérez la description de l'image ici

Insérez la description de l'image ici

Insérez la description de l'image ici

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

Insérez la description de l'image ici

Insérez la description de l'image ici

Insérez la description de l'image ici

  • 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.

Insérez la description de l'image ici

  • 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.

Je suppose que tu aimes

Origine blog.csdn.net/weixin_42638946/article/details/113643143
conseillé
Classement