J'essaie de mieux comprendre java, en particulier sur la gestion de la mémoire et les threads. Pour cette raison, je me suis récemment intéressé aux décharges de threads.
Voici quelques lignes tirées d'une application Web utilisant VisualVM, un outil intégré pour java:
"Finalizer" daemon prio=8 tid=0x02b3d000 nid=0x898 in Object.wait() [0x02d0f000]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <0x27ef0288> (a java.lang.ref.ReferenceQueue$Lock)
at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:118)
- locked <0x27ef0288> (a java.lang.ref.ReferenceQueue$Lock)
at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:134)
at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:159)
Locked ownable synchronizers:
- None
"Reference Handler" daemon prio=10 tid=0x02b3b800 nid=0x494 in Object.wait() [0x02cbf000]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <0x27ef0310> (a java.lang.ref.Reference$Lock)
at java.lang.Object.wait(Object.java:485)
at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:116)
- locked <0x27ef0310> (a java.lang.ref.Reference$Lock)
J'ai d'abord des questions sur certains noms de variables:
- que signifie tid et nid?
- Quelle est la figure entre parenthèses carrées après Object.wait?
Ensuite, pour la trace de pile elle-même:
- qu'est-ce que cela signifie attendre <.....> (un java.lang ....) et quel est le nombre dans <..>
- qu'est-ce que cela signifie verrouillé <.....> (un java.lang ....) même question, que contient <..>
Je pensais que le mot verrouillé était lié d'une manière ou d'une autre à une condition d'attente, mais j'avais tort. En fait, je me demande pourquoi verrouillé est répété trois fois, mais le thread est dans un état exécutable comme on le voit dans le même vidage:
"Thread-0" prio=6 tid=0x02ee3800 nid=0xc1c runnable [0x03eaf000]
java.lang.Thread.State: RUNNABLE
at java.io.FileInputStream.readBytes(Native Method)
at java.io.FileInputStream.read(FileInputStream.java:199)
at java.io.BufferedInputStream.read1(BufferedInputStream.java:256)
at java.io.BufferedInputStream.read(BufferedInputStream.java:317)
- locked <0x23963378> (a java.io.BufferedInputStream)
at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:264)
at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:306)
at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:158)
- locked <0x23968450> (a java.io.InputStreamReader)
at java.io.InputStreamReader.read(InputStreamReader.java:167)
at java.io.BufferedReader.fill(BufferedReader.java:136)
at java.io.BufferedReader.readLine(BufferedReader.java:299)
- locked <0x23968450> (a java.io.InputStreamReader)
at java.io.BufferedReader.readLine(BufferedReader.java:362)
at org.codehaus.plexus.util.cli.StreamPumper.run(StreamPumper.java:145)
Enfin, c'était le pire d'entre eux:
"CompilerThread0" daemon prio=10 tid=0x02b81000 nid=0x698 waiting on condition [0x00000000]
java.lang.Thread.State: RUNNABLE
Ce thread est à l'état exécutable, mais il attend sous condition. Quelle condition et qu'est-ce que 0x00000?
Pourquoi la trace de pile est-elle si courte sans aucune preuve de la classe de thread?
Si vous pouviez répondre à toutes mes questions, je vous serais très reconnaissant.
Merci