CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

Java : Tous mes threads bloqués !

pseuuuuuuuuuudo
pseuuuuuuuuuudo
Niveau 10
14 août 2013 à 13:36:48

Salut,
J'ai une appli qui crashait aléatoirement de temps en temps et je suis tombé sur l'appli jconsole qui permet de monitorer la conso mémoire, le nombre de threads, etc. au cours de l'exécution d'un programme. Je l'ai donc connecté à mon programme afin de voir ce qui se passe au cours de l'exécution.
Au bout d'un certain temps, j'ai vu que le nombre de threads croissait de façon très importante, et pour cause ils restent tous dans l'état BLOCKED. Je me suis dit qu'il s'agissait d'un full GC et je n'y ai donc pas prêté une grande attention. Quelques minutes plus tard je suis retourné voir et... le nombre de threads a encore vachement augmenté ! De 13h15 à maintenant, leur nombre ne fait qu'augmenter, je suis passé d'une quinzaine de threads actifs (dont 2-3 seulement appartenant à mon appli, les autres faisant partie de la JVM) à près de 150. C'est possible qu'un full GC dure aussi longtemps ? Qu'est-ce que je peux faire pour éviter que ça dure aussi longtemps ?

Aussi un petit point qui m'étonne, en fait mon programme est un programme console, donc il affiche sa sortie dans celle-ci. Quand ce que je crois être un full GC se produit, l'affichage dans ma console se bloque (a priori c'est normal de par la nature même du full GC), mais quand j'appuie sur entrée dans la console, le full GC se termine, mes threads en état bloqué repartent et se terminent normalement et l'affichage dans ma console reprend normalement, pourquoi ? :doute:

:merci:

pseuuuuuuuuuudo
pseuuuuuuuuuudo
Niveau 10
14 août 2013 à 13:40:45

https://image.noelshack.com/fichiers/2013/33/1376480415-jconsole.png

Petite illustration de ma jconsole au moment où je vous parle si ça peut aider.

Bunyan
Bunyan
Niveau 17
14 août 2013 à 13:50:59

Ta pression sur "entrée" doit débloquer les threads. Je ne pense pas que tu sois en "full GC", mais tu as plutôt une création de thread folle qui part en vrille et qui se débloque à ton événement sur "entrée".

Sans savoir ce que tu fais, ni comment tu fais, je ne peux pas en dire plus.

pseuuuuuuuuuudo
pseuuuuuuuuuudo
Niveau 10
14 août 2013 à 14:10:29

| Bunyan  -  aujourd’hui à 13:50
| https://www.jeuxvideo.com/forums/1-47-85601-1-0-1-0-java-tous-mes-threads-bloques.htm#message_85603
| Ta pression sur "entrée" doit débloquer les threads. Je ne pense pas que tu sois en "full GC", mais tu as plutôt une création de thread folle qui part en vrille et qui se débloque à ton événement sur "entrée".

Hm.. Et comment c'est possible que ma pression sur Entrée débloque les Threads (j'ai oublié de préciser mais c'est important, mes Threads SEMBLENT bloquer sur un PrintStream, un System.out.println() donc dans mon cas) ? :doute:

| Sans savoir ce que tu fais, ni comment tu fais, je ne peux pas en dire plus.

Alors, je vais essayer d'expliquer. Il s'agit d'un bot pour un jeu en ligne pour le contexte (un bot de modération, rien de relou ou d'illégal). Au niveau du fonctionnement ça se passe comme ça :

- Création d'un Thread d'écoute du serveur principal
- Réception d'un paquet contenant l'ip d'un serveur secondaire
- Création d'un Thread d'écoute du serveur secondaire
- - Ici j'ai donc deux threads en boucle "infinie" qui écoutent les deux serveurs (snippet : http://pastebin.com/yuSZrkzF )
- A chaque fois qu'un message est reçu, je le parse. Mon parsing est constitué de :
- - Parsing tel quel du paquet reçu, je sépare donc les diverses informations qu'il contient. Au final je récupère un objet de type DataPacket (spécif de DataPacket : http://pastebin.com/fy3Qj2Qu )
- - On récupère le processeur de ce paquet et on l'exécute (l'action à effectuer lorsqu'on reçoit tel paquet, par exemple je reçoid un DataPacket de type ChatMessage, je récupère son processeur, je l'exécute et le contenu du paquet s'affiche dans ma console)
- - C'est peut-être là que ça coince, mes Processors sont des Threads, qui pour la plupart comportent juste un System.out.println() m'affichant les données du paquet de façon propre
- - Si ces trois derniers points ne sont pas assez clairs, voilà ma méthode parse simplifiée : http://pastebin.com/bjpyG0W8

C'est possible que le blocage survienne à cause d'une trop forte création de threads à cause de mes processeurs qui sont tous des threads ?

S'il y a besoin de plus d'infos je peux les fournir, mais là c'est mon fonctionnement général, je pense que tout y est.

Bunyan
Bunyan
Niveau 17
14 août 2013 à 15:05:42

Je n'ai jamais fait d'opé plus complexes que "faire attention au main thread" en Java, donc je ne vais pas pouvoir énormément aider.

De ce que tu décris, j'ai l'impression que tes threads restent actifs dû à un flux non fermé (je pense : celui permettant d'écrire vers stdin) et celui-ci se ferme avec la consommation de l'événement que tu lui envois (ici, la touche entrée).

Mais bon, c'est un très gros "wild guess", et je ne serai pas surpris de me planter intégralement :D

pseuuuuuuuuuudo
pseuuuuuuuuuudo
Niveau 10
14 août 2013 à 15:14:34

| Bunyan - aujourd’hui à 15:05
| https://www.jeuxvideo.com/forums/1-47-85601-1-0-1-0-java-tous-mes-threads-bloques.htm#message_85612
| De ce que tu décris, j'ai l'impression que tes threads restent actifs dû à un flux non fermé (je pense : celui permettant d'écrire vers stdin) et celui-ci se ferme avec la consommation de l'événement que tu lui envois (ici, la touche entrée).

Ca parait pas idiot mais ça n'explique pas que ça survienne aussi aléatoirement ^^ Là depuis 13h30 mon bot tourne et ça n'a pas recommencé, j'ai toujours ma quinzaine de threads et tout est très stable... Je tenterais un test en virant tous mes println, qui sait...

| Mais bon, c'est un très gros "wild guess", et je ne serai pas surpris de me planter intégralement :D

Pas grave, mieux vaut ça que rien, ça suffit parfois à se diriger dans la bonne direction ! Déjà ça m'a permis de savoir que c'était pas dû à un full GC comme je le pensais, c'est rassurant x)

Bref, je reste bien sûr ouvert à toute solution ou début de solution.

godrik
godrik
Niveau 30
14 août 2013 à 15:22:30

Ca ressemble a un dead lock ton probleme. Il est possible que l'appuie sur entree enclenche une exception qui debloque tous les thread.

pseuuuuuuuuuudo
pseuuuuuuuuuudo
Niveau 10
14 août 2013 à 15:53:51

| godrik  -  aujourd’hui à 15:22
| Ca ressemble a un dead lock ton probleme. Il est possible que l'appuie sur entree enclenche une exception qui debloque tous les thread.

J'y ai d'abord pensé mais je pense pas que ce soit le cas :

- En appuyant sur le bouton "Detect Deadlock" en bas de la jconsole / onglet Threads, j'obtiens un "No deadlock detected"
- Je n'ai aucun morceau de code synchronisé dans l'ensemble de mon appli, donc a priori pas de deadlock possible à mon échelle (si ?)
Le seul cas où ça puisse arriver A MON AVIS, c'est si deux de mes threads tentent d'écrire sur la sortie standard, mais j'ai du mal à capter comment en fait, j'ai du mal à voir comment un deadlock pourrait arriver à ce niveau...

Quant à la théorie de l'exception qui débloque tous les threads je sais pas comment vérifier ça, tu as une idée de quel type d'exception ça pourrait être histoire que je puisse la logger ?

Aussi quand je presse Entrée, tous les messages qui étaient bloqués s'affichent d'un coup dans la console (et dans le bon ordre), j'avais oublié de le préciser aussi ><

pseuuuuuuuuuudo
pseuuuuuuuuuudo
Niveau 10
14 août 2013 à 18:17:22

Je viens de tomber sur un problème assez similaire (en recherchant pour "State: BLOCKED on java.io.PrintStream") : http://www.coderanch.com/t/563373/java/java/Threads-Blocked

Donc je vais essayer deux choses au cas où :
- synchroniser le run() de certains de mes Processors qui sont utilisés le plus souvent (ça tient du bricolage par contre donc je dis que je vais le faire mais peut-être pas)
- utiliser log4j ou autre solution de logging thread-safe, j'y pensais depuis un moment (parce que le logging full println voilà quoi) donc je vais peut-être y passer pour cette raison.

pseuuuuuuuuuudo
pseuuuuuuuuuudo
Niveau 10
14 août 2013 à 19:12:28

Ok, j'ai trouvé et je me sens con. Très con même.

Je vous laisse apprécier : http://stackoverflow.com/a/11120555/1544176 (trouvé en recherchant les mots-clés "java printstream deadlock", merci pour ça godrik).

Sujet résolu donc, merci à vous !

Sous forums
  • Aide à l'achat Mac
  • Création de sites web
  • Création de Jeux
  • Linux
  • Programmation
  • Internet
  • Steam Deck
  • Macintosh
  • Hardware
La vidéo du moment