Cet article est un article exclusif dans la série "You Don't Know 5 ..." pour DevelopersWorks. Cependant, peu d'entre nous peuvent comprendre comment les JVM font leur travail, comme l'allocation des tâches et la collecte des ordures, la transformation des fils, l'ouverture et la fermeture des fichiers, l'interruption et / ou la compilation de bytecode Java, etc.
Ne pas être familier avec le JVM affectera non seulement les performances de l'application, mais essaiera également de le résoudre en cas de problème avec le JVM.
Cet article présentera quelques indicateurs de ligne de commande que vous pouvez utiliser pour diagnostiquer et régler vos performances de machine virtuelle Java.
1.DirablexplicitGC
Je ne me souviens pas du nombre de fois que l'utilisateur m'a demandé de consulter les problèmes de performances de l'application.
Listing 1. System.gc ();
La copie de code est la suivante:
// Nous venons de sortir un tas d'objets, alors dis le stupide
// Collecteur des ordures pour les récupérer déjà!
System.gc ();
La collection explicite des ordures est une très mauvaise idée - comme vous enfermer vous et un bouledogue fou dans une cabine téléphonique. Bien que la syntaxe de l'appel soit implémentée de manière dépendante, si votre JVM exécute un collecteur de déchets générationnel (principalement System.gc (); oblige la machine virtuelle à effectuer un "balayage" du tas, bien que certains ne soient pas nécessaires. Tout le nettoyage est des ordres de grandeur plus chers qu'une opération GC régulière, et ce n'est qu'un simple problème mathématique.
Vous ne pouvez pas prendre mes mots à cœur - les ingénieurs de Sun fournissent un drapeau JVM pour cette erreur manuelle spéciale; -xx: + DisableExplicitGC Flag convertit automatiquement le System.gc () Peut voir si System.gc () est nuisible ou bénéfique pour l'ensemble de l'exécution JVM.
2.EPDumponoutofMemoryError
Avez-vous déjà expérimenté une situation où le JVM ne peut pas être utilisé, jetant constamment une orientation d'origine, et vous ne pouvez pas créer un débogueur pour vous-même pour l'attraper ou voir ce qui ne va pas? Des problèmes graves et / ou incertains comme celui-ci rendent souvent les développeurs fous.
L'acheteur est responsable du sien
Tous les drapeaux de ligne de commande ne sont pas pris en charge par une machine virtuelle, à l'exception des machines virtuelles Sun / Oracle. La meilleure façon de savoir si un drapeau est pris en charge est de l'essayer et de voir s'il fonctionne correctement. Si ces logos ne sont pas techniquement pris en charge, vous êtes entièrement responsable de les utiliser. Moi, Sun / Oracle, et IBM ne seront pas responsables si l'un de ces indicateurs fabriquait votre code, vos données, votre serveur ou tout ce qui vous concerne disparaît sans trace. Juste au cas, il est recommandé d'expérimenter d'abord dans un environnement virtuel (très production).
Ce que vous voulez en ce moment, c'est capturer un instantané du tas lorsque le JVM meurt - juste la commande -xx: + heapdumponoutofMemoryError peut le faire.
L'exécution de la commande informe le JVM de prendre un "Snapshot de vidage de tas" et de l'enregistrer dans un fichier de traitement, en utilisant généralement l'utilitaire JHAT (je l'ai décrit dans le post précédent). Vous pouvez spécifier le chemin d'accès réel vers le fichier enregistré à l'aide de l'indicateur de -xx: HeapDuMppath correspondant. (Peu importe où le fichier est enregistré, assurez-vous de vous assurer que le système de fichiers et / ou les processus Java doivent avoir des autorisations à configurer et peuvent y être écrites.)
3.BootClasspath
Il est utile de mettre régulièrement une classe dans un chemin de classe, qui est légèrement différent du ClassPath qui vient avec l'inventaire JRE ou le chemin de classe JRE qui est étendu d'une manière ou d'une autre. (Le nouveau fournisseur Java Crypto API est un exemple). Si vous souhaitez prolonger JRE, votre implémentation personnalisée doit être en mesure d'utiliser le chargeur de botté de démarrage, qui peut charger java.lang.object dans RT.Jar et tous ses fichiers connexes.
Bien que vous puissiez ouvrir illégalement Rt.Jar et déplacer votre implémentation personnalisée ou de nouveaux paquets, vous avez techniquement violé l'accord que vous avez accepté lors du téléchargement du JDK.
Au lieu de cela, utilisez l'option de -xbootclasspath de JVM, ainsi que les skins -xbootclasspath / p et -xbootclasspath / a.
-XbootClassPath vous permet de définir un chemin de classe complet (cela comprend généralement une référence à RT.Jar), ainsi que certains autres fichiers JAR accessibles à JDK (ne faisant pas partie de RT.Jar). -XbootClassPath / p précède la valeur dans le chemin de bootclass de bootclass existant et ajoute -xbootClassPath / a.
Par exemple, si vous avez modifié le java.lang.integer dans la bibliothèque et placé la modification sous un sous-chemin de mods, le paramètre -xbootClassPath / AMODS place le nouvel entier avant les paramètres par défaut.
4. Verbe
Pour Virtual ou tout type d'application Java, -Verbose est une application de diagnostic de premier niveau utile. Le logo a trois sous-loges: GC, Class et JNI.
Les développeurs essaient de savoir si le collecteur de déchets JVM échoue ou provoque de mauvaises performances. Malheureusement, expliquer la sortie GC est lourde - suffisamment pour écrire un livre. Pire, la sortie imprimée sur la ligne de commande change dans différentes versions Java ou non dans différents JVM, ce qui rend plus difficile d'interpréter correctement.
D'une manière générale, si le collecteur des ordures est un collectionneur générationnel (la plupart des machines virtuelles "au niveau de l'entreprise" sont). Une sorte de drapeau virtuel semble indiquer un chemin GC à balayage complet; dans Sun JVM, le drapeau apparaît sous la forme de "[Fullgc ...]" au début de la ligne de sortie GC.
La classe peut vous aider si vous souhaitez diagnostiquer Classloader et / ou les conflits de classe incompatibles. Il signale non seulement lorsque la classe est chargée, mais aussi où la classe est chargée, y compris le chemin vers le pot (IF à partir du pot).
JNI est rarement utilisé, sauf lors de l'utilisation de JNI ou de bibliothèques locales. Lorsqu'il est ouvert, il rapportera divers événements JNI, comme lorsque la bibliothèque locale est chargée, et lorsque la méthode rebondit à nouveau;
5.COMMAND-LINE-X
J'ai répertorié les options de ligne de commande que j'aime dans le JVM, mais il y a quelques autres choses dont vous avez besoin pour vous retrouver, exécuter l'argument de la ligne de commande -X, répertoriant tous les normes non standard (mais surtout sûres) fournies par le JVM ) Paramètres - Par exemple:
-Xint, exécuter le JVM en mode interprété (ce qui est utile pour tester si le compilateur JIT fonctionne réellement pour votre code ou vérifie s'il y a un bogue dans le compilateur JIT).
-Xloggc:, et -verbose: GC fait la même chose, mais enregistrez un fichier sans le diffuser dans la fenêtre de ligne de commande.
Les options de ligne de commande JVM changent de temps en temps, c'est donc une bonne idée de le vérifier régulièrement. Même vous regardez le moniteur tard dans la nuit et rentrez chez vous à 17h pour souper avec votre femme et vos enfants (ou détruire vos ennemis dans Mass Effect 2, selon vos préférences), ils sont tous différents.
Conclusion
Dans les environnements de production, les drapeaux de ligne de commande ne sont pas conçus pour une utilisation permanente - en fait, à l'exception des drapeaux que vous terminez pour régler le collecteur de déchets JVM, aucun drapeau de ligne de commande non standard n'est dédié à l'utilisation de la production. Cependant, il est très utile comme outil pour espionner le travail interne des machines virtuelles qui sont autrement complètement opaques.