GNU/Linux >> Tutoriels Linux >  >> Linux

Quelle est la meilleure façon de gérer les conditions de mémoire insuffisante en Java ?

La seule véritable option est (malheureusement) de mettre fin à la JVM dès que possible.

Puisque vous ne pouvez probablement pas modifier tout votre code pour détecter l'erreur et répondre. Si vous ne faites pas confiance au OnOutOfMemoryError (Je me demande pourquoi il ne devrait pas utiliser vfork qui est utilisé par Java 8 et qui fonctionne sous Windows), vous pouvez au moins déclencher un vidage de tas et surveiller ces fichiers en externe :

java .... -XX:+HeapDumpOnOutOfMemoryError "-XX:OnOutOfMemoryError=kill %p"

Après avoir expérimenté cela pendant un certain temps, voici la solution qui a fonctionné pour nous :

  1. Dans la JVM générée, attrapez un OutOfMemoryError et quittez immédiatement, en signalant la condition de mémoire insuffisante avec un code de sortie au contrôleur JVM.
  2. Dans la JVM générée, vérifiez périodiquement la quantité de mémoire consommée du Runtime actuel . Lorsque la quantité de mémoire utilisée est proche de critique, créez un fichier d'indicateur qui signale la condition de mémoire insuffisante à la JVM du contrôleur. Si nous récupérons de cette condition et quittons normalement, supprimez ce fichier avant de quitter.
  3. Une fois que la JVM de contrôle a rejoint la JVM forkée, elle vérifie le code de sortie généré à l'étape (1) et le fichier d'indicateur généré à l'étape (2). En plus de cela, il vérifie si le fichier hs_err_pidXXX.log existe et contient la ligne "Out of Memory Error". (Ce fichier est généré par Java en cas de plantage.)

Ce n'est qu'après avoir mis en œuvre toutes ces vérifications que nous avons pu gérer tous les cas où la JVM forkée manquait de mémoire. Nous pensons que depuis lors, nous n'avons manqué aucun cas où cela s'est produit.

Le drapeau Java -XX:OnOutOfMemoryError n'a pas été utilisé à cause du problème de fourche, et -XX:+HeapDumpOnOutOfMemoryError n'a pas été utilisé car un vidage de tas est plus que nécessaire.

La solution n'est certainement pas le morceau de code le plus élégant jamais écrit, mais a fait le travail pour nous.


Linux
  1. Quel est le meilleur VPS :Windows ou Linux ?

  2. Quelle est la meilleure solution pour remplacer un nouvel répartiteur de mémoire dans un code existant ?

  3. Quelle est la bonne façon d'utiliser inotify ?

  4. Quelle est la bonne façon d'insérer un onglet dans sed?

  5. Linux :savoir quel processus utilise toute la RAM ?

Quelle est la meilleure distribution Linux pour les débutants ?

Les 10 meilleurs livres Linux à lire en 2019

Quel est le moyen le plus rapide d'exécuter un script ?

Quelle est la meilleure façon de définir une variable d'environnement dans .bashrc ?

Quelle est la meilleure façon de vérifier si un volume est monté dans un script Bash ?

Quel est le meilleur moyen d'obtenir des informations sur les disques actuellement non montés ?