[Résolu] OutOfMemoryException et programmation multi-threads

OutOfMemoryException et programmation multi-threads [Résolu] - Java - Programmation

Marsh Posté le 16-11-2006 à 16:10:39    

Bonjour,
 
Je suis en train d'implémenter un serveur web sous java où je crée un thread par socket cliente...
 
Le problème est que au bout de X connexions (environ 100) les unes après les autres (meme pas concurrentes), la JVM me renvoie un OutOfMemoryException : java heap size... Que faire?
 
Je ferme pourtant bien tous mes flux d'entrées/sorties et mes sockets à la fin de chaque Thread et (sauf si Exception) et j'ai vérifié, tous mes threads finis sont en état TERMINATED, donc je comprends pas pourquoi -à priori- la JVM ne désalloue pas la mémoire qu'a occupé ces threads...
 
Merci de m'éclairer et si je suis pas assez clair dans la description de mon problème de me demander où je pourrai apporter des explications...
++


Message édité par D@RKWoodius le 20-11-2006 à 18:01:31
Reply

Marsh Posté le 16-11-2006 à 16:10:39   

Reply

Marsh Posté le 16-11-2006 à 16:15:55    

tu join bien tes threads ?

Reply

Marsh Posté le 16-11-2006 à 16:20:37    

joindre mes threads? qu'est ce que ca veut dire?
 
++

Reply

Marsh Posté le 16-11-2006 à 16:29:21    

RTFM

Reply

Marsh Posté le 16-11-2006 à 16:32:08    

hein???

Reply

Marsh Posté le 16-11-2006 à 16:35:34    

STFW

Reply

Marsh Posté le 16-11-2006 à 16:38:55    

oki, quel manuel? "joindre des threads" d'après google ca veut rien dire...

Reply

Marsh Posté le 16-11-2006 à 16:44:58    

si tu veux parler de la méthode join(), non, mes threads sont totalements indépendants, il y en a un par connexion, et je ne garde pas de référence vers chaque thread dans ma classe principale...
 
ce que je comprends pas, c'est que lorsque mes threads se terminent (fin de la méthode run()), leur contenu ne semble pas libéré

Message cité 1 fois
Message édité par D@RKWoodius le 16-11-2006 à 16:46:44
Reply

Marsh Posté le 16-11-2006 à 17:02:42    

D@RKWoodius a écrit :

si tu veux parler de la méthode join(), non, mes threads sont totalements indépendants, il y en a un par connexion, et je ne garde pas de référence vers chaque thread dans ma classe principale...


 
Tu vois, avec un petit effort...   [:pingouino]  
 

D@RKWoodius a écrit :

ce que je comprends pas, c'est que lorsque mes threads se terminent (fin de la méthode run()), leur contenu ne semble pas libéré


Beh, est-ce que tu libères effectivement les resources?  [:airforceone]  


---------------
Now Playing: {SYNTAX ERROR AT LINE 1210}
Reply

Marsh Posté le 17-11-2006 à 08:40:04    

pas de join, pas de terminaison de thread.

Reply

Marsh Posté le 17-11-2006 à 08:40:04   

Reply

Marsh Posté le 17-11-2006 à 17:19:05    

Taz a écrit :

pas de join, pas de terminaison de thread.


Pourtant, l'état du thread est "Terminated", et je n'ai aucune raison de le "joindre", vu que je veux qu'ils aient une existence autonome du thread principal...
 
Comment faire?

Reply

Marsh Posté le 18-11-2006 à 16:24:58    

si tu vois le thread, c'est bien qu'il existe ... il est terminé mais pas détruit/recyclé tant que tu ne join pas.
 
Comment faire ? RTFM

Reply

Marsh Posté le 18-11-2006 à 18:10:27    

Taz a écrit :

pas de join, pas de terminaison de thread.


 :heink: qu'est ce que tu racontes ??
va le lire toi même le fucking manuel ... et donne un lien vers ce que tu avances si c'est réel parce que là ça sent bon le n'importe quoi.
 
 
D@RKWoodius> si ta mémoire explose, c'est forcément que tu gardes des références quelques part sur des objets ... C'est pas forcément les threads qui sont en cause, c'est peut être des objets alloué et non relachés quelque part dans l'execution du thread.
 
regarde notament du côté des List ou Map static : c'est une erreur assez courante quand on débute ...
 
Par exemple, cmme dis Taz, si tu est capable de demander l'état des threads, c'ets bien que tu as encore une référence vers eux ...

Message cité 1 fois
Message édité par benou le 18-11-2006 à 18:11:31
Reply

Marsh Posté le 19-11-2006 à 22:24:06    

Taz a écrit :

si tu vois le thread, c'est bien qu'il existe ... il est terminé mais pas détruit/recyclé tant que tu ne join pas.


Normal qu'il existe, quand je lis son état j'ai encore une variable qui pointe dessus, mais après la variable pointe vers le dernier thread créé... Et dans la javadoc il est dit que le thread mourait lorsque la fonction run() terminait... Et je veux pas faire de join() car l'existence de mon thread principal ne doit pas dépendre des threads fils...
 

benou a écrit :

si ta mémoire explose, c'est forcément que tu gardes des références quelques part sur des objets ... C'est pas forcément les threads qui sont en cause, c'est peut être des objets alloué et non relachés quelque part dans l'execution du thread.
 
regarde notament du côté des List ou Map static : c'est une erreur assez courante quand on débute ...
 
Par exemple, cmme dis Taz, si tu est capable de demander l'état des threads, c'ets bien que tu as encore une référence vers eux ...


Comme dit ci dessus, la seule variable qui référence le thread ne pointe que vers le dernier thread (après ils ont une vie qui leur est propre), je ne les stocke pas tous dans une collection...  
 
Et j'ai rien de static ni de collections dans les threads... Et je ferme tous mes descripteurs avant la fin du run(), donc je vois pas ce qui pourrait etre encore alloué. Et puis tout de facon quand le thread termine, toutes les références qui sont dedans sont "garbagecollectables" nan?

Reply

Marsh Posté le 20-11-2006 à 18:04:46    

J'ai réussi à résoudre mon problème, en fait, j'affichais dans une JFrame le contenu de mes requetes et des réponses...
 
Du coup l'attribut String text de la Textarea pesait super lourd et c'est ca qui saturait la mémoire...
 
En tous cas merci pour votre aide
 
PS. Taz, tu peux aller RTFM car il n'y a aucune obligation de faire join pour que le thread puisse se terminer...

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed