


Comment exécuter un programme Java dans le terminal ? Analyser son mécanisme de fonctionnement et ses principes de fonctionnement
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
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
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
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 » ?
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.
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 :
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!

Outils d'IA chauds

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

Video Face Swap
Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Lorsque vous utilisez MyBatis-Plus ou d'autres cadres ORM pour les opérations de base de données, il est souvent nécessaire de construire des conditions de requête en fonction du nom d'attribut de la classe d'entité. Si vous manuellement à chaque fois ...

Le traitement de la cartographie des champs dans l'amarrage du système rencontre souvent un problème difficile lors de l'exécution d'amarrage du système: comment cartographier efficacement les champs d'interface du système a ...

Commencez le printemps à l'aide de la version IntelliJideaultimate ...

Dépannage et solutions au logiciel de sécurité de l'entreprise qui fait que certaines applications ne fonctionnent pas correctement. De nombreuses entreprises déploieront des logiciels de sécurité afin d'assurer la sécurité des réseaux internes. ...

Conversion des objets et des tableaux Java: Discussion approfondie des risques et des méthodes correctes de la conversion de type de distribution De nombreux débutants Java rencontreront la conversion d'un objet en un tableau ...

Analyse du phénomène de fuite de mémoire des programmes Java sur différents processeurs d'architecture. Cet article discutera d'un cas où un programme Java présente différents comportements de mémoire sur les processeurs ARM et architecture x86 ...

Comment convertir les noms en nombres pour implémenter le tri au sein des groupes? Lors du tri des utilisateurs en groupes, il est souvent nécessaire de convertir le nom de l'utilisateur en numéros afin qu'il puisse être différent ...

Comment la solution de mise en cache Redis réalise-t-elle les exigences de la liste de classement des produits? Pendant le processus de développement, nous devons souvent faire face aux exigences des classements, comme l'affichage d'un ...
