Thread Dump - Growth-of-server-developer/Java GitHub Wiki
λκΈ°
- μ¬λ΄μμ μ¬μ©νλ Confluence μ ν리μΌμ΄μ μ κ°μμ€λ° λ€μ΄
- μ¬λ΄ μμ μ 보 μμ€ν μ±λ₯ μ ν μ΄μ
μ€λ λ λ€νλ₯Ό ν λ²λ§ νλνλ©΄ λ μ€ μμλλ° μ€λ λ μν λ³νλ₯Ό νμΈνκΈ° μν΄ 5μ΄ μ λμ κ°κ²©μΌλ‘ μ¬λ¬ λ²(5~10ν) νλνλ κ²μ΄ μ’λ€κ³ νλ€. νμλ μ€λ λ λ€ν ν λ² νλ ν, μ ν리μΌμ΄μ μ¬κΈ°λμ νλ€...λͺ μ¬νλλ‘ νμ.
νμλ jstackμ μ΄μ©νμ¬ μ€λ λ λ€νλ₯Ό νλνλλ° λ¦¬λλκ»μ killλ κ°λ₯νλ€κ³ λ§μνμ ¨λ€. κ·Έλμ ν΄λΉ λ°©λ²μ μ 리νμλ€.
- jstack μ¬μ© λ¨Όμ OS λ΄μμ μ€ν μ€μΈ Java μ ν리μΌμ΄μ νλ‘μΈμ€λ₯Ό νμΈνλ€.
jps -v
νμλ Confluence νλ‘μΈμ€λ§ νμΈνλ©΄ λκΈ°μ λ€μκ³Ό κ°μ΄ μ λ ₯νμλ€.
jps -v | grep confluence
μ΄λ₯Ό ν΅ν΄ νλ‘μΈμ€ IDλ₯Ό νμΈνκ³ jstack μΈμλ‘ PID(νλ‘μΈμ€ ID)λ₯Ό λ£μ΄ μ€λ λ λ€νλ₯Ό νλνλ€. PIDκ° 10975λΌλ©΄ μλμ κ°μ΄ μ λ ₯νλ€.
jstack 10975
μ¬κΈ°μ μ£Όμν μ μ "thread dumpκ° μ΄λμ μμ±λλκ°?" μ΄λ€. μ λͺ λ Ήμ΄λ§ μ λ ₯νμ κ²½μ° STDOUT(νμ€ μΆλ ₯)μΌλ‘ μΆλ ₯λλ€. κ·Έλ κΈ°μ λͺ λ Ήμ΄λ§ μ λ ₯νλ€κ³ νμ¬ κ²½λ‘μ λ‘νλ μ€λ λ λ€νκ° μμ±λλ건 μλλ€. νμμ κ²½μ° WAS(Web Application Server)μ΄κΈ°μ λ‘κ·Έ νμΌ(catlina.out)μ λ¨κ² λλ€.
λ°λΌμ μ΄λ₯Ό λ‘κ·Έ νμΌλ‘ κ΄λ¦¬νκ³ μ ν λλ λ€μκ³Ό κ°μ΄ μ λ ₯νλ€.
jstack 10975 > thread_dump_20200730.log
- kill μ¬μ© μ λ°©λ² κ·Έλλ‘ PIDλ₯Ό νμΈνλ€. (μ¬κΈ°μ jps λ§κ³ ps λͺ λ Ήμ΄λ₯Ό μ¬μ©νμλ€. ps λͺ λ Ήμ΄κ° μ΅μ μ λͺ¨λ 보μ¬μ£Όλ κ² κ°λ€.)
ps -ef | grep confluence
PIDκ° 10975λΌλ©΄ μλμ κ°μ΄ μ λ ₯νλ€.
kill -3 10975
μ¬κΈ°μ μ΅μ -3μμ 3μ SIGQUITμ΄λ SIGOUTμΌλ‘ "kill -l"μ ν΅ν΄ νμΈν μ μλ€. λ¬Όλ‘ μ΄ λͺ λ Ήμ΄λ STDOUTμΌλ‘ μΆλ ₯λμ΄ (νμμ κ²½μ°) λ‘κ·Έ νμΌμ λ¨κ²λλ€.
μ΄λ κ² νλν μ€λ λ λ€νλ₯Ό 보κ²λλ©΄...νΉν μ²μ λ³΄κ² λλ€λ©΄ κ²λ¨Ήμ§ λ§μ. λ°μ΄ν°λ₯Ό μ½λ λ°©λ²λ§ μλ©΄ μ΄λ ΅μ§ μλ€.
2020-07-23 12:54:00
Full thread dump OpenJDK 64-Bit Server VM (25.181-b13 mixed mode):
"Attach Listener" #10081 daemon prio=9 os_prio=0 tid=0x00007fff842a4800 nid=0x163ad waiting on condition [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
Locked ownable synchronizers:
- None
"Structure-Jobs6087270f Queue-Thread#1170" #10080 daemon prio=5 os_prio=0 tid=0x00007fff28153000 nid=0x162e0 waiting on condition [0x00007ffe7c0d1000]
java.lang.Thread.State: TIMED_WAITING (parking)
at sun.misc.Unsafe.park(Native Method)
- parking to wait for <0x00000006d362b858> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:215)
at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.java:2078)
at java.util.concurrent.LinkedBlockingQueue.poll(LinkedBlockingQueue.java:467)
at com.almworks.structure.commons.job.PooledStructureJobManager$JobThread.run(PooledStructureJobManager.java:502)
Locked ownable synchronizers:
- None
"mondrian.rolap.agg.SegmentCacheManager$sqlExecutor_14" #9642 daemon prio=5 os_prio=0 tid=0x00007fff0c3a8800 nid=0x9d1a waiting on condition [0x00007ffe7b8cb000]
java.lang.Thread.State: WAITING (parking)
at sun.misc.Unsafe.park(Native Method)
- parking to wait for <0x00000006fa7fe0e8> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039)
at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442)
at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1074)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1134)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
Locked ownable synchronizers:
- None
"pool-84-thread-1" #1869 prio=5 os_prio=0 tid=0x00007ffed067e800 nid=0x313ea runnable [0x00007ffe8accc000]
java.lang.Thread.State: RUNNABLE
at sun.nio.ch.EPollArrayWrapper.epollWait(Native Method)
at sun.nio.ch.EPollArrayWrapper.poll(EPollArrayWrapper.java:269)
at sun.nio.ch.EPollSelectorImpl.doSelect(EPollSelectorImpl.java:93)
at sun.nio.ch.SelectorImpl.lockAndDoSelect(SelectorImpl.java:86)
- locked <0x0000000707e84b10> (a sun.nio.ch.Util$3)
- locked <0x0000000707e84b00> (a java.util.Collections$UnmodifiableSet)
- locked <0x0000000707e84918> (a sun.nio.ch.EPollSelectorImpl)
at sun.nio.ch.SelectorImpl.select(SelectorImpl.java:97)
at org.apache.http.impl.nio.reactor.AbstractMultiworkerIOReactor.execute(Unknown Source)
at org.apache.http.impl.nio.conn.PoolingNHttpClientConnectionManager.execute(Unknown Source)
at org.apache.http.impl.nio.client.CloseableHttpAsyncClientBase$1.run(Unknown Source)
at java.lang.Thread.run(Thread.java:748)
Locked ownable synchronizers:
- None
"Thread-805" #1868 daemon prio=5 os_prio=0 tid=0x00007ffed065c800 nid=0x313e9 in Object.wait() [0x00007ffe96e3b000]
java.lang.Thread.State: TIMED_WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
at com.c.a.a.d.e.run(Unknown Source)
- locked <0x0000000707e82620> (a com.c.a.a.d.e)
Locked ownable synchronizers:
- None
"JRubyWorker-8" #1519 daemon prio=5 os_prio=0 tid=0x00007fff5004a000 nid=0x16c3 waiting on condition [0x00007ffe8ccce000]
java.lang.Thread.State: WAITING (parking)
at sun.misc.Unsafe.park(Native Method)
- parking to wait for <0x00000006edf6eb10> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039)
at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:1081)
at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:809)
at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1074)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1134)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
Locked ownable synchronizers:
- None
- μ½λ λ²
- μ€λ λ μν
- λ½