erreur mémoire web services en java

tet.dum
erreur mémoire web services en java

Bonjour,
j'ai développé un web service an java tout bete, (qui fait l'additiion de 2 entiers) avec Eclipse.
Je veux l'utiliser dans un projet java basique, développé par mon équipe. Je fais donc un .jar du client et je l'inclus dans le build path du projet.
ensuite, je peux faire :
MonServiceService service = MonServiceServiceLocator();
MonService port = service.getAjouter();
port.addition(3,5);

La derniere ligne doit atre faite à plusieurs endroits dans le programme avec des paramètres différents, calculés par le programme.
Le probleme est que j'obtiens l'erreur de mémoire suivante:
Exception in thread "AWT-EventQueue-0" java.lang.OutOfMemoryError: Java heap space
Ca semble etre un dépassement de mémoire ou quelque chose comme ca...
En fait, l'erreur ne se produit pas quand port.addition(3,5) n'est pas appelée beaucoup de fois dans le programme. Mais lorsqu'on commence à en avoir besoin une vingtaine de fois, j'ai l'erreur.
Quelqu'un a -t-il une solution? Vous savez comment faire pour éviter ca?
Merci d'avance
tet.dum

fredericmazue

Quote:
J'ai développé un web service an java tout bete,

Tout bête c'est toi qui le dis.

Quote:

Exception in thread "AWT-EventQueue-0" java.lang.OutOfMemoryError: Java heap space
Ca semble etre un dépassement de mémoire ou quelque chose comme ca...

Ce message d'erreur est suspect. Ou il y a des choses que tu ne nous dis pas.

AWT-EventQueue-0 c'est la file standard des événements d'interface utilisateur (Bouton, List, etc) aussi bien pour les composants AWT que Swing.
Si évènement il y a à, priori interface utilisateur il y a aussi.... ce que tu ne dis pas. Est-ce le cas ?

Parce que si interface utilisateur il y a dans un Web Service, il n'est pas impossible (selon ce que tu veux faire exactement) que ça ne sois pas tout bête....

tet.dum

effectivement, j'ai oublié de préciser que le programme dans lequel je vais mettre mon code client est lancé via une interface graphique.
A certains moments, j'ai besoin de faire appel au werbe service, et souvent de nombreuses fois, et c'est la que tout plante...
si vous avez d'autres questions, je veux bien vous aider si pensez savoir de quoi viens mon erreur...
Merci
tet.dum

fredericmazue

On ne peut rien me cacher ;)

Quote:

si vous avez d'autres questions, je veux bien vous aider si pensez savoir de quoi viens mon erreur...

Je n'ai pas besoin d'aide ;)
Oui je pense savoir. Enfin pour ce qui est de l'idée générale. AMHA le message d'erreur signale que les évènements (souris, clavier, etc) ne sont pas pompés correctement.
Ce genre d'erreur se produit volontiers quand un composant AWT ou Swing travaille dans un thread autre que le thread principal (celui avec lequel l'appli démarre par main)
Ou bien si la partie cliente proprement dite du Web Service travaille dans un thread séparé et que lorsqu'elle récupère un résultat elle tente de l'afficher dans un composant géré par le thread principal.

Est-ce le cas ? Je dirais volontiers que oui ;) Je verrais assez bien le deuxième cas de figure :)

Si c'est le cas il faut restructurer le code comme expliqué dans Programmez! 64.
On devrait toujours garder ses Programmez! près de soi ;)
Si jamais tu avais fait l'erreur impardonnable de l'égarer, tu seras pardonné quand même et on en reparlera ici :)

tet.dum

Quote:
AMHA

?
Quote:
le message d'erreur signale que les évènements (souris, clavier, etc) ne sont pas pompés correctement.
Ce genre d'erreur se produit volontiers quand un composant AWT ou Swing travaille dans un thread autre que le thread principal (celui avec lequel l'appli démarre par main)
Ou bien si la partie cliente proprement dite du Web Service travaille dans un thread séparé et que lorsqu'elle récupère un résultat elle tente de l'afficher dans un composant géré par le thread principal.

Est-ce le cas ? Je dirais volontiers que oui Je verrais assez bien le deuxième cas de figure.

Quote:
je ne sais pas, ce n'est pas moi qui m'occupe de la gestion des threads...
Si c'est le cas il faut restructurer le code comme expliqué dans Programmez! 64.
On devrait toujours garder ses Programmez! près de soi
Si jamais tu avais fait l'erreur impardonnable de l'égarer, tu seras pardonné quand même et on en reparlera ici Smile

effectivement, je n'ai pas le programmez n°64 car ils n'y sont qu'a partir du 72 à la bibliotheque... je veux bien que vous me disiez comment faire.

Autre chose : on m'a dit que mon probleme venait peut etre de Tomcat (je l'uitlise pour déployer mon producteur) :"'à chaque appel de webService tomcat va te faire un thread pour le traiter. Si ton appel est un peu long, tu vas te retrouver avec X appel en parallele ce qui fait planter ta JVM car pas assez de place."
Cette solution semble etre possible aussi, vu que si j'enleve l'appel au web service, le programme ne plante pas.
Qu'en pensez-vous?
En tout cas, merci déjà pour votre aide...
tet.dum

bast2

tet.dum wrote:
Quote:
AMHA

?

AMHA = A mon humble avis :lol:

tet.dum

ok :oops:

fredericmazue

Quote:
Autre chose : on m'a dit que mon probleme venait peut etre de Tomcat (je l'uitlise pour déployer mon producteur)

Que signifie ce charabia ?

Quote:
à chaque appel de webService tomcat va te faire un thread pour le traiter. Si ton appel est un peu long, tu vas te retrouver avec X appel en parallele ce qui fait planter ta JVM car pas assez de place."
Cette solution semble etre possible aussi, vu que si j'enleve l'appel au web service, le programme ne plante pas.
Qu'en pensez-vous?

J'en pense que non. Tomcat c'est côté serveur. On parle côté client si je ne m'abuse. Faut quand même pas tout mélanger. Et puis encore une fois event-queue concerne les composants de l'interface utilisateur.

Quote:

Cette solution semble etre possible aussi, vu que si j'enleve l'appel au web service, le programme ne plante pas.

Faudrait voir ce que cet appel implique exactement dans le code du client pris globalement. On commence un peu trop à parler en aveugle là.

Il est possible aussi que le web service soit long à répondre et que si côté client l'utisateur fait joujou avec la souris il arrive à saturer la queue. Sait on jamais ?
Dans ce cas c'est que l'appel au Web WService devrait être dans un thread et qu'il ne l'est pas.

Quote:
je ne sais pas, ce n'est pas moi qui m'occupe de la gestion des threads...

Tu me cites, mais moi je n'ai pas écrit ça :lol:

Bon tant qu'on en sait pas plus sur ton application et que tu ne montres pas un peu de code histoire de voir comment c'est charpenté, c'est difficile de diagnostiquer plus précisémment. Mais tu as l'essentiel des pistes de recherches je pense.

Si tu dois invoquer des méthodes de composants depuis un thread, c'est avec la méthode java.awt.EventQueue.invokeLater que ça se traite

tet.dum

alors voila quelques précisions :
une fois l'interface, et donc le pgm lancé, un menu permet d'appeler le service web. la fonction qui fait ca collect des infos qui n'ont rien a voir avec les miennes, et à la fin je fais l'appel au service :

ClasseAjouterService service = new ClasseAjouterServiceLocator();
ClasseAjouter port = service.getClasseAjouter();
for (int k=0;k<listGraphElement.size();k++){
port.ajouter(1,2);
}

et voila! si le for est trop grand, ca plante!
courage, on y est presque...
merci
tet.dum
fredericmazue

Quote:
courage, on y est presque...

Je ne sais pas. Pas sûr. Je ressens comme un coup de fatigue subitement.

Quote:
alors voila quelques précisions :

Sans blague ?
Tu sais que tu es expert dans l'art de ne pas donner d'informations ? Ton Web Service tu le développes pour la DST ou quoi :?:

