IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Java Discussion :

Impossible de créer de nouveaux threads


Sujet :

Java

  1. #1
    Modérateur
    Avatar de ToTo13
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Janvier 2006
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 793
    Points : 9 860
    Points
    9 860
    Par défaut Impossible de créer de nouveaux threads
    Bonjour,

    j'ai une classe dans laquelle je créé des threads que je stocke dans un tableau :
    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
     
    if ( threads == null || threads.length != nbCPU )
    		{
    		nbFreeThreads = 0 ; // Aucun thread n'est pour l'instant utilisable.
    		StopThreads() ; // On tue éventuellement ce qu'il doit l'être.
     
    		threads = new FuzzyGLRthread[nbCPU] ; // Création du nouveau tableau
     
    		for (i=0 ; i < nbCPU ; i++)
    			{
    			threads[i] = new FuzzyGLRthread() ;
    			threads[i].start() ;
    			}
     
    		synchronized (this) // Je vérifie / attends que les threads démarrent.
    			{
    			while ( nbFreeThreads != nbCPU ) // On attends la fin de la creation de chaque thread.
    				try	{
    					wait() ;
    					}
    				catch ( InterruptedException e )
    					{
    					e.printStackTrace() ;
    					}
    			}
    		}

    Afin de m'assurer que mes threads soient correctement tués, j'utilise cette méthode :
    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    private void StopThreads()
    	{
    	if ( threads == null ) return ;
    	for (int i=0 ; i < threads.length ; i++)
    		try {
    			threads[i].interrupt() ; // Wait its death.
    			threads[i].join() ; // Wait its death.
    			threads[i] = null ;
    			}
    		catch ( InterruptedException ex )
    			{
    			System.err.println("Souci") ;
    			}
    	threads = null ;
    	System.gc() ;
    	}
    Je fais cela, parce que la classe utilisant cette méthode est appelée un TRES grands nombre de fois, donc je souhaite être certains que je n'ai pas de threads encore actifs.

    Mais voilà, durant l'exécution, j'ai cette exception :
    java.lang.OutOfMemoryError: unable to create new native thread
    at java.lang.Thread.start0(Native Method)
    at java.lang.Thread.start(Thread.java:658)
    at imageTiTi.reducer.FuzzyGLR.Reduce(FuzzyGLR.java:147)
    at characterization.textures.thibaultmatrices.fuzzy.szm.MultiFuzzySZM.Compute(MultiFuzzySZM.java:173)
    at softwares.challenges.icip2013.CharacterizeCells.Process(CharacterizeCells.java:120)
    at prototyper.Prototyper.main(Prototyper.java:295)
    java.lang.OutOfMemoryError: unable to create new native thread
    at java.lang.Thread.start0(Native Method)
    at java.lang.Thread.start(Thread.java:658)
    at imageTiTi.reducer.FuzzyGLR.Reduce(FuzzyGLR.java:147)
    at characterization.textures.thibaultmatrices.fuzzy.szm.MultiFuzzySZM.Compute(MultiFuzzySZM.java:173)
    at softwares.challenges.icip2013.CharacterizeCells.Process(CharacterizeCells.java:120)
    at prototyper.Prototyper.main(Prototyper.java:295)
    Exception in thread "main" java.lang.NullPointerException
    at utils.LogFile.addNewError(LogFile.java:80)
    at softwares.challenges.icip2013.CharacterizeCells.Process(CharacterizeCells.java:140)
    at prototyper.Prototyper.main(Prototyper.java:295)
    Et là attention, je dois tuer le processus via mon système car NetBeans n'arrive même pas à le faire.

    Est ce que quelqu'un saurait d'où vient le problème ?
    Consignes aux jeunes padawans : une image vaut 1000 mots !
    - Dans ton message respecter tu dois : les règles de rédaction et du forum, prévisualiser, relire et corriger TOUTES les FAUTES (frappes, sms, d'aurteaugrafe, mettre les ACCENTS et les BALISES) => ECRIRE clairement et en Français tu DOIS.
    - Le côté obscur je sens dans le MP => Tous tes MPs je détruirai et la réponse tu n'auras si en privé tu veux que je t'enseigne.(Lis donc ceci)
    - ton poste tu dois marquer quand la bonne réponse tu as obtenu.

  2. #2
    Membre actif
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    117
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 117
    Points : 219
    Points
    219
    Par défaut
    Salut,
    D'après la stackTrace, tu n'as plus de mémoire. Lance tu ton appli avec des arguments spécifique pour la JVM? (notamment -Xmx).
    Tes threads sont t'il consommateur en mémoire? Brancher une Jconsole sur ton appli te permettrais peut être de voir l'état de la mémoire de la JVM ainsi que ce que tu consomme et surtout qu'est-ce qui te prend ta mémoire.

    PS : A priori tu as une NPE dans ta gestion des logs, peut-être que à cause de cette NPE tu ne voie pas toutes les erreurs.

    Mon petit blog sans prétention : http://blog.octera.info/

  3. #3
    Modérateur
    Avatar de ToTo13
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Janvier 2006
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 793
    Points : 9 860
    Points
    9 860
    Par défaut
    Merci pour la réponse.

    Citation Envoyé par OcterA Voir le message
    D'après la stackTrace, tu n'as plus de mémoire. Lance tu ton appli avec des arguments spécifique pour la JVM? (notamment -Xmx).
    Tes threads sont t'il consommateur en mémoire? Brancher une Jconsole sur ton appli te permettrais peut être de voir l'état de la mémoire de la JVM ainsi que ce que tu consomme et surtout qu'est-ce qui te prend ta mémoire.
    La classe qui utilise ce morceau de code ne gère au maximum que 4 threads.
    Avant de tuer la classe (la mettre à nulle), j'appelle la méthode pour tuer les threads qu'elle gère.
    Et comme les threads ne gèrent normalement pas ou peu de mémoire, je n'ai aucune raison de déborder.



    Citation Envoyé par OcterA Voir le message
    PS : A priori tu as une NPE dans ta gestion des logs, peut-être que à cause de cette NPE tu ne voie pas toutes les erreurs.
    C'est quoi ?
    Consignes aux jeunes padawans : une image vaut 1000 mots !
    - Dans ton message respecter tu dois : les règles de rédaction et du forum, prévisualiser, relire et corriger TOUTES les FAUTES (frappes, sms, d'aurteaugrafe, mettre les ACCENTS et les BALISES) => ECRIRE clairement et en Français tu DOIS.
    - Le côté obscur je sens dans le MP => Tous tes MPs je détruirai et la réponse tu n'auras si en privé tu veux que je t'enseigne.(Lis donc ceci)
    - ton poste tu dois marquer quand la bonne réponse tu as obtenu.

  4. #4
    Modérateur
    Avatar de ToTo13
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Janvier 2006
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 793
    Points : 9 860
    Points
    9 860
    Par défaut Je comprends encore moins
    J'ai modifié ma méthode StopThreads afin qu'elle dise au thread de se suicider : il appelle lui même la méthode "interrupt", puis un break pour sortir de la méthode run().

    Cela me permet d'aller quatre fois plus loin dans le traitement de mes données, mais la même erreur survient :
    java.lang.OutOfMemoryError: unable to create new native thread
    at java.lang.Thread.start0(Native Method)
    at java.lang.Thread.start(Thread.java:658)
    at imageTiTi.reducer.FuzzyGLR.Reduce(FuzzyGLR.java:149)
    at characterization.textures.thibaultmatrices.fuzzy.szm.MultiFuzzySZM.Compute(MultiFuzzySZM.java:173)
    at softwares.challenges.icip2013.CharacterizeCells.Process(CharacterizeCells.java:120)
    at prototyper.Prototyper.main(Prototyper.java:295)
    Qu'est ce que je ne comprends pas ?
    Consignes aux jeunes padawans : une image vaut 1000 mots !
    - Dans ton message respecter tu dois : les règles de rédaction et du forum, prévisualiser, relire et corriger TOUTES les FAUTES (frappes, sms, d'aurteaugrafe, mettre les ACCENTS et les BALISES) => ECRIRE clairement et en Français tu DOIS.
    - Le côté obscur je sens dans le MP => Tous tes MPs je détruirai et la réponse tu n'auras si en privé tu veux que je t'enseigne.(Lis donc ceci)
    - ton poste tu dois marquer quand la bonne réponse tu as obtenu.

  5. #5
    Modérateur
    Avatar de ToTo13
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Janvier 2006
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 793
    Points : 9 860
    Points
    9 860
    Par défaut Réponse
    En fait mon bricolage fonctionne correctement (bien ???). J'avais oublié un cas qui faisait qu'une fois sur trois je ne tuais pas les threads avant la classe, du coup cela me permettait de faire plus de calcul avant explosion.

    Information : j'ai vérifié la mémoire utilisée pendant l'exécution (en utilisant MemoryMXBean) et la JVM gère correctement via le ramasse miettes, car je ne dépasse jamais 30%.
    C'est le nombre de thread (libérant pourtant la mémoire qu'ils utilisent) qui fait en fait tout exploser.

    Même si cela fonctionne désormais, est ce la bonne façon de faire ?
    Consignes aux jeunes padawans : une image vaut 1000 mots !
    - Dans ton message respecter tu dois : les règles de rédaction et du forum, prévisualiser, relire et corriger TOUTES les FAUTES (frappes, sms, d'aurteaugrafe, mettre les ACCENTS et les BALISES) => ECRIRE clairement et en Français tu DOIS.
    - Le côté obscur je sens dans le MP => Tous tes MPs je détruirai et la réponse tu n'auras si en privé tu veux que je t'enseigne.(Lis donc ceci)
    - ton poste tu dois marquer quand la bonne réponse tu as obtenu.

  6. #6
    Membre actif
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    117
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 117
    Points : 219
    Points
    219
    Par défaut
    Salut,
    Le NPE est un NullPointerException : les trois dernières lignes de ton log.
    Concernant la mémoire tu as regarder que la mémoire principale de la JVM ou aussi les autres? (PermGenSpace,...)

    Mon petit blog sans prétention : http://blog.octera.info/

  7. #7
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    De manière générale il est bien vu de ne pas passer son temps à détruire/créer des threads, mais plutôt de se créer un seul pool de threads qu'on utilisera pendant toute la durée de vie de l'application, et de leur confier des tâches à exécuter en parallèle.

    Cette approche est déjà implémentée par ThreadPoolExecutor qui s'occupe de gérer les threads. Il suffit de le créer en disant combien de threads, puis de lui confier les tâches à accomplir, à chaque fois qu'on en a.

    Mais ça ne m'explique pas vraiment ce qui t'arrive. Ce n'est pas très bon de détruire/créer des threads sans arrêt, mais ça devrait marcher quand même, juste pas être très efficace.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  8. #8
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,

    Citation Envoyé par thelvin Voir le message
    Mais ça ne m'explique pas vraiment ce qui t'arrive. Ce n'est pas très bon de détruire/créer des threads sans arrêt, mais ça devrait marcher quand même, juste pas être très efficace.
    C'est juste que l'exception est un peu trompeuse : ce n'est pas réellement un OutOfMemory dans le sens où la mémoire n'est pas saturé.

    C'est juste que la limite de thread de l'OS a été atteinte, et qu'il refuse donc d'en créer de nouveaux.

    Si la méthode est appelée un grand nombre de fois et que certains threads ne sont pas arrêté proprement cela peut arriver très vite...



    Lorsqu'on manipule des ressources (threads, fichiers, sockets...) la moindre erreur de ce coté là peut être catastrophique si on multiplie les appels...


    a++

  9. #9
    Modérateur
    Avatar de ToTo13
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Janvier 2006
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 793
    Points : 9 860
    Points
    9 860
    Par défaut
    Bonjour,

    merci pour les exécution.
    Concernant vos questions :
    - oui, j'avais regardé les différentes mémoires.
    - ce que je faisais était en fait comparable à un ThreadPoolExecutor.
    - je crée normalement le minimum de thread, que je réutilise. J'ai d'ailleurs refait une version en ce sens où je ne crée que le minimum de classe nécessaire, donc aussi de threads.
    Ce qui m'a trompé, c'est que lorsque je mettais à null la classe qui contenait les threads, je pensais que ces derniers étaient tués.

    Merci à tous.
    Consignes aux jeunes padawans : une image vaut 1000 mots !
    - Dans ton message respecter tu dois : les règles de rédaction et du forum, prévisualiser, relire et corriger TOUTES les FAUTES (frappes, sms, d'aurteaugrafe, mettre les ACCENTS et les BALISES) => ECRIRE clairement et en Français tu DOIS.
    - Le côté obscur je sens dans le MP => Tous tes MPs je détruirai et la réponse tu n'auras si en privé tu veux que je t'enseigne.(Lis donc ceci)
    - ton poste tu dois marquer quand la bonne réponse tu as obtenu.

  10. #10
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Je ne comprends pas comment tu peux,
    - d'une part, réutiliser des threads
    - d'autre part, chercher à en tuer.
    C'est contradictoire. Si tu les tues ils ne sont pas réutilisables.

    Par ailleurs, les threads n'ont rien à voir avec des classes, ce sont des instances.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  11. #11
    Modérateur
    Avatar de ToTo13
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Janvier 2006
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 793
    Points : 9 860
    Points
    9 860
    Par défaut
    Citation Envoyé par thelvin Voir le message
    Je ne comprends pas comment tu peux,
    - d'une part, réutiliser des threads
    - d'autre part, chercher à en tuer.
    C'est contradictoire. Si tu les tues ils ne sont pas réutilisables.

    Par ailleurs, les threads n'ont rien à voir avec des classes, ce sont des instances.
    Mes threads sont intanciés depuis une classe qui en a besoin.
    Sauf que cette classe est appelée de très nombreuses fois avec à chaque fois des configurations totalement différentes.
    La plupart du temps j'arrive à réutiliser la même classe en modifiant la configuration, mais pas là, c'est pour cela que je devais instancier un grand nombre de fois la classe et donc les threads. Du coup, je voulais tuer les threads qui n'étaient plus utiles.
    Consignes aux jeunes padawans : une image vaut 1000 mots !
    - Dans ton message respecter tu dois : les règles de rédaction et du forum, prévisualiser, relire et corriger TOUTES les FAUTES (frappes, sms, d'aurteaugrafe, mettre les ACCENTS et les BALISES) => ECRIRE clairement et en Français tu DOIS.
    - Le côté obscur je sens dans le MP => Tous tes MPs je détruirai et la réponse tu n'auras si en privé tu veux que je t'enseigne.(Lis donc ceci)
    - ton poste tu dois marquer quand la bonne réponse tu as obtenu.

  12. #12
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    D'accord, donc ça n'a rien à voir avec ce que fait ThreadPoolExecutor. Je suggère d'utiliser ThreadPoolExecutor.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  13. #13
    Modérateur
    Avatar de ToTo13
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Janvier 2006
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 793
    Points : 9 860
    Points
    9 860
    Par défaut
    Sur d'autres classes manipulant des threads, j'ai testé ThreadPoolExecutor. Le travail est le même et je n'ai pas de gain de performances.
    J'avais fait cela avant de connaître TPE. Cela m'a permis de comprendre ce qui se passait.
    Consignes aux jeunes padawans : une image vaut 1000 mots !
    - Dans ton message respecter tu dois : les règles de rédaction et du forum, prévisualiser, relire et corriger TOUTES les FAUTES (frappes, sms, d'aurteaugrafe, mettre les ACCENTS et les BALISES) => ECRIRE clairement et en Français tu DOIS.
    - Le côté obscur je sens dans le MP => Tous tes MPs je détruirai et la réponse tu n'auras si en privé tu veux que je t'enseigne.(Lis donc ceci)
    - ton poste tu dois marquer quand la bonne réponse tu as obtenu.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Spip] [Spip 1.9.2a] Impossible de créer de nouveaux articles
    Par Pomme88 dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 0
    Dernier message: 23/12/2011, 11h14
  2. Réponses: 17
    Dernier message: 03/12/2004, 14h33
  3. Impossible de créer un MDE
    Par Gourouni dans le forum Access
    Réponses: 5
    Dernier message: 18/11/2004, 15h02
  4. [ADO] [DLL] Impossible de créer la connexion...
    Par Le Lézard dans le forum Bases de données
    Réponses: 7
    Dernier message: 13/09/2004, 14h16

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo