Java Performance Chapitre 3 Boîte à outils Java Performance

O'Reilly Japan \ -Java Performance Résumé du chapitre 3 de ce livre

Chapitre 1 Introduction \ -Qiita Approche des tests de performances du chapitre 2 \ -Qiita ← Article précédent Chapitre 3 Boîte à outils Java Performance - Qiita ← Cet article Chapitre 4 Mécanisme du compilateur JIT \ -Qiita ← Article suivant Chapitre 5 Principes de base du nettoyage de la mémoire \ -Qiita

3.1 Outils et analyses fournis avec le système d'exploitation

L'outil pour commencer est un outil qui n'a rien à voir avec Java.

Sur les systèmes Unix, commande sar, vmstat, iostat //qiita.com/pyon_kiti_jp/items/a44ac6e9229ba7b90c6b), il y a prstat, Sous Windows, il existe un type perf.

l'utilisation du processeur

L'utilisation du processeur peut être classée dans les deux types suivants.

--User time: l'heure à laquelle la CPU exécute l'application

L'objectif est de maximiser l'utilisation du processeur et de raccourcir le temps d'exécution.

La cause de l'inactivité du processeur

Inversement, vous souhaiterez peut-être limiter l'utilisation du processeur par programme. Dans un tel cas, le cycle du processeur peut être inactif de force pendant une certaine période de temps, ou la priorité peut être abaissée.

File d'attente d'exécution du processeur

Les systèmes Windows et Unix ont tous deux un mécanisme pour surveiller les threads exécutables (sans attendre les E / S ou en veille). Ce mécanisme s'appelle file d'attente d'exécution. Sous Windows, elle s'appelle la file d'attente du processeur et peut être visualisée avec typeperf.

C:> typeperf -si 1 "\System\Processor Queue Length"
"05/11/2013 19:09:42.678","0.000000"
"05/11/2013 19:09:43.678","0.000000"

Étant donné que la file d'attente d'exécution inclut celle qui est en cours d'exécution, elle doit être ** 1 ou plus **. En revanche, la file d'attente du processeur de Windows n'inclut pas celle en cours d'exécution, elle est donc ** 0 ou plus **.

Les performances souffrent lors de l'exécution de plus de threads qu'il n'y a de processeurs. Sous Unix, le nombre de files d'attente d'exécution == le nombre de processeurs doit être défini, et sous Windows, la longueur de la file d'attente du processeur doit être de 0. Cependant, ce n'est pas un principe absolu. Si la longueur de la file d'attente d'exécution augmente de temps en temps, il n'y a pas de problème. En revanche, si la file d'attente continue d'être trop longue, la charge sur la machine augmentera. Vous devez distribuer le processus sur une autre machine ou optimiser votre code.

Utilisation du disque

C'est un indice pour confirmer que quelque chose ne va pas. Par exemple, si wMB / s (nombre d'octets écrits par seconde) de ʻiostat -x` est faible mais que w / s (nombre d'écritures par seconde) est grand, il peut être préférable de combiner le traitement d'écriture. Au contraire, s'il y a trop d'écritures, on constate qu'il y a un goulot d'étranglement.

Vous pouvez voir si le système échange. Peut affecter les performances. Dans vmstat, vous pouvez voir si (swap in) et so (swap out).

L'utilisation du réseau

Les outils système standard sont insuffisants pour surveiller le trafic réseau. Netstat est utilisé sur les systèmes basés sur Unix. Tapez perf sous Windows.

Pour la bande passante réseau, nicstat est utilisé pour les systèmes Unix.

3.2 Outil de surveillance Java

--jcmd: obtenir des informations sur le processus spécifié --jconsole: vous pouvez voir le comportement de la JVM dans l'interface graphique. --jhat: vous pouvez parcourir les vidages de tas avec un navigateur Web. --jmap: Vous pouvez obtenir des informations de vidage de tas et de mémoire. --jinfo: peut afficher les propriétés du système JVM --jstack: vidage de la pile de processus Java. --jstat: affiche des informations sur le GC et le chargement des classes. --jvisualvm: surveillance JVM. Peut analyser les vidages de tas.

Informations de base sur JVM

Temps d'exécution

jcmd ${ID de processus} VM.uptime

Propriétés du système

Vous pouvez voir la même valeur que System.getProperties () (celle que vous spécifiez -Dhogehoge au démarrage).

jcmd ${ID de processus} VM.system_properties
jinfo -sysprops ${ID de processus}

Version JVM

jcmd ${ID de processus} VM.version

Arguments de ligne de commande JVM

jcmd ${ID de processus} VM.command_line

Indicateur de réglage JVM

jcmd ${ID de processus} VM.flags -all

Si vous supprimez -all, sera-ce uniquement celui spécifié?

Afficher les valeurs par défaut spécifiques à la plate-forme

java -XX:+PrintFlagsFinal -version

Une valeur autre que la valeur par défaut est spécifiée pour ceux avec: =.

Changement dynamique de drapeau

Tout d'abord, vous pouvez voir toutes les valeurs définies dans ↓.

jinfo -flags ${ID de processus}

Si vous voulez voir chaque élément de réglage

jinfo -flag PrintGCDetails ${ID de processus}

Lors de la modification de la valeur de réglage

jinfo -flag -PrintGCDetails ${ID de processus}
jinfo -flag PrintGCDetails ${ID de processus}

Informations sur le fil

Vous pouvez vérifier le nombre de threads en cours d'exécution sur l'interface graphique avec jconsole ou jvisualvm.

Comment afficher la pile de fils

jstack ${ID de processus}
jcmd ${ID de processus} Thread.print

Informations sur la classe

Utilisez jconsole ou jstat. jstat vous donne également des informations sur la compilation.

Analyse dynamique du ramasse-miettes

Dans jconsole, l'utilisation du tas peut être affichée graphiquement. Vous pouvez exécuter GC avec jcmd (comme vous le feriez avec jconsole?) jmap donne un aperçu du tas. jstat fournit diverses vues qui montrent ce que fait le GC.

Analyse ex post des décharges de tas

Peut être obtenu avec jvisualvm (outil GUI) ou jcmd ou jmap Peut être analysé avec jvisualvm ou jhat s'il s'agit d'un outil standard Il existe également un outil tiers appelé Eclipse Memory Analyzer Tool.

3.3 Outil de profilage

Profileur d'échantillonnage

Il existe un mode d'échantillonnage et un mode instrumenté Le mode d'échantillonnage ayant le moins de frais généraux, il est possible de minimiser le changement des caractéristiques de performance dû à l'intervention du profileur.

Cependant, de nombreux profileurs d'échantillonnage ne sont pas précis. Par exemple, un événement qui est appelé périodiquement par un minuteur et qui détecte uniquement le thread qui a été exécuté lorsque le minuteur s'est produit.

Dans la plupart des cas, la méthode qui apparaît au début du résultat du profilage ne représente que 2 à 3%, donc si vous faites de votre mieux pour la rendre deux fois plus rapide, elle ne sera peut-être que 1% plus rapide.

profileur instrumenté

Contrairement au type d'échantillonnage, vous pouvez également voir le nombre de fois où chaque méthode est appelée et le nombre moyen de fois que chaque méthode est appelée par seconde. A partir de là, par exemple, on peut comprendre si la mise en œuvre doit être accélérée ou améliorée afin de réduire le nombre d'exécutions.

Le profileur en mode instrumenté peut être inexact en termes de performances car le code qui compte le nombre d'appels est réécrit et facturé dans l'octet code. Par exemple, la taille du code de méthode peut augmenter et il peut être déterminé que l'inlining n'est pas nécessaire (détaillé au chapitre 4).

Les profileurs d'échantillonnage ne peuvent profiler que les threads qui se trouvent à un point de restauration (la mémoire est allouée), contrairement aux profileurs en mode instrumenté.

Chronologie des méthodes et threads bloqués

Les méthodes de blocage (les méthodes d'attente telles que LockSupport # park et Object # wait ()) ne consomment pas de temps processeur (n'augmentent pas l'utilisation du processeur), donc même si elles apparaissent en haut des résultats du profilage, elles ne peuvent pas être optimisées. .. Par conséquent, la plupart des profileurs n'affichent pas les méthodes bloquées par défaut.

Pour la méthode de blocage, vous pouvez voir le comportement en regardant l'état d'exécution du thread. Pour VisualVM, l'onglet Threads.

Profileur natif

Avec un profileur natif, vous pouvez profiler la JVM elle-même.

Il existe un profileur natif appelé Oracle Solaris Studio. Il s'appelle Solaris, mais il fonctionne également sous Linux.

Lorsqu'il est exécuté sur Solaris, vous pouvez profiter de la structure interne du noyau Solaris pour obtenir plus d'informations.

Il y avait une description comme ça. Je n'ai pas de machine Solaris donc je ne peux pas l'essayer.

Les données qui ne peuvent être obtenues qu'avec des outils natifs incluent le temps passé sur GC.

3.4 Java Mission Control Il est inclus dans la version commerciale de Java sous le nom jmc, pas dans la version open source. Une licence commerciale est requise pour l'utiliser.

JFR

Une fonction appelée JFR (Java Flight Recorder) est une fonction clé de jmc. Vous pouvez voir l'événement, tel que le blocage de thread.

Vous pouvez voir les événements liés au garbage collection dans la vue Mémoire JFR. Dans les chapitres 5 et 6, vous devriez lire tout en sachant comment cet outil est utile.

Dans l'onglet Vue d'ensemble de la vue Code JFR, vous pouvez voir les valeurs agrégées pour chaque package. Il est inhabituel d'avoir cette fonctionnalité.

Vous pouvez également obtenir des informations précises sur le gonflage des verrous. De plus, vous pouvez obtenir des informations qui ne peuvent pas être obtenues par jcmd ou jconsole.

Activer JFR

Pour l'activer, sur la ligne de commande qui lance l'application -XX:+UnlockCommercialFeatures -XX:+FlightRecorder Reçoit un drapeau.

JFR peut prendre deux méthodes d'enregistrement. Il y a un enregistrement continu pendant une certaine période de temps et un tampon en anneau est utilisé pour l'enregistrement continu.

Vous pouvez spécifier comment enregistrer avec des paramètres tels que -XX: + FlightRecorderOptions = $ {chaîne de paramètres}. Les options sont décrites dans ici.

Vous pouvez également définir la JVM en cours d'exécution avec la commande suivante (bien que l'option -XX: + FlightRecorder doive être spécifiée à l'avance).

jcmd ${ID de processus} JFR.start [option]

Pour un enregistrement continu, les données du tampon en anneau peuvent être sorties dans un fichier avec la commande suivante.

jcmd ${ID de processus} JFR.dump [option]

Les informations sur l'enregistrement en cours d'exécution peuvent être sorties avec la commande suivante (Au fait, il semble que plusieurs enregistrements puissent être effectués en un seul processus, je me demande donc si elle est souvent utilisée lorsque plusieurs enregistrements sont effectués).

jcmd ${ID de processus} JFR.check [verbose]

À ↓, arrêtez l'enregistrement.

jcmd ${ID de processus} JFR.stop [option]

Sélection d'événements JFR

JFR peut être étendu. Il semble que vous puissiez créer votre propre événement. La collecte d'événements implique inévitablement des frais généraux. Cependant, il y a certains événements que vous souhaitez obtenir même en cas de surcharge. Par exemple, surveillez les événements TLAB (Thread Local Area Buffer) et voyez si les objets sont alloués directement à l'ancienne zone.

Recommended Posts

Java Performance Chapitre 3 Boîte à outils Java Performance
Java Performance Chapitre 1 Introduction
Java Performance Chapter 2 Approche des tests de performances
Java Performance Chapitre 5 Bases de la récupération de place
Efficace Java Chapitre 2
Effective Java Chapitre 6 34-35
Effective Java Chapitre 4 15-22
Java efficace Chapitre 3
Réglage des performances de l'application Java
45 Techniques d'optimisation des performances Java (partie 1)
J'ai commencé Java Gold (Chapitre 1-1)
Efficacité de Java 3rd Edition Chapitre 5 Génériques
Java
Méthodes efficaces du chapitre 8 de Java 3rd Edition
Java
GraalVM for Java Performance (Windows Developer Build)
Dégradation des performances du conteneur Java dans l'environnement Menikoa
[Java] La réflexion est-elle vraiment lourde? Comparaison des performances
[Lire Java efficace] Chapitre 2 Item 7 "Eviter les finaliseurs"
Deep Learning Java à partir de zéro Chapitre 2 Perceptron
Effective Java 3rd Edition Chapitre 9 Programme Général