Bref:

Quote:
ClasseAjouterService service = new ClasseAjouterServiceLocator();
ClasseAjouter port = service.getClasseAjouter();
for (int k=0;k<listGraphElement.size();k++){
port.ajouter(1,2);
}

Ce code est presque le même que celui de ton premier message. Qu'est-ce que ça apporte de nouveau pour résoudre ton problème ?
Si problème il y a, il n'est évidemment pas localisé dans cette pauvre petite boucle.
Donc on y est pas presque hélas.

Je vais te dire une chose. J'en suis déjà à mon quatrième post sur ta question et tu n'as toujours pas fourni la moindre info exploitable. Sur ce forum j'essaie d'aider de mon mieux un maximum de monde, et tout cela je le fais totalement bénévolement, je tiens à le préciser. Mais si je dois en plus arracher une à une les informations, et jouer constamment aux devinettes. Alors je jette l'éponge. Vraiment désolé. J'espère que tu me comprendras.

tet.dum

qu'est ce que tu veux que je te donne de plus?
je vais quand mm pas te donner le code des 26 packages et des 1000 fichiers java qui font tourner l'appli...
desolée de pas pouvoir donner plus de précisions, mais je ne vois pas ce que j'aurai pu faire de plus!

tet.dum

et puis, pas besoin de t'énerver comme ca, je suis la pour apprendre!

fredericmazue

Quote:

qu'est ce que tu veux que je te donne de plus?

En tout cas ce n'est pas en répétant toujours la même chose que le problème peut avancer.

Quote:

je vais quand mm pas te donner le code des 26 packages et des 1000 fichiers java qui font tourner l'appli...

Certes non :)
Mais justement localiser et isoler le problème petit à petit c'est tout l'art du débogage ça.
Je t'ai parlé de file d'événements relatifs aux composants (AWT-EventQueue-0). Si ton problème se produit quand tu invoques ton Web Service, c'est qu'il y a interaction entre les deux ce qui soit n'est pas normal, soit est mal codé. (*)
Tu devrais chercher dans cette direction et essayer d'isoler des bouts de code susceptible d'être concernés et les *montrer*.

(*) sauf si l'appli implémente un mécanisme d'évenements personnalisés et qu'elle pousse à tire larigot ces événements dans la file, ce qui est encore un autre pb possible.

Quote:

desolée de pas pouvoir donner plus de précisions, mais je ne vois pas ce que j'aurai pu faire de plus!

Dans ce cas je ne vois pas non plus ce que je peux faire de plus.
Si tu regardes bien des messages tu verras que tu ne donnes aucune autre information en dehors de dire que tu as un problème. Si quelqu'un peut résoudre ton truc avec ça bravo! Moi je ne peux pas.

Je t'ai donné des pistes. Je les pense valables et j'espères qu'elle te seront utiles.

Quote:

et puis, pas besoin de t'énerver comme ca

Ce n'est pas la question de s'énerver ou pas. J'avais bien écris "j'espère que tu me comprendras". Malheureusement ce n'est pas le cas apparemment.
Quote:

, je suis la pour apprendre!

Et bien apprend qu'aider quelqu'un qui ne donne pas d'infos, ça n'est pas possible. Pas possible pour moi du moins.
Apprend aussi que je ne m'énerve pas mais que je suis quelqu'un de direct qui dit ce qu'il pense.
Pour moi à partir de mainteant les choses sont toutes simples. Tu reviens avec des infos nouvelles et j'essaie de t'aider. Ou tu ne donnes pas d'infos nouvelles et je ne m'intéresse plus à ce problème, tout en souhaitant que quelqu'un d'autre sache t'aider.
fredericmazue

Au fait sans montrer les 1000 fichiers Java tu ne crois pas que tu pourrais montrer un peu du code de ClasseAjouterService et de ClasseAjouter.
Tu nous racontes que ça plante quand tu invoques en boucle port de ClasseAjouter. Tu ne crois pas que ça serait un minimum de montrer un peu de ce code. Franchement :?: :?