L'éditeur PHP Xigua vous donnera la réponse Lorsque la JVM rencontre un crash SIGSEGV, vous pouvez prendre certaines mesures pour quitter rapidement. Tout d'abord, vous pouvez définir le paramètre JVM -XX:+CrashOnOutOfMemoryError pour provoquer le crash et la fermeture rapide de la JVM en cas de débordement de mémoire. Deuxièmement, vous pouvez utiliser le mécanisme de gestion des exceptions de Java pour intercepter les exceptions SIGSEGV et appeler la méthode System.exit() pour quitter le programme après avoir intercepté l'exception. De plus, vous pouvez également utiliser l'interface JNI pour interagir avec le système d'exploitation et obtenir une sortie rapide en appelant la méthode de sortie fournie par le système d'exploitation. En bref, en définissant correctement les paramètres de la JVM et en utilisant des mécanismes de gestion des exceptions appropriés, la JVM peut se fermer rapidement après un crash de SIGSEGV et améliorer la stabilité et la fiabilité du programme.
L'un de nos services plante fréquemment en raison de problèmes avec Tensorflow Java. Nous pouvons vivre avec cela (les k8 le redémarreront, dans de nombreux cas). Le problème est que la JVM met plusieurs minutes à se terminer. Existe-t-il un moyen de forcer une sortie rapide de sigsegv en code natif ?
corrupted size vs. prev_size while consolidating # # a fatal error has been detected by the java runtime environment: # # sigsegv (0xb) at pc=0x00007fe4f321a898, pid=1, tid=545 # # jre version: openjdk runtime environment zulu21.28+85-ca (21.0+35) (build 21+35) # java vm: openjdk 64-bit server vm zulu21.28+85-ca (21+35, mixed mode, sharing, tiered, compressed oops, compressed class ptrs, g1 gc, linux-amd64) # problematic frame: # c [libc.so.6+0x28898] abort+0x178 # # core dump will be written. default location: /data/core # # an error report file with more information is saved as: # /data/hs_err_pid1.log
Quelques minutes plus tard :
# [ timer expired, abort... ] [thread 1037 also had an error]
Ajoutez les options jvm suivantes :
-xx:+suppressfatalerrormessage -xx:-createcoredumponcrash
Cela forcera la JVM à se terminer immédiatement sur sigsegv sans créer de rapport d'erreur ni de vidage de mémoire. Si vous souhaitez toujours voir le message d'erreur fatale, remplacez -xx:+suppressfatalerrormessage
替换为 -xx:errorlogtimeout=1
.
Je soupçonne que cette JVM fonctionne avec un tas assez volumineux (> 64 Go), et pour un processus utilisant autant de mémoire, l'écriture du fichier de vidage de mémoire prend juste un certain temps :
# Core dump will be written. Default location: /data/core
Pendant les quelques minutes que cela prend, vous verrez peut-être le fichier core dump croître à l'emplacement ci-dessus (ce serait un moyen simple de confirmer cette théorie).
Le remède consiste à désactiver la création de fichiers de vidage de mémoire, dont les détails dépendent de votre système d'exploitation spécifique (mais les vidages de mémoire peuvent être désactivés sur presque tous les systèmes d'exploitation basés sur Unix). De plus, il peut y avoir des goulots d'étranglement liés au système de fichiers à cet emplacement particulier, ce qui entraîne une écriture du core dump plus lente que prévu.
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!