Acabei de usar o Jstack para resolver o problema de um impasse de processo - na verdade, resolvi há muito tempo e sei o motivo, mas não encontrei a localização do impasse, então não estou muito disposto a fazê -lo.
O processo é aproximadamente o seguinte:
(0) Requisitos ambientais, JDK 1.6 e acima
(1) Primeiro encontre o PID do processo. No Windows, abra o gerenciador de processos e classifique -o pelo nome. Você pode encontrar um processo chamado javaw.exe (os processos da máquina virtual Java são todos chamados javaw.exe). Você precisa encontrar qual processo é o seu processo, lembre -se da lista atual de processos e reinicie seu processo. O que foi atualizado pelo PID é o seu processo.
(2) Execute -se sob CMD: JStack Pid, JStack digitará uma série de informações sobre o console
(3) Analisar as informações acima
Exemplo:
As informações do jstack para minha pergunta são as seguintes:
C:/Documents and Settings/user>jstack 66522012-06-07 21:32:02Full thread dump Java HotSpot(TM) Client VM (16.3-b01 mixed mode, sharing):"Thread-1" daemon prio=6 tid=0x03010c00 nid=0xcdc waiting for monitor entry [0x0339f000] java.lang.Thread.State: BLOCKED (on object monitor) at org.apache.commons.net.telnet.TelnetInputStream.__read(TelnetInputStream.java:122) - waiting to lock <0x22942280> (a org.apache.commons.net.ftp.FTPClient) at org.apache.commons.net.telnet.telnetinputStream.run (telnetinputStream.java:535) em java.lang.thread.run (thread.java:619) "Dispatcher de eventos da estrutura" DAEMON99 (0819). [0x0334f000] java.lang.thread.State: Waiting (no monitor de objeto) em java.lang.object.wait (método nativo) - aguardando <0x228fa800> (a org.eclipse.osgi.frame.eventmgr.eventmanager $ eventThreads) em JAVSE.osgi.framework.eventmil. org.eclipse.osgi.framework.eventmgr.eventManager $ eventThread.getNextevent (EventManager.java:400) - bloqueado <0x228fa800> (a org.eclipse.osgi.framework.eventmgr.eventmanager $ eventThreads) org.eclipse.osgi.framework.eventmgr.eventManager $ eventThread.run (eventManager.java:336) "Iniciar o despachante de eventos" daemon prio = 6 tid = 0x02fcf400 nid = 0x2638 no objeto.Wait () [0x02De java.lang.Object.wait (método nativo) - Esperando <0x2295db48> (a [i) em java.lang.object.wait (object.java:485) em org.apache.commons.net.telnet.telnets.TeRread (telnNetinMons.net.telnet.telnets. <0x2295db48> (a [i) em org.apache.commons.net.telnet.telnetinputstream.read (telnetinputstream.java:466) em java.io.bufferinnutream.read1 (bufferinputream.java:266) java.io.BufferInputStream.read (bufferInputStream.java:317) - bloqueado <0x2295fe18> (a java.io.bufferinputStream) em sun.nio.cs.streamdecoder.readbytes (streamdecoder.java:24) sun.nio.cs.streamdecoder.implread (streamdecoder.java:306) em sun.nio.cs.streamdecoder.read (streamdecoder.java:158) - bloqueado <0x22961f88> (a java.io.iniatreamreamer) 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 <0x22961f88> (a java.io.InputStreamReader) em java.io.bufferedreader.readline (bufferreader.java:362) em org.apache.commons.net.ftp.ftp .__ getReply (ftp.java:264) em org.apache.commons.ftp.ftp._connectactactactactactactactactactactactactactache.commons.ta.ftp.ftp._connectactactactactaction_ ( org.apache.commons.net.ftp.ftpclient._connectaction_ (ftpclient.java:550) em org.apache.commons.net.socketclient.connect (SocketClient.java:163) em com.mycompany.dc.ftp.client.ftpclientImpl.connect (ftpclientImpl.java:75) - bloqueado com.mycompany.dc.ftp.client.ftpclientFactoryImpl.getClient (ftpClientFactoryImpl.java:35) - bloqueado <0x228f9310> (a java.lang.object) no ftpclienttest.activator.start (ativador.java.java) at ftpclienttest.activator.start (ativator.java org.eclipse.osgi.framework.internal.core.bundlecontextImpl $ 1.run (bundlecontextimpl.java:711) em java.security.accessController.Doprivileged (método nativo) em org.eclipse.osgi.framework.internal.core.bundleContextImpl.StartActivator (BundleContextImpl.java:702) em org.eclipse.osgi.framework.intern.core.bundleconTexTart.osTart.Framework.InternEteteterestiml) org.eclipse.osgi.framework.internal.core.bundlehost.startworker (bundlehost.java:381) em org.eclipse.osgi.framework.internal.core.abstractbunle.resume (abstrationbunding.java:38) org.eclipse.osgi.framework.internal.core.framework.resumebundle (estrutura.java:1131) em org.eclipse.osgi.framework.internal.core.startlevelmanager.resumebundles (sirdlevelmanager.java:55) org.eclipse.osgi.framework.internal.core.startLevelManager.resumebundles (StartlevelManager.java:544) em org.eclipse.osgi.framework.internal.core.startlevelmanager.incfls (assolador org.eclipse.osgi.framework.internal.core.startlevelmanager.dosetstartlevel (StartlevelManager.java:243) - bloqueado <0x27e68d70> (a java.lang.object) em org.eclipse.osgi.framework.internal.core.StartLevelManager.dispatchEvent(StartLevelManager.java:438) at org.eclipse.osgi.framework.internal.core.StartLevelManager.dispatchEvent(StartLevelManager.java:1) at org.eclipse.osgi.framework.eventmgr.eventManager.dispatchEvent (EventManager.java:230) em org.eclipse.osgi.framework.eventmgr.eventManager $ PRIRATHREAD.RUN (EVENTMANAGER.JAVA:340) " nid = 0x1fbc em object.wait () [0x0328f000] java.lang.thread.state: timed_waiting (no monitor de objeto) em java.lang.object.wait (método nativo) - aguardando <0x27e65770> (a org.eclipse.osg. org.eclipse.osgi.framework.internal.core.framework.run (estrutura.java:1817) - bloqueado <0x27e65770> (a org.eclipse.osgi.framework.internal.core.framework) em java.lang.hanng.thread.hringwork.iNCORE.CORE.FROWN) em prio = 6 tid = 0x03005400 nid = 0x225c aguardando na condição [0x0323f000] java.lang.thread.state: timed_waiting (dormindo) em java.lang.thread.sleep (método nativo) em org.eclipse.osgi.framework.internal.core.frameworkconsole.ruconsole (estrutura java.lang.thread.run (thread.java:619) "Detector de memória baixa" daemon prio = 6 tid = 0x02c09800 nid = 0x1d68 runnable [0x000000000] java.lang.thread.state: runnable "comp completReaded0" na condição [0x000000000] java.lang.thread.State: runnable "Anexe o ouvinte" daemon prio = 10 Tid = 0x02c01800 nid = 0x1138 aguardando na condição [0x000000000] java.lang.thread.state: runnable "despactor de despachante" [0x000000000] java.lang.thread.state: runnable "Finalmente" daemon prio = 8 tid = 0x02bc0400 nid = 0x11ac no object.wait () [0x02d8f000] java.lang.thread.state: (no objeto) em java.la.lan.lann] <0x27d5e5c8> (a java.lang.ref.referencequeue $ bloqueou) em java.lang.ref.referencequeue.remove (referencequeue.java:118) - bloqueado <0x27d5e5c8> (a java.lang.ref.referenceeue $ lock) java.lang.ref.referencequeue.remove (referencequeue.java:134) em java.lang.ref.finalizer $ finalizerthread.run (finalizer.java:159) "manipulador de referência" daemon prio = 10 tid = 0x02bb800 nid = 0x9C " java.lang.thread.state: waiting (no monitor de objeto) em java.lang.object.wait (método nativo) - aguardando <0x27d5e650> (a java.lang.ref.reference $ bock) em java.lang.object.wait (object.java:485) java.lang.ref.Reference $ ReferenceHandler.run (reference.java:116) - bloqueado <0x27d5e650> (a java.lang.ref.reference $ bloqueio) "main" prio = 6 tid = 0x008a6c00 nid = 0x22ec no object.wait () Timed_waiting (no monitor de objeto) em java.lang.object.wait (método nativo) - aguardando <0x22c303c8> (a org.eclipse.core.runtime.internal.adaptor.Semaptor) em org.eclipse.core.Runtime.inTal.adaptor.Semaptor) em org.eclipse.core.Runtime.inTal.adaptor.Semaptor) em org.eclipse.core.runtime.innalTer.AmAptor. bloqueado <0x22c303c8> (a org.eclipse.core.runtime.internal.adaptor.semaphore) em org.eclipse.core.runtime.adaptor.eclipsestarter.updatesplash (eclipStestarter.java:1251) org.eclipse.core.runtime.adaptor.EclipseStarter.setStartLevel(EclipseStarter.java:1213) at org.eclipse.core.runtime.adaptor.EclipseStarter.startup(EclipseStarter.java:288) at org.eclipse.core.runtime.adaptor.eclipsestarter.run (eclipsestarter.java:175) em sun.reflelect.nativemethodaccessoriMpl.invoke0 (método nativo) em sun.reflect.nativemethodaccaccacractompl.invoke (native) at sun.reflect.nativeModaccAccAncessorImpl.Invoke (nativen) at Sun.reflect.nativeModaccAccAncessorImpl.invoke sun.reflelect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorimpl.java:25) em java.lang.reflect.method.invoke (method.java:597) at org.eclipse.equinox.ancher.main.main.invAfreking) org.eclipse.equinox.launcher.main.basicrun (main.java:577) em org.eclipse.equinox.launcher.main.run (main.java:1410) em org.eclipse.equinox.auncher.main.main.main.main (mainj) (mAin1410) em org.eclipse.equinox. TID = 0x02bba000 nid = 0xdb4 runnable "VM Tarefa periódica Tópico" prio = 10 tid = 0x02c0e400 nid = 0x24ac aguardando nas referências globais da condiçãojni: 677
analisar:
De acordo com o prompt, ambos os threads usam o objeto FTPClient como bloqueado, e o anterior que recebe o bloqueio deve esperar o próximo precisar do resultado de retorno da fechadura, causando um impasse. Esses dois lugares são:
(1) em org.apache.commons.net.telnet.telnetinputStream .__ Read (telnetinputStr
eam.java:122)
(2) - bloqueado <0x22942280> (a org.apache.commons.net.ftp.ftpclient)
em com.sagemcom.dc.ftp.client.ftpClientFactoryImpl.getClient (ftpclientfa
ctoryimpl.java:35)
- bloqueado <0x228f9310> (um java.lang.object)
O primeiro é o bloqueio usado pelo próprio sistema, e o último é adicionado no meu código. Ele será resolvido alterando um objeto em seu próprio código para bloqueá -lo.
Resumir
O JSTack é bastante útil na solução de problemas. A informação é concisa e eficaz. De fato, existem muitas ferramentas de análise gráfica baseadas nele. No entanto, o JSTack precisa ser suportado pelo JDK1.6 ou acima.
O exposto acima é o conteúdo inteiro deste artigo sobre resolução de problemas de impasse por meio de análise por meio da análise do JSTack. Espero que seja útil para todos. Amigos interessados podem continuar se referindo a outros tópicos relacionados neste site. Se houver alguma falha, deixe uma mensagem para apontá -la. Obrigado amigos pelo seu apoio para este site!