2014-09-26 2 views
4

거의 CPU 사용량이 거의없는 Linux 상자가 있습니다. 문제가되는 Java 프로세스 (12462)와 기본 스레드 (12465 및 12466)를 추적하려면 top을 사용했습니다. jstack을 실행하고 출력에서 ​​30b1과 30b2 (앞서 언급 한 스레드가 16 진수로 변환 됨)를 검색하여 Java가 수행하는 작업을 파악할 수 있기를 바랍니다. 내가 출력 TID 또는 NID 정보를 포함하지 않은 jstack -F을 실행할 때, 그러나jstack의 출력에서 ​​tid 및 nid 정보가 누락되었습니다.

12462: Unable to open socket file: target process not responding or HotSpot VM not loaded 
The -F option can be used when the target process is not responding 

:

내가 어떤 플래그없이 jstack를 실행

, 그것은 다음과 같은 오류를 반환했습니다. 내가 jstack -F -l를 실행하지만, 명령이 잠기 듯

Thread 31374: (state = IN_NATIVE) 
- java.net.SocketInputStream.socketRead0(java.io.FileDescriptor, byte[], int, int, int) @bci=0 (Compiled frame; information may be imprecise) 
- java.net.SocketInputStream.read(byte[], int, int, int) @bci=79, line=150 (Compiled frame) 
- java.net.SocketInputStream.read(byte[], int, int) @bci=11, line=121 (Compiled frame) 
- org.apache.coyote.http11.InternalInputBuffer.fill(boolean) @bci=59, line=516 (Compiled frame) 
- org.apache.coyote.http11.InternalInputBuffer.fill() @bci=2, line=501 (Compiled frame) 
- org.apache.coyote.http11.Http11Processor.setRequestLineReadTimeout() @bci=90, line=173 (Compiled frame) 
- org.apache.coyote.http11.AbstractHttp11Processor.process(org.apache.tomcat.util.net.SocketWrapper) @bci=156, line=925 (Compiled frame) 
- org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(org.apache.tomcat.util.net.SocketWrapper, org.apache.tomcat.util.net.SocketStatus) @bci=149, line=585 (Compiled frame) 
- org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run() @bci=130, line=312 (Compiled frame) 
- java.util.concurrent.ThreadPoolExecutor.runWorker(java.util.concurrent.ThreadPoolExecutor$Worker) @bci=95, line=1145 (Compiled frame) 
- java.util.concurrent.ThreadPoolExecutor$Worker.run() @bci=5, line=615 (Interpreted frame) 
- java.lang.Thread.run() @bci=11, line=722 (Interpreted frame) 

다음은 출력에서 ​​발췌입니다.

jstack -F -m을 실행했을 때 십진수 스레드를 찾을 수 있었지만 출력에 실제로 수행 할 작업을 파악하기위한 실제 Java 스택이 충분하지 않았습니다. 출력의 다른 부분은 다음과 같습니다.

----------------- 12465 ----------------- 
0x0000003e54889dd0  _wordcopy_fwd_aligned + 0x140 

무엇이 누락 되었습니까? 나에게 tid와 nid를 보여주기 위해 jstack을 어떻게 얻을 수 있습니까?

+0

'-F' 옵션을 사용해야하는 이유가 있습니까? – Holger

+0

'-F' 옵션을 사용하지 않고'jstack'을 반환 할 수 없습니다. 게시물을 조금 더 많은 정보로 업데이트했습니다. – jstricker

+1

나는 (적어도 현재 구현에서는)'-F' 옵션의 한계점에 대해 두려워합니다. Windows와 같은 완전히 다른 아키텍처에서도'-F -l'을 사용할 때 매달린 것을 포함하여 동작을 재현 할 수 있습니다. – Holger

답변

3

-F를 사용하면 tid와 nid를 얻을 수 없습니다.
나는 당신이 당신에게 속하지 않는 어떤 pid를 jstacking한다고 믿습니다. jstack을 실행하기 전에 pid를 소유 한 사용자로 전환하십시오. 다음 명령을 시도하십시오

sudo -u {user who own the process} jstack -l pid 
관련 문제