Saya baru saja menggunakan JStack untuk menyelesaikan masalah kebuntuan proses - pada kenyataannya, saya telah menyelesaikannya sejak lama, dan saya tahu alasannya, tetapi saya belum menemukan lokasi kebuntuan, jadi saya tidak terlalu mau melakukannya.
Prosesnya kira -kira sebagai berikut:
(0) Persyaratan Lingkungan, JDK 1.6 dan di atas
(1) Pertama temukan PID proses. Di Windows, buka Process Manager dan urutkan berdasarkan nama. Anda dapat menemukan proses yang disebut javaw.exe (proses mesin virtual java semuanya disebut javaw.exe). Anda perlu menemukan proses mana yang merupakan proses Anda, ingat daftar proses saat ini, dan kemudian restart proses Anda. Yang telah disegarkan oleh PID adalah proses Anda.
(2) Jalankan di bawah CMD: JStack PID, JStack akan mengetik serangkaian informasi di konsol
(3) Menganalisis informasi di atas
Contoh:
Informasi JStack untuk pertanyaan saya adalah sebagai berikut:
C:/Dokumen dan Pengaturan/Pengguna> JStack 66522012-06-07 21: 32: 02full Thread Dump Java Hotspot (TM) Klien VM (16.3-B01 Mode Campuran, Berbagi): "Thread-1" Daemon Prio = 6 tid = 0x030c00 nid = 0xcdc untuk Monors0 piala = 0x030c00 NID = 0xcdc) untuk monitor = 0x010c00 nid = 0xcdc) Monor 0x0c. java.lang.thread.state: diblokir (pada monitor objek) di org.apache.commons.net.telnet.telnetInputStream .__ baca (TelnetInputStream.java:122) - Menunggu untuk mengunci <0x2294280> (a org.apache.commons.commons.net.fon.ntp.ftp.fon.commons.commons.net.fons.net.coMon.net.fons.net.client.comcmons org.apache.commons.net.telnet.telnetInputStream.run (telnetinputstream.java:535) di java.lang.thread.run (thread.java:619) "framework event dispatcher" Daemon prio = 6 tid = 0x030400 [0x0334f000] java.lang.thread.state: menunggu (pada monitor objek) di java.lang.object.wait (metode asli) - menunggu <0x228fa800> (a org.eclipse.osgi.framework.eventmgr.eventmanager $ evengread) di jave.clip.evlap.event.eventManager $ eventhread) di jave.clip.evject.eVeM.event.eventManager $ eventhread) di jave.clip.aMRaT.EndArt.Event.eventManReReRD) at eventhread) di JAVEM.EVEAD.EVENTHREAD) AT eventhreRD) di JAVED.EVED.EVENTRADREAD) DI JAVET.EVEAD.EVEAD. org.eclipse.osgi.framework.eventmgr.eventManager $ eventThread.getNextEvent (eventManager.java:400) - terkunci <0x228fa800> (org.eclipse.osgi.framework.eventmgr.eventmanager $ eventhread) at eventhread) at eventhread $ eventhread) at eventhread $ eventhread) at $ eventhread $ org.eclipse.osgi.framework.eventmgr.eventManager $ eventThread.run (eventManager.java:336) "Dispatcher Acara Mulai" Daemon Prio = 6 TID = 0x02FCF400 NID = 0x2638 Di Object.Wait () [0x032 NID. java.lang.object.wait (metode asli) - Menunggu di <0x2295db48> (a [i) di java.lang.object.wait (object.java:485) di org.apache.commons.net.telnet.telnetinputeM.Read (telnevons.netstream.telnet.telnetinput.Read (telne -read (telnevons <0x2295db48> (a [i) di org.apache.commons.net.telnet.telnetInputStream.read (telnetinputStream.java:466) di java.io.bufferedInputStream.read1 (bufferedinputstream.java:256) (BufferedStream.java:java:256) (BufferedStream.java:java:java:java:java:java:java:java:java:java:java:java:java:java:java:java:java: java.io.bufferedInputStream.read (bufferedInputStream.java:317) - terkunci <0x2295fe18> (a java.io.bufferedInputStream) di sun.nio.cs.streamdecoder.readbytes (streamdecoder.java:cs.streamdecoder.readbytes (streamdecoder.java:cs.streamdecoder sun.nio.cs.streamdecoder.implread (streamDecoder.java:306) di sun.nio.cs.streamDecoder.read (streamDecoder.java:158) - terkunci <0x22961f88> (A java.io.inputstreamreer) ATECREADER) (a java.io.inputstreamreer) ATXREADER) (a java.io.inputStreamreer) ATX2READER) (a java.io.putstreamreer)) java.io.inputStreamreader.read (inputStreamreader.java:167) di java.io.bufferedreader.fill (bufferedreader.java:136) di java.io.bufferedreader.readline (bufferedreader.java.2) -bufferedReader.Readline (bufferedreader.java:2999999999999999999999999999999999999999999999999999999999999999999999999999999999 java.io.inputStreamReader) di java.io.bufferedreader.readline (bufferedreader.java:362) di org.apache.commons.net.ftp.ftp .__ getReply (ftp.java:264) di org.apache.commons.net.ftp.ftp._connectAction_ (ftp.java:335) di org.apache.commons.net.ftp.ftpclient._connectaction_ (ftpclient.java:550) di org.apache.commons.net.net.net. com.mycompany.dc.ftp.client.ftpCliamImpl.connect (ftpCliamImpl.java:75) - terkunci <0x22942280> (A org.apache.commons.net.ftp.ftpclient) di com.mycompany.dc.ftp.client.ftpClientFactoryImpl.getClient (ftpClientFactoryImpl.java:35) - terkunci <0x228f9310> (Activa.jAv.object) di ftpclientest.activator.start.start (Activa.Jav: Activor.Jav: Activor.JAV: ACTOVERT.JAV: ACTOVERTOR.JAV: ACTOVOR.JAV: ACTORVORATOR.SART.JAV (ACTIVA (ACTIVA (ACTIVA (ACTIVA (ACTIVA (ACTIVA (ACTIVA (ACTIVA (ACTIVA: ACTIVOR.JAV: ACTIVATOR.AVOR.JAV (ACTIVA. org.eclipse.osgi.framework.internal.core.bundleContextImpl $ 1.run (bundleContextImppl.java:711) di java.security.accesscontroller.dopriviled (metode asli) di org.eclipse.osgi.framework.internal.core.bundleContextImpl.Startactivator (BundleContextImpl.java:702) di org.eclipse.osgi.framework.internal.core.bundlecontextImpl.start.Sartart (bundecleclecontextext (bundeclecontexl.start (bundeclecontextext (bundeclecontexl.start. org.eclipse.osgi.framework.internal.core.bundlehost.startworker (bundehost.java:381) di org.eclipse.osgi.framework.internal.core.abstractbundle.resume (abstrakbundle.java:389) at org.eclipse.osgi.framework.internal.core.framework.resumebundle (framework.java:1131) di org.eclipse.osgi.framework.internal.core.startlevelManager.resumebundles (startlevleManager.java:599999999999999999) org.eclipse.osgi.framework. org.eclipse.osgi.framework. org.eclipse.osgi.framework.internal.core.startlevelManager.dispatchevent (startLevelManager.java:438) di org.eclipse.osgi.framework.internal.core.startlevanager.dispatcatcatcetrEvent (startLevelManager.internal.core.startlevanager.dispatcatclevent (startLevelManager.javan. org.eclipse.osgi.framework.eventmgr.eventManager.dispatchevent (eventManager.java:230) di org.eclipse.osgi.framework.eventmgr.eventManager $ eventThread.run (eventManager.java:340) "freamer" piRio = 02.102work "frio = 02.raPx = 02.34.340)" FRAMAD "PRAMBAD = 02.RADION = 02.102ADIFOR (EventManager. nid = 0x1fbc di objek.wait () [0x0328f000] java.lang.thread.state: timed_waiting (pada monitor objek) di java.lang.object.wait (metode asli) - menunggu <0x27e6570> (a org.eclipse.osgi. org.eclipse.osgi.framework.internal.core.framework.run (framework.java:1817) - terkunci <0x27e65770> (a org.eclipse.osole.preadram. prio = 6 tid = 0x03005400 nid = 0x225c menunggu pada kondisi [0x0323f000] java.lang.thread.state: timed_waiting (tidur) di java.lang.thread.sleep (metode asli) di org.eclipse.osgi.framework.internal.core.frameworkconsole.runconsole (frameworkconsole.java:125) di org.eclipse.osgi.framework.internal.core.frameworkconsole.run (frameworkconsole.internal.core.frameworkconsole.run (frameworkconsole.java:core.core) java.lang.thread.run (thread.java:619) "detektor memori rendah" daemon prio = 6 tid = 0x02c09800 nid = 0x1d68 runnable [0x0000000] java.lang.thread. Kondisi [0x000000000] java.lang.thread.State: runnable "lampirkan pendengar" Daemon prio = 10 tid = 0x02c01800 nid = 0x1138 Menunggu kondisi [0x0000000] Java.Lang. [0x000000000] java.lang.thread.state: runnable "finak finalzer" prio = 8 tid = 0x02bc0400 nid = 0x11ac di objek.wait () [0x02d8f000] java.lang.thread.state: tunggu (pada monitor objek) di java.lang.lang.lang.lang.tate: Waiting (on On Object Monitor) di java.Lang.Lang.Lang.Lang.LANG.LANG.LANG.LANG.LANG.LANG.LANG.LANG.LANG.LANG.LANG. <0x27d5e5c8> (a java.lang.ref.referencequeue $ lock) di java.lang.ref.referenceue.remove (Referencequeue.java:118) - terkunci <0x27d5e5c8> (A java.lang.referequeeeeeee $) (a java.lang.referequeeeeele $) (a java.lang.referequeeeeele $) (a java.lang.referequeeeeele $) $) (a java.lang.referequeeeele $) $) (a java.lang.referequeeeeeDe $) $) (a java.lang.referequeeeeeDe $) $) (a java.lang.reference $eUeeeDe5) java.lang.ref.referencequeue.remove (ReferenceQueue.java:134) di java.lang.ref.finalizer $ finalzerThread.run (finalzer.java:159) "Reference Handler" Daemon Prio = 10 tid = 0x02bb800 nid = 0x9cc in daemon = 10 tid = 0x02bb800 nid = 0x9c. java.lang.thread.state: menunggu (pada monitor objek) di java.lang.object.wait (metode asli) - menunggu di <0x27d5e650> (a java.lang.ref.reference $ lock) di java.lang.wait (objek.java:485) di java.lang.ref.reference $ ReferenceHandler.run (Reference.java:116) - Terkunci <0x27d5e650> (A java.lang.ref.reference $ lock) "Main" prio = 6 TID = 0x008A6C00 NID = 0x22ec di objek.wait. TIMED_WAITING (on object monitor) at java.lang.Object.wait(Native Method) - waiting on <0x22c303c8> (a org.eclipse.core.runtime.internal.adaptor.Semaphore) at org.eclipse.core.runtime.internal.adaptor.Semaphore.acquire(Semaphore.java:55) - terkunci <0x22c303c8> (a org.eclipse.core.runtime.internal.adaptor.semaphore) di org.eclipse.core.runtime.adaptor.eclipsarter.updatesplash (eclipsestarter.java:1251) di org.eclipse.core.runtime.adaptor.eclipsestarter.setStartLevel (eclipsestarter.java:1213) di org.eclipse.core.runtime.adaptor.eclipsestarter.startup (eclipsestarter.java:288) at org.eclipse.core.runtime.adaptor.eclipsestarter.run (eclipsestarter.java:175) di sun.reflect.nativeMethodaccessorImpl.invoke0 (Metode asli) di sun.reflect.nativemethodaccessorcessorcessorcessorcessorcessor: nativaCessorcessorcessorcessorcessorcessorcessorcessorcessorcessorcessorcessorcessor (nativeAclect. sun.reflect.delegatingmethodaccessorImpl.invoke (delegatingmethodaccessorimpl.java:25) di java.lang.reflect.method.invoke (Method.java:597) di org.eclipse.equinox.launcher.main.main org.eclipse.equinox.launcher.main.basicrun (Main.java:577) di org.eclipse.equinox.launcher.main.run (Main.java:1410) di org.eclipse.equinox.launcher.main.main.main.main (mayg.eclipse.equinox.launcher.main.main.main.main (Maing.eclipse.equinox.launcher.main.main. tid = 0x02bba000 nid = 0xdb4 runnable "vm utas tugas periodik" prio = 10 tid = 0x02c0e400 nid = 0x24ac Menunggu di ConditionJni Referensi Global: 677
menganalisa:
Menurut prompt, kedua utas menggunakan objek FTPClient sebagai kunci, dan yang sebelumnya mendapatkan kunci harus menunggu yang berikutnya membutuhkan hasil pengembalian kunci, menyebabkan kebuntuan. Kedua tempat ini adalah:
(1) di org.apache.commons.net.telnet.telnetInputStream .__ baca (telnetinputstr
Eam.java:122)
(2) - Terkunci <0x22942280> (A org.apache.commons.net.ftp.ftpClient)
di com.sagemcom.dc.ftp.client.ftpClientFactoryImpl.getClient (ftpClientfa
ctoryImpl.java:35)
- terkunci <0x228f9310> (java.lang.object)
Yang pertama adalah kunci yang digunakan oleh sistem itu sendiri, dan yang terakhir ditambahkan dalam kode saya. Ini akan diselesaikan dengan mengubah objek dalam kode Anda sendiri untuk menguncinya.
Meringkaskan
JStack cukup membantu dalam memecahkan masalah. Informasinya ringkas dan efektif. Bahkan, ada banyak alat analisis grafis berdasarkan padanya. Namun, JStack perlu didukung oleh JDK1.6 atau lebih.
Di atas adalah seluruh konten artikel ini tentang pemecahan masalah kebuntuan proses melalui analisis JStack. Saya harap ini akan membantu semua orang. Teman yang tertarik dapat terus merujuk ke topik terkait lainnya di situs ini. Jika ada kekurangan, silakan tinggalkan pesan untuk menunjukkannya. Terima kasih teman atas dukungan Anda untuk situs ini!