Я только что использовал JStack для решения проблемы тупика процесса - на самом деле, я решил это давно, и я знаю причину, но я не нашел местоположение тупика, поэтому я не очень хочу это делать.
Процесс примерно следующим образом:
(0) Экологические требования, JDK 1,6 и выше
(1) Сначала найдите пид процесса. В Windows откройте диспетчер процессов и сортируйте его по имени. Вы можете найти процесс под названием Javaw.exe (все процессы виртуальной машины Java называются javaw.exe). Вам нужно найти, какой процесс является ваш процесс, запомнить текущий список процессов, а затем перезапустить ваш процесс. Тот, который был обновлен PID, - это ваш процесс.
(2) Запустите под CMD: JStack PID, JSTACK будет ввести серию информации на консоли
(3) Проанализируйте вышеуказанную информацию
Пример:
Информация о JSTACK для моего вопроса заключается в следующем:
C:/Документы и настройки/пользователь> JStack 66522012-06-07 21: 32: 02full Dilm Dilm Dilm Java Hotspot (TM) VM (16,3-B01 Смешанный режим, обмен): "Thread-1" DAMOMON PRIO = 6 TID = 0x030C00C00 NID = 0xCDC В ожидании записи Monitor [0x03399F000]. java.lang.thread.state: заблокирован (на мониторе объекта) на org.apache.commons.net.telnet.telnetinputstream .__ Read (telnetinputstream.java:122) - ожидание блокировки <0x22942280> (a org.apache.commons.net.ftp org.apache.commons.net.telnet.telnetinputstream.run (telnetinputstream.java:535) на java.lang.thread.run (thread.java:619) "Распространенное диспетчер событий" Daemon Prio = 6 tid = 0x03010400 nid = 0x998 в объекте. java.lang.thread.state: ожидание (на мониторе объекта) по адресу java.lang.object.wait (нативный метод) - ожидание <0x228fa800> (org.eclipse.osgi.framework.eventmgr.eventmanager $ eventthread) на java.lang.object.wait (object.java: org.eclipse.osgi.framework.eventmgr.eventmanager $ eventthread.getNexTevent (EventManager.java:400) - Заблокировано <0x228fa800> (org.eclipse.osgi.framework.eventmgr.eventmanager $ eventthread) на org.eclipse.osgi.framework.eventmgr.eventmanager $ eventthread.run (eventmanager.java:336) "Диспетчер событий старта" Daemon Prio = 6 tid = 0x02fcf400 nid = 0x2638 в объекте. java.lang.object.wait (нативный метод) - ожидание <0x2295db48> (a [i) at java.lang.object.wait (object.java:485) на org.apache.commons.net.telnet.telnetinputstream.read.read (tellentinptream. [I) at org.apache.commons.net.telnet.telnetinputstream.read (telnetinputstream.java:466) на java.io.bufferedinputstream.read1 (BufferedInptr <0x2295fe18> (java.io.bufferedInputStream) по адресу sun.nio.cs.streamdecoder.readbytes (StreamDecoder.java:264) на sun.nio.cs.streamdecoder.implread (Streamdecoder.java:306) на sun.nio.cs.streamdecoder.read (streamdecoder.java:158) - заблокирован <0x22961f88> (java.io.inputstreamreader) на java.io.inputstreamread.read (inputstreamreader.java:167) в Java.io.bufferedReader.fill (BufferedReader.java:136) на Java.io.BufferedReader.Readline (BufferedReader.java:299) - Заблокировано <0x22961f88> (java.io.inputeReamerer) at java.buffered.reader.jreadrire. org.apache.commons.net.ftp.ftp .__ getReply (ftp.java:264) на org.apache.commons.net.ftp.ftp._connectaction_ (ftp.java:335) на org.apache.commons.ntp.ftpclient._connectaction_ (ftppc org.apache.commons.net.socketClient.connect (socketClient.java:163) на com.mycompany.dc.ftp.client.ftpclientimpl.connect (ftpclientimpl.java:75) - Заблокировано <0x2292280> (org.apache.commons.net.net.net.net.t.t.t.t.t.net.net.net. com.mycompany.dc.ftp.client.ftpclientFactoryImpl.getClient (ftpClientFactoryImpl.java:35) - заблокирован <0x228f9310> (java.lang.object) на ftpclienttest.activator.start (activator.java:43) по org.eclipse.osgi.framework.internal.core.bundlecontextimpl $ 1.run (bundlecontextimpl.java:711) на java.security.accesscontroller.doprivileged (нативный метод) в org.eclipse.osgi.framework.internal.core.bundlecontextimpl.startActivator (bundlecontextimpl.java:702) на org.eclipse.osgi.framework.core.core.bundlecontextimpl.start (bundlecontextiM org.eclipse.osgi.framework.internal.core.bundlehost.startworker (bundlehost.java:381) на org.eclipse.osgi.framework.internal.core.abstractbundle.resum org.eclipse.osgi.framework.internal.core.framework.resumebundle (Framework.java:1131) на org.eclipse.osgi.framework.internal.core.startlevelmanager.resumebundles (Startlevelmanager.java:559) at ater org.eclipse.osgi.framework.internal.core.startlevelmanager.resumebundles (startlevelmanager.java:544) на org.eclipse.osgi.framework.internal.core.startlevelmanager.incfwsl (startlevel.java:457) org.eclipse.osgi.framework.internal.core.startlevelmanager.dosetStartlevel (startlevelmanager.java:243) - заблокирован <0x27e68d70> (java.lang.object) org.eclipse.osgi.framework.internal.core.startlevelmanager.dispatchevent (startlevelmanager.java:438) на org.eclipse.osgi.framework.internal.core.startlevelmanager.dispatchevent (startlevelmanger.java:1) org.eclipse.osgi.framework.eventmgr.eventmanager.dispatchevent (eventmanager.java:230) at org.eclipse.osgi.framework.eventmgr.eventmanager $ eventthread.run (EventManager.java:340) "Active Thread" Prio = 6 TID = 0x02f1800). nid = 0x1fbc в object.wait () [0x0328f000] java.lang.thread.state: timed_waiting (на мониторе объекта) на java.lang.object.wait (нативный метод) - ожидание <0x27e65770> (a org.eclipse.osgi.framework. org.eclipse.osgi.framework.internal.core.framework.run (Framework.java:1817) - Заблокировано <0x27e65770> (a org.eclipse.osgi.framework.internal.core.framework) at java.lang.thread.run (rate. prio = 6 tid = 0x03005400 nid = 0x225c ожидающего условия [0x0323f000] java.lang.thread.state: timed_waiting (sleep) на java.lang.thread.sleep (родной метод) в org.eclipse.osgi.framework.internal.core.frameworkconsole.runconsole (FrameworkConsole.java:125) на org.eclipse.osgi.framework.internal.core.frameworkconsole.run (FrameworkConsole.java:104) at. java.lang.thread.run (Thread.java:619) «Детектор с низким содержанием памяти» DAEMON PRIO = 6 TID = 0x02C09800 NID = 0x1D68 Runnable [0x000000000] Java.lang.Thread.State: Runnable "CompilerThread0" Prio = 10 TID = 0x02C03000 = 0x03c03000 = 0x03c03000 = 0x02c03000 = 0x02c03000 = 0x02c03000 = 0x02c03000 = 0x02c03000 = 0x02c03c. В условиях [0x000000000] java.lang.thread.state: runnable "Прикрепите слушатель" daemon prio = 10 tid = 0x02c01800 nid = 0x1138 ожидание при условии [0x000000000] java.lang.thread.state: Runnable "Signal Dispatcher" PRIO = 10 TID = 0x02C20C20C2C2C2C18AB18AB18AC18AB18. [0x000000000] java.lang.thread.state: runnable "finalizer" daemon prio = 8 tid = 0x02bc0400 nid = 0x11ac in obj <0x27d5e5c8> (java.lang.ref.referencequeue $ lock) по адресу java.lang.ref.referenceaue.remove (referencequeue.java:118) - Заблокировано <0x27d5e5c8> (java.lang.ref.referen java.lang.ref.referencequeue.remove (referencequeue.java:134) на java.lang.ref.finalizer $ finalizerthread.run (finalizer.java:159) "Справочный обработчик" Daemon Prio = 10 tid = 0x02bb800 nid = 0x9cc в объекте. java.lang.thread.state: ожидание (на мониторе объекта) по адресу java.lang.object.wait (родной метод) - ожидание <0x27d5e650> (java.lang.ref.reference $ lock) на java.lang.object.wait (object.java:485) у java.lang.ref.reference $ referencehandler.run (rewert.java:116) - Заблокировано <0x27d5e650> (a java.lang.ref.reference $ lock) "Main" Prio = 6 tid = 0x008a6c00 nid = 0x22ec in object.wait () [0x0098f) javAng.late.strang. Timed_waiting (на мониторе объекта) на java.lang.object.wait (нативный метод) - ожидание на <0x22c303c8> (a org.eclipse.core.runtime.internal.adaptor.semaphore) на org.eclipse.core.runtime.Internal.Adaptor.semaphore.cquore.j.j.jafore.jafore.japore.j.j.japore.j.jafore.jafore.j.jafore.japore.japore.japore.japore.japore. заблокирован <0x22c303c8> (a org.eclipse.core.runtime.internal.adaptor.semaphore) на org.eclipse.core.runtime.adaptor.clipsestarter.updatesplash (eclipsestarter.java:1251) у org.eclipse.core.runtime.adaptor.eclipsestarter.setStartlevel (eclipseStarter.java:1213) на org.eclipse.core.runtime.adaptor.eclipsestarter.startup (eclipseStarter.java:288) на org.eclipse.core.runtime.adaptor.eclipsestarter.run (eclipsestarter.java:175) по адресу sun.reflect.nativemethodaccessormpl.invoke0 (Nativemethodaccessplec. sun.reflect.delegatingmethodaccessorimpl.invoke (делегирование methodaccessorimpl.java:25) на java.lang.reflect.method.invoke (method.java:597) на org.eclipse.equinox.launcher.main.invokeframe (main.javs org.eclipse.equinox.launcher.main.basicrun (main.java:577) на org.eclipse.equinox.launcher.main.run (main.java:1410) at org.eclipse.equinox.launcher.main.main.main.main.main.main.main.main.main.main.main.main.main.main.main.main.main.main.main.main.main.main.main.main.main. TID = 0x02BBA000 NID = 0xDB4 RUNNABLE "VM Периодическая поток задачи" PRIO = 10 TID = 0x02C0E400 NID = 0x24AC Ожидание на условиях Глобальные ссылки: 677
проанализировать:
Согласно подсказке, оба потока используют объект FTPClient в качестве блокировки, и предыдущий, который получает блокировку, должен ждать, пока следующий понадобится результат возврата блокировки, вызывая тупик. Эти два места:
(1) at org.apache.commons.net.telnet.telnetinputstream .__ Read (telnetinputstr
eam.java:122)
(2) - заблокирован <0x22942280> (a org.apache.commons.net.ftp.ftpclient)
в com.sagemcom.dc.ftp.client.ftpclientfactoryimpl.getClient (ftpclientfa
ctoryimpl.java:35)
- Заблокирован <0x228f9310> (java.lang.object)
Первый - это блокировка, используемая самой системой, а последний добавляется в моем коде. Это будет решено путем изменения объекта в вашем собственном коде, чтобы заблокировать его.
Суммировать
JStack весьма полезен в решении проблем. Информация кратко и эффективна. На самом деле, существует много инструментов графического анализа, основанных на нем. Тем не менее, JSTACK должен быть поддержан JDK1.6 или выше.
Выше приведено все содержание этой статьи о решении задач тупика процесса с помощью анализа JSTACK. Я надеюсь, что это будет полезно для всех. Заинтересованные друзья могут продолжать ссылаться на другие связанные темы на этом сайте. Если есть какие -либо недостатки, пожалуйста, оставьте сообщение, чтобы указать это. Спасибо, друзья, за вашу поддержку на этом сайте!