2009-01-27 13 views
2

J'ai un comportement très étrange chez JBoss, et j'aimerais profiter de la Sagesse collective de la foule SO.Fuite de mémoire dans JBoss

Nous utilisons JBoss (4.0.4 je pense) pour traiter les appels SOAP. En fait, il est utilisé comme serveur RPC glorifié, pas plus. Nous manquons de mémoire lorsque plus de 20 clients envoient leurs demandes en même temps. Les requêtes sont constituées de la requête entrante plutôt petite (SOAP correcte) et du paquet de résultat retourné qui est essentiellement une longue chaîne SOAP (et le contenu de la chaîne est XML). Oui, je réalise que c'est sous-optimal. Ne demande pas.

J'ai suivi la fuite vers une instance de org.jboss.axis.message.SAX2EventRecorder qui contient 4 millions d'objets (chaînes et entiers). Maintenant, même la réponse la plus longue ne contient pas 4 Mo de données. Les demandes sont toutes plus petites que 40K. Quelque chose est louche, mais je ne trouve aucune documentation sur le Web. Est-ce que quelqu'un peut me dire à quoi sert l'enregistreur? Et comment puis-je m'en débarrasser? Ou peut-être le configurer pour avoir moins de mémoire? Toute aide est appréciée.


Mise à jour: Pour clarifier - je l'ai fait faire vidage de la mémoire, et la décharge montre un tableau ou 4,000,000+ objets, cordes et Entiers. Le tableau est la propriété d'une org.jboss.axis.message.SAX2EventRecorder qui est à son tour détenue par ces gars-là:

[email protected] (141 octets): enregistreur de champ de org.jboss .axis.message.RPCParamElementImpl @ 0x19c32260 (123 octets): enregistreur de champ [email protected] (121 octets): enregistreur de champ [email protected] (124 octets) : enregistreur de terrain [email protected] (67 octets): enregistreur champ [email protected]98 (24 octets): champ $ this 0

Les structures de données de notre propre application sont quete gonflé, mais pas à ce degré.

Autre mise à jour: les puissances qui ont trouvé une solution "power-that-be-solution": nous passons à la mémoire 64 bits. Hourra.

+1

@Arkadiy: Ne supposez pas qu'il y a un bug dans JBoss; Supposons que le bug est dans votre code. Vous avez déjà identifié une condition "sous-optimale" de votre logiciel. Pourquoi ne peut-il y en avoir plus? –

+0

Ma question est: que faites-vous en cours d'exécution une telle ancienne version de JBoss? Il a 2,5 ans. Vous trouverez souvent chez les gens une hésitation ou même une réticence des gens à aider avec des logiciels obsolètes. – cletus

+0

@Gortok - J'ai assumé notre propre faute, mais ce damné tableau est responsable de la moitié de la version utilisée, et cela n'a rien à voir avec nous. Et, de la façon dont il est tenu (voir mise à jour), il peut être alloué pour chaque requête en cours, ce qui explique pourquoi nous échouons seulement lorsqu'un certain nombre de demandes sont en cours. – Arkadiy

Répondre

11

Exécuter avec la JVM arg -XX: -HeapDumpOnOutOfMemoryError. Cela vous donnera des décharges de tas quand vous manquez de mémoire. Vous pouvez ensuite analyser le vidage de tas avec l'outil jhat (fourni avec votre JDK). Vous pouvez également utiliser l'outil jconsole (qui est également fourni avec votre JDK) pour demander un vidage de mémoire à tout moment en utilisant les MBeans de gestion de mémoire.

Il vous dira ce que ces 4 millions d'objets contiennent réellement, ce qui pourrait vous donner une idée des raisons pour lesquelles le logiciel ne libère pas cette mémoire.

EDIT:

Il semble que vous n'êtes pas le seul à avoir ce problème. Il y a 2 rapports de bogues déposés Axis

AXIS-2698

AXIS-2749

Voir aussi AXIS-1771, il a quelques informations intéressantes au sujet de désérialisation et les moyens de médier son impact. Quelle version d'Axis utilisez-vous?

+0

Comment pensez-vous que SAX2EventRecorder est coupable? Bon sang, les gens ici s'habituent aux questions des débutants et ne s'attendent pas à mieux. – Arkadiy

+0

Voter sauvegarder: Arkadiy, cela n'a peut-être pas été utile pour vous, mais la façon dont vous avez formulé la question l'a fait apparaître comme un «débutant», d'autant plus que le titre est «Memory Leak in JBoss». La première règle d'utilisation d'un outil commercial est de supposer que le bug est dans votre code; pas l'outil commercial. –

+0

Je ne peux travailler qu'avec les informations que vous me donnez. Peut-être devriez-vous être plus précis la prochaine fois. Quoi qu'il en soit, quel est le contenu des objets dans SAX2EventRecorder? – Kevin

0

Si vous le pouvez, exécutez l'application sous Java 6. La dernière version inclut VisualVM pour le profilage. Il devrait être capable de montrer la croissance de la mémoire. Vous pouvez vous connecter à une machine virtuelle Java 5, mais cela ne s'affiche pas autant.