Maison  >  Article  >  Java  >  Analyse du mécanisme d'exécution du programme et des erreurs en Java

Analyse du mécanisme d'exécution du programme et des erreurs en Java

黄舟
黄舟original
2017-09-26 10:05:011383parcourir

Cet article présente principalement le contenu pertinent de la machine virtuelle Java (JVM) ainsi que le mécanisme d'exécution et l'analyse des erreurs des programmes Java. Les amis qui en ont besoin peuvent en savoir plus.

JVM (Java Virtual Machine ) Une spécification pour les appareils informatiques qui peuvent être implémentés de différentes manières (logicielles ou matérielles). La compilation du jeu d’instructions pour une machine virtuelle est très similaire à la compilation du jeu d’instructions pour un microprocesseur. La machine virtuelle Java comprend un ensemble d'instructions de bytecode, un ensemble de registres, une pile, un tas de garbage collection et un champ de méthode de stockage.

La machine virtuelle Java (JVM) est un ordinateur imaginaire capable d'exécuter du code Java. Tant que l'interpréteur est porté sur un ordinateur spécifique conformément à la spécification JVM, tout code Java compilé peut être assuré de s'exécuter sur ce système.

1. Pourquoi utiliser la machine virtuelle Java

Une caractéristique très importante du langage Java est son indépendance par rapport à la plateforme. L'utilisation de la machine virtuelle Java est la clé pour réaliser cette fonctionnalité. Si un langage général de haut niveau souhaite fonctionner sur différentes plates-formes, il doit au moins être compilé en différents codes cibles. Après l'introduction de la machine virtuelle du langage Java, le langage Java n'a plus besoin d'être recompilé lorsqu'il est exécuté sur différentes plates-formes. Modèle d'utilisation du langage Java La machine virtuelle Java protège les informations liées à des plates-formes spécifiques, de sorte que le compilateur du langage Java n'a besoin que de générer le code cible (bytecode) qui s'exécute sur la machine virtuelle Java et peut s'exécuter sur plusieurs plates-formes sans modification. Lorsque la machine virtuelle Java exécute le bytecode, elle interprète le bytecode en instructions machine à exécuter sur la plate-forme spécifique.

Mécanisme d'exécution Java

L'exécution d'un programme Java doit passer par trois étapes : l'écriture, la compilation et l'exécution.

L'écriture fait référence à la saisie du code du programme dans l'environnement de développement Java, et enfin à la formation d'un fichier source Java avec le suffixe .java.

La compilation fait référence au processus d'utilisation du compilateur Java pour dépanner les fichiers sources. Après la compilation, un fichier de bytecode avec le suffixe .class sera généré. Ce n'est pas comme le langage C qui génère finalement un. document exécutable.

L'exécution fait référence à l'utilisation d'un interpréteur Java pour traduire un fichier de bytecode en code machine, l'exécuter et afficher les résultats

Un fichier de bytecode est une sorte de code machine qui est compatible avec n'importe quelle machine spécifique. Le code intermédiaire est indépendant de l'environnement et de l'environnement du système d'exploitation. Il s'agit d'un fichier binaire et d'un fichier de code objet généré après la compilation du fichier source Java par le compilateur Java. Ni les programmeurs ni les ordinateurs ne peuvent lire directement les fichiers de bytecode. Il doit être interprété et exécuté par un interpréteur Java dédié. Par conséquent, Java est un langage qui est interprété et exécuté sur la base d'une compilation.

L'interpréteur Java est chargé de traduire les fichiers de bytecode en code machine dans des environnements matériels et des plates-formes de système d'exploitation spécifiques pour l'exécution. Par conséquent, les programmes Java ne peuvent pas s'exécuter directement sur les plates-formes de système d'exploitation existantes. Ils doivent s'exécuter sur une plate-forme logicielle appelée machine virtuelle Java.

La machine virtuelle Java (JVM) est un environnement logiciel permettant d'exécuter des programmes Java, et l'interpréteur Java fait partie de la machine virtuelle Java. Lors de l'exécution d'un programme Java, la JVM sera d'abord démarrée, puis elle sera responsable de l'interprétation et de l'exécution du bytecode Java, et le bytecode Java ne peut s'exécuter que sur la JVM. De cette manière, la JVM peut être utilisée pour séparer le programme de bytecode Java de la plate-forme matérielle spécifique et de l'environnement du système d'exploitation. Tant que la JVM d'une plate-forme spécifique est installée sur différents ordinateurs, le programme Java peut s'exécuter sans tenir compte des spécificités actuelles. La plate-forme matérielle et l'environnement du système d'exploitation n'ont pas besoin de prendre en compte la plate-forme sur laquelle le fichier de bytecode a été généré. La JVM masque les différences spécifiques entre les différentes plates-formes logicielles et matérielles, réalisant ainsi une véritable transplantation multiplateforme au niveau du code binaire. JVM est la base indépendante de la plate-forme de Java. Les fonctionnalités multiplateformes de Java sont obtenues en exécutant des programmes Java dans la JVM.

