2012-03-14 4 views
0

Mon application Java EE 6 fonctionnant sous JBoss 6 a récemment commencé à avoir des problèmes de mémoire.Comment faire pour résoudre OutOfMemoryError dans JBoss?

Situation

  • serveur de production.
  • Application de taille petite à moyenne utilisant JPA2/Hibernate avec les paramètres de mise en cache par défaut. ~ 170 cours.
  • Taille de la base de données ~ 1,8 Go, dont 90% appartiennent à des données binaires simplement récupérées par des servlets sans aucune mise en cache spéciale.
  • délai d'attente de session a été récemment passé de 2 heures à 10.
  • config JVM: -Xrs -Xms1024M -Xmx1024M -XX: MaxPermSize = 512M -Dsun.rmi.dgc.client.gcInterval = 3600000 -server
  • JBoss fonctionnant en tant que service.
  • Presque toutes les classes de contrôleur dans ViewScope

Deux questions avec ces faits à l'esprit:

  • Comment puis-je résoudre ces Oomes? JConsole ne trouve pas les machines virtuelles exécutées en tant que services. Idéalement, je devrais être capable d'inspecter des objets pertinents tels que des sessions pour trouver le voleur de mémoire.

  • Est-ce que cet OOME peut être légitime, avec l'augmentation du délai d'attente de session, et la solution consiste simplement à augmenter la taille du tas? L'application est utilisée depuis septembre 2011 sans aucun problème de mémoire. Le délai d'attente de la session a été considérablement augmenté il y a environ deux mois.

+0

Désolé, je n'ai pas été plus loin avec ce problème avant, et il semble s'être résolu pour l'instant.Le paramètre de vidage de tas sera un bon point de départ si des problèmes apparaissent à nouveau, attacher VisualJVM et similaire à un serveur de production semble difficile. Quoi qu'il en soit, je vais accepter votre réponse, car il contient des conseils d'analyse tas. –

Répondre

1

Il semble logique qu'une session utilise une certaine quantité de mémoire dans JBoss. L'augmentation de la durée d'expiration de la session entraînera probablement plus de sessions en mémoire à un moment donné - vous avez donc probablement augmenté les besoins en mémoire de votre application.

La résolution (initiale) la plus simple serait d'augmenter l'allocation de tas à votre application. Par exemple, définissez -Xmx2g (cela double la mémoire JVM à 2 GiB - votre paramètre actuel est 1 GiB). Évidemment, votre système devrait avoir suffisamment de mémoire physique disponible.

Si cela retarde simplement vos OOME, vous devrez analyser votre tas. Activer:

-XX:-HeapDumpOnOutOfMemoryError

Cela va créer une décharge physique du tas, pour l'analyse. Vous pouvez constater que vous avez une fuite de mémoire, ou juste que chaque session d'application a une certaine empreinte de mémoire - puis limiter les sessions ou augmenter l'allocation de mémoire pour convenir.

1

VisualJVM est un excellent outil inclus dans le JDK que vous pouvez utiliser pour diagnostiquer ce genre d'erreurs. Pour qu'il fonctionne avec JBoss, vous pouvez consulter this. VisualVM a la capacité d'extraire et d'analyser un tas de mémoire. Vous pouvez y voir toutes les classes chargées, toutes les instances par classe et l'allocation de mémoire de chaque instance. Avec cette information, vous pouvez mieux trouver la cause de votre problème.

Questions connexes