Maison >Java >javaDidacticiel >Comment exécuter un programme Java dans le terminal ? Analyser son mécanisme de fonctionnement et ses principes de fonctionnement

Comment exécuter un programme Java dans le terminal ? Analyser son mécanisme de fonctionnement et ses principes de fonctionnement

php是最好的语言
php是最好的语言original
2018-08-01 15:30:464710parcourir

Tous ceux qui connaissent un peu doivent savoir que Java est un langage facile à démarrer mais difficile à maîtriser. Parce qu'il a beaucoup de connaissances, il n'est pas possible de tout maîtriser du jour au lendemain. est le mécanisme de fonctionnement et le processus de fonctionnement des programmes Java. Tout le monde devrait l'attendre avec impatience. La mise en page peut être un peu compliquée. Veuillez me pardonner, je continuerai à mettre à jour davantage d'articles de haute qualité. à partager avec vous. Nous maintiendrons toujours l’objectif d’aider les autres. apache php mysql

java a deux mécanismes de base : la machine virtuelle Java et le mécanisme de récupération de place. À l’heure actuelle, l’accent est mis ici sur l’exécution de programmes Java par JVM.

(1) Comment exécuter un programme java dans le terminal (je l'ai exécuté sous mac, le principe est le même sous windows, à peu près pareil)

Faire En principe, jdk doit avoir été installé et il n'y a aucun problème.

Tout d'abord, si vous souhaitez exécuter une classe Java, vous devez d'abord avoir une classe Java

1 Créez un dossier nommé Java et créez un fichier se terminant par .java sous le. dossier (I Il a été édité avec sublime, d'autres éditeurs sont également acceptables), voici HelloWorld à titre d'exemple

Comment exécuter un programme Java dans le terminal ? Analyser son mécanisme de fonctionnement et ses principes de fonctionnement

2. Compilez le fichier via la commande

192:libexec huayu$ javac /Users/huayu/Desktop/java/HelloWord.java

Exécution terminée Après avoir exécuté la commande, vous trouverez un fichier supplémentaire se terminant par .class dans le dossier java

Comment exécuter un programme Java dans le terminal ? Analyser son mécanisme de fonctionnement et ses principes de fonctionnement

3. Exécutez le fichier de classe compilé (notez que il doit être à l'emplacement du fichier de classe. Allez à l'emplacement et exécutez la commande, sinon il signalera une erreur de classe introuvable), vous verrez la sortie suivante dans le terminal

192:java huayu$ java HelloWord
HelloWord

ici , félicitations ! Vous avez compilé et exécuté votre premier programme Java dans le terminal.

En fait, l'éditeur sait que les lettres de l'exemple ci-dessus sont fausses. S'il vous plaît, faites semblant de ne pas le remarquer et laissez-moi partir, hehe

(2. ) Le principe de fonctionnement de jvm

Le but des exemples ci-dessus n'est pas de nous permettre d'apprendre comment exécuter des programmes Java dans le terminal, mais de faire savoir à tout le monde quelles opérations sont effectuées dans le processus ci-dessus.

Le programme javac est un compilateur Java. Il compile le fichier HelloWorld.java dans le fichier HelloWorld.class et l'envoie à la machine virtuelle Java. La machine virtuelle exécute le bytecode placé dans le fichier de classe par le compilateur.

(1) Le mécanisme principal de chargement des fichiers de classe par JVM

Comment exécuter un programme Java dans le terminal ? Analyser son mécanisme de fonctionnement et ses principes de fonctionnement

Le chargement des classes dans JVM est effectué par le chargeur de classe (ClassLoader) et ses sous-classes Implémenté, le chargeur de classes en Java est un composant important du système d'exécution Java chargé de rechercher et de charger les classes dans les fichiers de classe au moment de l'exécution.
En raison de la nature multiplateforme de Java, le programme source Java compilé n'est pas un programme exécutable, mais un ou plusieurs fichiers de classe. Lorsqu'un programme Java doit utiliser une classe, la JVM s'assurera que la classe a été chargée, connectée (vérifiée, préparée et analysée) et initialisée.

Le chargement d'une classe fait référence à la lecture des données du fichier .class de la classe dans la mémoire. Habituellement, un tableau d'octets est créé pour lire dans le fichier .class, puis un objet Class correspondant au fichier. la classe chargée est générée. Une fois le chargement terminé, l’objet Class n’est pas terminé et la classe n’est donc pas encore disponible. Lorsque la classe est chargée, elle entre dans la phase de connexion, qui comprend trois étapes : vérification, préparation (allocation de mémoire pour les variables statiques et définition des valeurs initiales par défaut) et analyse (remplacement des références symboliques par des références directes). Enfin, la JVM initialise la classe, notamment : 1) Si la classe a une classe parent directe et qu'elle n'a pas été initialisée, initialisez d'abord la classe parent 2) S'il y a des instructions d'initialisation dans la classe, exécutez ces instructions d'initialisation ; en séquence.

Le chargement des classes est complété par des chargeurs de classes, qui incluent : le chargeur racine (BootStrap), le chargeur d'extension (Extension), le chargeur système (System) et le chargeur de classe défini par l'utilisateur (sous-classe de java.lang.ClassLoader). À partir de Java 2 (JDK 1.2), le processus de chargement de classe adopte le mécanisme de délégation du père (PDM). PDM garantit mieux la sécurité de la plate-forme Java. Dans ce mécanisme, le Bootstrap fourni avec la JVM est le chargeur racine, et les autres chargeurs n'ont qu'un seul chargeur de classe parent. Le chargement d'une classe nécessite d'abord le chargement du chargeur de classe parent, et seulement lorsque le chargeur de classe parent est incapable de faire quoi que ce soit, son chargeur de classe enfant la charge tout seul. La JVM ne fournit pas de référence aux programmes Bootstrap to Java.

Voici les instructions pour plusieurs chargeurs de classes :

Bootstrap : généralement implémenté dans le code local, responsable du chargement de la bibliothèque de classes de base de la JVM (rt.jar)
Extension : depuis ; La bibliothèque de classes est chargée dans le répertoire spécifié par la propriété système java.ext.dirs. Son chargeur parent est Bootstrap ;

System : également appelé chargeur de classe d'application, sa classe parent est Extension. C'est le chargeur de classe le plus utilisé. Il enregistre les classes du répertoire spécifié par la variable d'environnement classpath ou la propriété système java.class.path, et est le chargeur parent par défaut des chargeurs définis par l'utilisateur.

(2) Comment Java parvient-il à « compiler une fois et s'exécuter partout » ?

Comment exécuter un programme Java dans le terminal ? Analyser son mécanisme de fonctionnement et ses principes de fonctionnement

Une machine virtuelle peut être comprise comme un processeur qui utilise le bytecode comme instructions machine.

Il existe différentes machines virtuelles pour différentes plates-formes d'exécution.

Le mécanisme de machine virtuelle Java protège les différences entre les plates-formes d'exploitation sous-jacentes et permet de « compiler une fois, exécuter n'importe où ».

(3) Mécanisme de collecte des déchets (GC)

Qu'est-ce que GC Pourquoi y a-t-il un GC ?

GC signifie garbage collection, traitement de la mémoire ? C'est là que les programmeurs sont sujets à des problèmes. Un recyclage de mémoire oublié ou erroné peut entraîner une instabilité ou même un crash du programme ou du système. La fonction GC fournie par Java peut surveiller automatiquement si l'objet dépasse la portée pour atteindre l'objectif de recyclage automatique de la mémoire. Le langage Java Aucune méthode d'opération explicite n'est fournie pour libérer la mémoire allouée. Les programmeurs Java n'ont pas à se soucier de la gestion de la mémoire car le garbage collector s'en charge automatiquement. Pour demander le garbage collection, vous pouvez appeler l'une des méthodes suivantes : System.gc() ou Runtime.getRuntime().gc(), mais la JVM peut masquer les appels explicites du garbage collection. Le garbage collection peut prévenir efficacement les fuites de mémoire et utiliser efficacement la mémoire disponible. Le garbage collector s'exécute généralement comme un thread distinct de faible priorité, effaçant et recyclant les objets du tas de mémoire qui sont morts ou n'ont pas été utilisés depuis longtemps dans des circonstances imprévisibles. Les programmeurs ne peuvent pas appeler le garbage collector en temps réel. ou tous les objets subissent un garbage collection (les programmeurs ne peuvent pas contrôler avec précision l'heure de la collecte. Appeler System.gc() ou Runtime.getRuntime().gc() équivaut à demander au GC de le collecter. C'est juste pour un instant, ce n'est pas certain quand vous le récupérerez.)

Au début de Java, le garbage collection était l'un des plus grands points forts de Java, car la programmation côté serveur était nécessaire pour empêcher efficacement les fuites de mémoire. Cependant, au fil du temps, le mécanisme de garbage collection de Java est devenu quelque chose. cela a été critiqué. Les utilisateurs de terminaux mobiles intelligents estiment généralement que le système iOS offre une meilleure expérience utilisateur que le système Android. L'une des raisons profondes réside dans l'imprévisibilité du garbage collection dans le système Android.

Supplément : Il existe de nombreux mécanismes de collecte des déchets, notamment : le garbage collection de copies générationnelles, le garbage collection marqué, le garbage collection incrémentiel, etc. Un processus Java standard possède à la fois une pile et un tas. La pile stocke les variables locales primitives et le tas stocke les objets à créer. L'algorithme de base de la plate-forme Java pour la récupération et la réutilisation de la mémoire tas s'appelle Mark and Sweep, mais Java l'a amélioré en utilisant le « garbage collection générationnel ». Cette méthode divise la mémoire du tas en différentes zones en fonction du cycle de vie de l'objet Java. Lors du processus de garbage collection, l'objet peut être déplacé vers différentes zones :

- Eden : Il s'agit de l'emplacement initial du tas. object La zone où ils sont nés, et pour la plupart des objets, c'est la seule zone où ils

ont jamais existé.
- Survivant : Les objets qui ont survécu au jardin d'Eden seront déplacés ici.
- Titulaire : C'est la maison d'objets survivants qui sont suffisamment vieux. Le processus de collecte jeune génération (Minor-GC) ne touchera pas à cet endroit. Lorsque la collection de la jeune génération ne peut pas placer l'objet dans le jardin de soins à vie, une collection complète (Major-GC) sera déclenchée, ce qui peut également impliquer une compression pour libérer suffisamment d'espace pour les objets volumineux.

Paramètres JVM liés au garbage collection :

  • -Xms / -Xmx — Taille initiale du tas/Taille maximale du tas

  • -Xmn — La taille de la jeune génération dans le tas

  • -XX:-DisableExplicitGC — Make System.gc( ) ne génère aucune fonction
  • -XX:+PrintGCDetails — Imprimer les détails du GC
  • -XX:+PrintGCDateStamps — Imprimer l'horodatage GC de l'opération
  • -XX:NewSize / XX:MaxNewSize — Définissez la taille de la nouvelle génération/taille maximale de la nouvelle génération
  • -XX:NewRatio — Vous pouvez définir le rapport entre l'ancienne génération et la nouvelle génération
  • -XX:PrintTenuringDistribution — Définir l'âge des objets dans le paradis des survivants après chaque GC de nouvelle génération. Les points
  • tissu
  • -XX:InitialTenuringThreshold / -XX:MaxTenuringThreshold : Définir l'initiale. valeur et valeur maximale de l'ancien seuil de génération
  • Grande valeur
  • -XX:TargetSurvivorRatio : Définir l'utilisation cible du survivant zone

    Hors sujet, je parle du mécanisme d'exploitation de jvm, alors Java est-il un langage compilé ou un langage interprété ?

J'ai vérifié beaucoup d'informations, et il y a de tout. Certaines personnes disent que c'est un langage interprété, et d'autres disent que c'est un langage compilé. pour comparer Java avec le langage js.

Tout d'abord, jetons un œil à l'introduction de ces deux types de langages :

Il existe deux principaux types de langages informatiques de haut niveau : compilés et interprétés :

Langage compilé : avant l'exécution du programme, il existe un processus de compilation distinct qui traduit le programme en langage machine. Lorsque le programme est exécuté ultérieurement, il n'est pas nécessaire de le traduire à nouveau.

Langage interprété : il traduit le programme en langage machine au moment de l'exécution, la vitesse d'exécution est donc plus lente que le langage compilé.

La plus grande différence entre les deux est de savoir si le code machine cible est enregistré : la compilation traduira le programme source d'entrée en un code machine cible dans une certaine unité (comme un bloc de base/une fonction/une méthode/une trace, etc.) et enregistrez-le (que ce soit sur le disque ou en mémoire) l'exécution ultérieure peut être réutilisée ; l'interprétation consiste à interpréter et à exécuter les instructions du programme source une par une, et à les exécuter pendant l'interprétation, le code cible n'est pas enregistré, et là. Il n’y a aucune information pouvant être réutilisée dans des exécutions ultérieures.

Comprendre le processus en cours d'exécution de Java : le fichier source Java (*.java) est compilé par le compilateur Java (javac) pour générer un fichier de bytecode ByteCode (*.class). L'ordinateur (c'est-à-dire la machine virtuelle Java, JVM) interprète et exécute. La machine virtuelle envoie chaque bytecode à exécuter à l'interprète. L'interpréteur le traduit en code machine cible sur une machine spécifique, puis l'exécute sur la machine spécifique.

Comment exécuter un programme Java dans le terminal ? Analyser son mécanisme de fonctionnement et ses principes de fonctionnement

Bien que le premier processus de Java soit la compilation javac et que son fichier cible soit ByteCode, pas le langage machine, il peut y avoir trois méthodes de traitement ultérieures (ici, actuellement pour ces trois les méthodes de traitement ne sont pas évaluées et la vérification doit être effectuée après une discussion approfondie des connaissances de la JVM) :

1 Pendant l'exécution, le ByteCode est envoyé un par un à l'interpréteur depuis la JVM, et l'interpréteur le fera. traduisez-le en code machine et exécutez-le. (Beaucoup de gens disent que les langages interprétés sont basés sur cela comme point de départ)

2. Pendant l'exécution, certains ByteCode peuvent être compilés dans le code machine cible par le compilateur Just In Time (JIT), puis exécutés. (Avec la méthode comme unité de traduction, elle sera enregistrée et n'aura pas besoin d'être traduite en code machine pour la deuxième exécution), car certaines JVM sont implémentées à l'aide d'une compilation JIT pure et n'ont pas d'interpréteur à l'intérieur, comme : JRockit, Maxine VM.

3. RTSJ, après javac, effectue une compilation secondaire AOT pour générer du code de plate-forme cible statique.

Parfois, les trois méthodes ci-dessus peuvent être utilisées en même temps. Au moins, 1 et 2 sont utilisés en même temps, et 3 doit être spécifié manuellement par le programmeur.

À cet égard, je suis plus disposé à accepter que Java soit un langage hybride entre compilation et interprétation.

fin :

C'est la fin de cet article Merci pour votre soutien. S'il y a des lacunes, vous êtes les bienvenus. signaler et communiquer !

Articles connexes :

Analyse du mécanisme de fonctionnement du programme et des erreurs en Java

Interprétation approfondie du mécanisme de fonctionnement de PHP

Vidéos associées :

Définition de l'appel de méthode et appel de la méthode de type void - Tutoriel vidéo JAVA pour débutant

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn