Surveillance de l'utilisation du disque et d'autres mesures en Java

1. Vue d'ensemble

Dans ce tutoriel rapide, nous allons discuter de la façon de surveiller les métriques clés en Java. Nous nous concentrerons sur l'espace disque, l'utilisation de la mémoire et les données de thread - en utilisant uniquement les API Java principales .

Dans notre premier exemple, nous utiliserons la classe File pour interroger des informations spécifiques sur le disque.

Ensuite, nous analyserons l'utilisation de la mémoire et les informations du processeur en plongeant dans la classe ManagementFactory .

Enfin, nous aborderons comment surveiller ces métriques clés au moment de l'exécution à l'aide de Java Profilers .

2. Introduction à la classe File

En termes simples, la classe File représente une abstraction d'un fichier ou d'un répertoire. Il peut être utilisé pour obtenir des informations clés sur le système de fichiers et maintenir l' indépendance du système d'exploitation en ce qui concerne les chemins de fichiers. Dans ce didacticiel, nous utiliserons cette classe pour examiner les partitions racine sur les machines Windows et Linux.

3. ManagementFactory

Java fournit la classe ManagementFactory en tant que fabrique pour obtenir des beans gérés (MXBeans) contenant des informations spécifiques sur la JVM . Nous en examinerons deux dans les exemples de code suivants:

3.1. MemoryMXBean

Le MemoryMXBean représente l'interface de gestion du système de mémoire de la machine virtuelle Java. Le temps d' exécution, la machine virtuelle Java crée une seule instance de cette interface que nous pouvons récupérer en utilisant la ManagementFactory de getMemoryMXBean () méthode.

3.2. ThreadMXBean

De la même manière que MemoryMXBean , ThreadMXBean est l'interface de gestion du système de thread de la JVM. Il peut être appelé à l'aide de la méthode getThreadMXBean () et contient des données clés concernant les threads.

Dans les exemples suivants, nous utiliserons ThreadMXBean pour mettre la main sur la classe ThreadInfo de la JVM - qui contient des informations spécifiques concernant les threads exécutés sur la JVM.

3. Surveillance de l'utilisation du disque

Dans cet exemple de code, nous utiliserons la classe File pour contenir des informations clés sur les partitions. L'exemple suivant renvoie l'espace libre, total et disponible du lecteur C: sur une machine Windows:

File cDrive = new File("C:"); System.out.println(String.format("Total space: %.2f GB", (double)cDrive.getTotalSpace() /1073741824)); System.out.println(String.format("Free space: %.2f GB", (double)cDrive.getFreeSpace() /1073741824)); System.out.println(String.format("Usable space: %.2f GB", (double)cDrive.getUsableSpace() /1073741824)); 

De même, nous pouvons renvoyer les mêmes informations pour le répertoire racine d'une machine Linux :

File root = new File("/"); System.out.println(String.format("Total space: %.2f GB", (double)root.getTotalSpace() /1073741824)); System.out.println(String.format("Free space: %.2f GB", (double)root.getFreeSpace() /1073741824)); System.out.println(String.format("Usable space: %.2f GB", (double)root.getUsableSpace() /1073741824)); 

Le code ci-dessus imprime l'espace total, libre et utilisable pour le fichier défini. Par défaut, les méthodes ci-dessus fournissent le nombre d'octets. Nous avons converti ces octets en gigaoctets pour rendre le résultat beaucoup plus lisible par l'homme.

4. Surveillance de l'utilisation de la mémoire

Nous allons maintenant utiliser la classe ManagementFactory pour interroger la mémoire disponible pour la JVM en appelant MemoryMXBean .

Dans cet exemple, nous nous concentrerons principalement sur l'interrogation de la mémoire du tas. Il est important de noter que la mémoire non-tas peut également être interrogée à l'aide de MemoryMXBean:

MemoryMXBean memoryMXBean = ManagementFactory.getMemoryMXBean(); System.out.println(String.format("Initial memory: %.2f GB", (double)memoryMXBean.getHeapMemoryUsage().getInit() /1073741824)); System.out.println(String.format("Used heap memory: %.2f GB", (double)memoryMXBean.getHeapMemoryUsage().getUsed() /1073741824)); System.out.println(String.format("Max heap memory: %.2f GB", (double)memoryMXBean.getHeapMemoryUsage().getMax() /1073741824)); System.out.println(String.format("Committed memory: %.2f GB", (double)memoryMXBean.getHeapMemoryUsage().getCommitted() /1073741824)); 

L'exemple ci-dessus renvoie respectivement la mémoire initiale, utilisée, max et engagée. Voici une brève explication de ce que cela signifie:

  • Initial: mémoire initiale que la JVM demande au système d'exploitation lors du démarrage
  • Utilisé: la quantité de mémoire actuellement utilisée par la JVM
  • Max: la mémoire maximale disponible pour la JVM. Si cette limite est atteinte, une OutOfMemoryException peut être levée
  • Committed: la quantité de mémoire garantie disponible pour la JVM

5. Utilisation du processeur

Ensuite, nous utiliserons ThreadMXBean pour obtenir une liste complète des objets ThreadInfo et les interrogerons pour obtenir des informations utiles concernant les threads en cours d'exécution sur la JVM.

ThreadMXBean threadMXBean = ManagementFactory.getThreadMXBean(); for(Long threadID : threadMXBean.getAllThreadIds()) { ThreadInfo info = threadMXBean.getThreadInfo(threadID); System.out.println("Thread name: " + info.getThreadName()); System.out.println("Thread State: " + info.getThreadState()); System.out.println(String.format("CPU time: %s ns", threadMXBean.getThreadCpuTime(threadID))); } 

Tout d'abord, le code obtient une liste des threads actuels à l'aide de la méthode getAllThreadIds . Pour chaque thread, il génère ensuite le nom et l'état du thread suivis du temps CPU du thread en nanosecondes.

6. Surveillance des métriques à l'aide des profileurs

Enfin, il convient de mentionner que nous pouvons surveiller ces métriques clés sans utiliser de code Java . Les profileurs Java surveillent de près les constructions et les opérations clés au niveau de la JVM et offrent une analyse en temps réel de la mémoire, des threads et plus encore.

VisualVM est un exemple de profileur Java et est fourni avec le JDK depuis Java 6. De nombreux environnements de développement intégrés (IDE) contiennent des plugins pour exploiter les profileurs tout en développant un nouveau code. Vous pouvez en savoir plus sur Java Profilers et VisualVM ici.

7. Conclusion

Dans cet article, nous avons abordé l'utilisation des API Java principales pour interroger des informations clés sur l'utilisation du disque, la gestion de la mémoire et les informations sur les threads.

Nous avons examiné plusieurs exemples d'utilisation des classes File et ManagmentFactory pour obtenir ces métriques.