Définition et vérification de l'environnement Linux

Les systèmes d'exploitation Linux® subissent un grand nombre de correctifs et de mises à jour.

Le personnel d' IBM® ne peut pas tester la machine virtuelle Java par rapport à chaque correctif. L'intention est de la tester par rapport aux dernières versions de quelques distributions. En règle générale, vous devez maintenir les systèmes à jour avec les derniers correctifs. Pour obtenir les mises à jour les plus récentes et afficher les listes de correctifs, voir les pages de support du SDK Java.

Répertoire de travail

Le répertoire de travail en cours du processus de machine virtuelle Java est l'emplacement par défaut pour la génération des fichiers core, des vidages Java™ , des vidages de segment de mémoire et des sorties de trace de machine virtuelle Java, y compris la trace d'application et la trace de méthode. Un espace disque libre suffisant doit exister pour ce répertoire. De plus, la machine virtuelle Java doit avoir une autorisation d'écriture dessus.

Vidages système Linux (fichiers core)

Lorsqu'un blocage se produit, les principales données de diagnostic à obtenir sont le vidage système. Pour pouvoir générer ce fichier, vous devez vérifier les paramètres suivants.

Paramètres du système d'exploitation

Ces paramètres doivent être corrects. Ces paramètres peuvent varier en fonction de la distribution et de la version de Linux .

Pour obtenir tous des fichiers core complets, définissez les options ulimit suivantes :
ulimit -c unlimited		 turn on corefiles with unlimited size  
ulimit -n unlimited		 allows an unlimited number of open file descriptors
ulimit -m unlimited		 sets the user memory limit to unlimited
ulimit -f unlimited		 sets the file size to unlimited

Pour plus d'informations sur les paramètres ulimit , voir Configuration de votre système dans la documentation utilisateur OpenJ9 .

A partir de Java 5, la valeur ulimit -c de la limite flexible est ignorée et la valeur de la limite absolue est utilisée pour garantir la génération du fichier core.

Les outils Linux comme ABRT (Automatic Bug Reporting Tool) et Apport utilisent les paramètres du fichier Linux /proc/sys/kernel/core_pattern pour rediriger les fichiers core sur un programme de diagnostic. Ces outils et les paramètres de fichier /proc/sys/kernel/core_pattern qu'ils utilisent peuvent empêcher la JVM de produire des vidages système correctement. Ils sont activés par défaut dans certaines distributions de Linux. Vous pouvez rencontrer ce message d'erreur :
JVMPORT030W "proc/sys/kernel/core_pattern setting ..... 
specifies that the core dump is to be piped to an external program.
Attempting to rename either core or core.<pid>
Vérifiez la configuration de ces outils ou envisagez de les désactiver si vous rencontrez des problèmes lorsque vous tentez de générer des vidages système à partir de la MV Java.
Paramètres de la machine virtuelle Java

Pour générer des fichiers core à la suite d'un plantage, vérifiez que la configuration de la JVM le permet.

Exécutez java -Xdump:what ; vous devez obtenir le résultat suivant :
-Xdump:system:
    events=gpf+abort+traceassert+corruptcache,
    label=/mysdk/sdk//jrebin/core.%Y%m%d.%H%M%S.%pid.dmp,
    range=1..0,
    priority=999,
    request=serial
Ces valeurs sont les réglages par défaut. events=gpf est le minimum à spécifier pour qu'un fichier core soit généré en cas de plantage. Vous pouvez changer et définir les options avec l'option de ligne de commande -Xdump:system[:name1=value1,name2=value2 ...]
Espace disque disponible

L'espace disque disponible doit être suffisamment important pour pouvoir écrire le fichier core.

La JVM permet d'écrire le fichier core dans n'importe quel répertoire spécifié dans l'option label. Par exemple :
-Xdump:system:label=/mysdk/sdk/jre/bin/core.%Y%m%d.%H%M%S.%pid.dmp
Pour écrire le fichier core à cet emplacement, l'espace disque doit être suffisant (jusqu'à 4 Go peuvent être requis pour un processus 32 bits) et les droits d'accès corrects pour que le processus Java puisse écrire à cet emplacement.

ZipException ou IOException sous Linux

Lorsque vous utilisez un grand nombre de descripteurs de fichier pour charger différentes instances de classes, vous pouvez voir un message d'erreur "java.util.zip.ZipException: error in opening .zip file" ou une autre forme de IOException indiquant qu'un fichier n'a pas pu être ouvert. La solution consiste à augmenter le nombre de descripteurs en utilisant la commande ulimit. Pour identifier la limite en cours de fichiers ouverts, utilisez la commande :
ulimit -a
Pour pouvoir ouvrir plus de fichiers, utilisez la commande :
ulimit -n 8196

Linux sur zSeries

Si vous exécutez Java 7 sous zLinux sous zVM sur du matériel z10 , vous devez utiliser zVM version 5 édition 2 ou ultérieure. Avec les versions plus anciennes de zVM, vous ne bénéficiez pas des avantages de performances qu'offre DFP.

Bibliothèques d'unités d'exécution

Les distributions prises en charge par la machine virtuelle Java IBM fournissent la bibliothèque d'unités d'exécution POSIX native améliorée pour Linux (NPTL).

Vous pouvez identifier votre version de glibc en accédant au répertoire /lib et en exécutant le fichier libc.so.6. La commande Linux ldd imprime des informations qui doivent vous aider à résoudre les dépendances de bibliothèque partagée de votre application.

Utilisation de limites de temps UC pour contrôler les tâches en boucle

Etant donné que les unités d'exécution en temps réel s'exécutent avec des priorités hautes et avec la planification FIFO, les applications défaillantes (généralement avec des boucles limitées UC) peuvent empêcher un système de répondre. Dans un environnement de développement, il peut être utile d'arrêter les tâches en boucle en limitant le temps UC consommé par les tâches. Voir #linux_setup__linux_core_files pour une discussion sur les paramètres de limite souple et absolue.

La commande ulimit -t affiche la valeur du délai d'attente en cours en secondes d'UC. Cette valeur peut être réduite soit avec des valeurs souples, par exemple, ulimit -St 900pour fixer le délai souple à 15 minutes, soit avec des valeurs dures pour arrêter les tâches en boucle.