L'approche « écrire une fois, exécuter n'importe où » du langage Java résout efficacement le besoin de la plupart des langages de programmation de haut niveau de cibler différents Le système compile et génère différents codes machine, c'est-à-dire le problème hétérogène de l'environnement matériel et de la plate-forme d'exploitation, ce qui réduit considérablement les frais généraux de développement, de maintenance et de gestion des programmes.

Il convient de noter que les programmes Java peuvent obtenir des fonctionnalités multiplateformes via JVM, mais JVM n'est pas multiplateforme. En d’autres termes, les JVM sur différents systèmes d’exploitation sont différentes. Les JVM sur les plates-formes Windows ne peuvent pas être utilisées sous Linux, et vice versa.

Analyse des erreurs de fonctionnement du programme JAVA

De manière générale, un projet à grande échelle qui a été mis en service peut rencontrer des problèmes dans les situations suivantes :

1. Utilisation anormale du processeur

1) Vérifiez l'utilisation du processeur, l'utilisation du processus cible, puis vérifiez l'utilisation de chaque cœur. Il peut aider à déterminer s'il s'agit d'un problème lié à un seul thread ou à un problème de pool de threads.

2) Parfois, après que le programme ait fonctionné normalement pendant un certain temps, le processeur monte soudainement verticalement, ce qui peut être lié au verrouillage du programme (si le verrouillage est maintenu pendant un certain temps). peu de temps, il vaut mieux essayer cas+yield Pour implémenter le spin lock)

3) Deadlock, exportez directement la pile d'appels pour trouver une solution au problème.

2. Mémoire anormale

1) Fuite de mémoire, rien à dire, dumper la pile pour trouver le problème

2) Des GC fréquents entraîneront également des performances insuffisantes. Si les GC se produisent fréquemment dans le programme, vous devez faire attention. Si l'augmentation de la taille de la nouvelle génération ne résout toujours pas le problème, vous devez en localiser un grand nombre. codes qui créent des objets temporaires (vous pouvez utiliser la technologie Object Pool pour éviter l'application répétée de mémoire)

3. Arrêt inattendu d'un thread de travail

4. IO anormales

1) Afficher les fichiers ouverts, l'utilisation des opérations IO et l'utilisation du disque. Vous pouvez utiliser la commande df iostat, etc.


2) Pour vérifier s'il existe des programmes occupant la surveillance et l'utilisation du réseau, vous pouvez utiliser la commande netstat, etc.


Utiliser des outils pour analyser les défauts

1.jmap


jmap pid Afficher les informations relatives à l'utilisation de la mémoire dans le processus JAVA par défaut


jmap -histo pid Afficher la mémoire Nombre d'instances actives


jmap -dump:format=b,file=(file name) pid Exporte complètement la mémoire du programme Java. L'analyse complète est divisée en trois processus. Exécutez jmap -dump:format=b,file=a.bin une fois après l'initialisation du programme, puis exécutez-le une fois lorsque l'utilisation de la mémoire commence à augmenter, et enfin exécutez-le à nouveau après avoir atteint le limite supérieure. Utilisez JHat ou un outil tiers pour ouvrir le fichier de vidage.


3.jstack ou JCONSOLE


Par défaut, vous pouvez afficher les informations de la pile d'appels de processus pour analyser les délais d'attente d'E/S, les blocages ou d'autres situations. Les informations qui doivent être analysées lorsqu'une anomalie se produit dans un programme peuvent aider à localiser et à résoudre les problèmes.


jstat -gc pid gaptime Afficher les informations relatives au GC


jstat -compiler pid Afficher les informations de compilation en temps réel


4.kill - 3


Idem que ci-dessus, adapté aux serveurs sur lesquels l'outil de développement n'est pas installé. Il peut générer des informations sur la pile d'appels et une partie des informations GC


5.iftop View port réseau

Afficher le trafic réseau entrant et sortant Le trafic entre le serveur cible et le serveur cible peut aider à déterminer s'il est causé par une attaque

pile de machines virtuelles pstack

<.>
nécessite l'installation de gdb, qui est généralement utilisé pour vérifier les programmes c/c++, lorsque certaines erreurs au niveau de la machine virtuelle se produisent.

Résumé

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