2013-01-02 2 views
18

스레드 덤프를 가져 오는 방법 간의 차이점을 분석하고 있습니다. 다음은 그 중 몇은 내가 선언 콩 작업을 클릭에() Runtime.exec의를 통해 jstack을 트리거하는 JMX 빈을 정의프로덕션에서 스레드 덤프 사용

  1. 에 연구하고있다.

  2. 사전 정의 된 간격 후에 "ManagementFactory.getThreadMXBean(). dumpAllThreads (true, true)"를 반복적으로 실행하는 데몬 스레드입니다.

둘 사이의 스레드 덤프 출력을 비교하면, I는

  • TDA 같은 오픈 소스 스레드 덤프 분석기로 분석 할 수없는 접근 방식 2 기록 2

    1. 스레드 덤프와 아래 단점 참조 출력에는 높은 CPU 문제를 분석하는 데 유용한 기본 스레드 ID가 포함되어 있지 않습니다 (맞습니까?)
    2. 더 이상 없습니까?
    내가 생산 코드에서 Runtime.exec의()를 통해 jstack을 실행 불이익이 있습니까

    1. 에 대한 제안/입력을 얻기 위해 감사하겠습니다

      ? 다양한 운영 체제 (Windows, Linux)상의 호환성 문제?

    2. 스레드 덤프를 취하는 다른 방법은 없습니까?

    감사합니다.

    편집 -

    1과 2의 결합 방법은 갈 수있는 방법이 될 것으로 보인다. 백그라운드에서 실행되는 전용 스레드를 가지고 스레드 덤프를 스레드 덤프 분석기에서 이해할 수있는 형식으로 로그 파일에 인쇄 할 수 있습니다. jstack 출력에 의해서만 기록되는 추가 정보가 필요할 경우 (예 : 원시 스레드 ID와 같음) 필요한 경우 수동으로 수행합니다.

  • +0

    JEE 애플리케이션과 관련이 있습니까? –

    +0

    @WaleedMadanat 예 –

    답변

    29

    당신은 프로세스가 실행 상자에 사용자로 실행

    jstack {pid} > stack-trace.log 
    

    를 사용할 수 있습니다.

    여러 번 실행하면 diff을 사용하여 어떤 스레드가 더 쉽게 작동하는지 확인할 수 있습니다.


    스택 추적을 분석하기 위해 다음을 주기적으로 전용 스레드에서 샘플링합니다.

    Map<Thread, StackTraceElement[]> allStackTraces = Thread.getAllStackTraces(); 
    

    이 정보를 사용하여 스레드의 ID, 실행 상태 및 스택 추적을 비교할 수 있습니다.

    +0

    jstack을 실행하는 첫 번째 요령은 앞서 언급 한 접근법 1과 동일합니까? jmx를 통해 통합 및 트리거하면 사용자가 프로세스 ID에 대해 걱정할 필요가 없습니다. 또한 jmx 방식을 사용하면 jstack이 지정된 간격마다 반복적으로 실행되도록 예약 할 수 있습니다. Thread.getAllStackTraces() 호출에 관한 두 번째 사항에 관해서. 이것은 스레드 덤프 분석기가 해석하는 방식으로 스레드 덤프를 수동으로 기록해야 함을 의미합니다. 처음 접근하는 것보다이 접근법의 이점은 무엇입니까? –

    +0

    나는 프로그램에 분석기가 있고 관심있는 정보 만 기록합니다.내 경우에는 일반적으로 시간대에 다른 로그가 어떤 것인지보고 싶다는 의미의 문제가있을 때만 발생합니다. 몇시에 무슨 일이 일어 났는가, 마지막으로 쓰레드가 기록되고 나중에 생성 된 오류가 무엇인가. –

    3

    만약 내가 * nix 내가 kill -3 <PID>을 시도했지만 그때 당신은 프로세스 ID를 알아야하고 콘솔에 대한 액세스 권한이 필요합니까?

    +0

    예. 콘솔에 접근하고 프로세스 ID를 얻는 것은 "강제 종료"접근법의 문제점입니다. 위에서 언급 한 접근 방식에는 이러한 단점이 없습니다. –

    0

    그런 env가있는 경우 준비 환경에서 모든 힙 분석을 수행 한 다음 필요한 경우 Application Server 튜닝을 프로덕션 환경에 반영하십시오. 응용 프로그램의 메모리 사용률을 분석하기 위해 덤프가 필요한 경우 더 나은 분석을 위해 프로파일 링을 고려해야합니다.

    일반적으로 힙 덤프는 메모리 누수와 잘못된 메모리 관리로 인한 OutOfMemoryExceptions의 결과로 생성됩니다.

    Application Server의 설명서를 확인하십시오. 대부분의 최신 서버에는 앞서 언급 한 일반적인 원인 외에도 런타임시 덤프를 생성하는 수단이 있습니다. 결과 덤프는 공급 업체마다 다를 수 있습니다.

    +0

    스레드 덤프가 발생하는 오버 헤드를 이해하지만이 기능이 필요한 프로덕션 환경에서 발생하는 상황을 명확하게 이해할 수 있습니다. glassfish 응용 프로그램 서버를 사용하고 glassfish에서 스레드 덤프를 얻는 것은 특별한 것이 아닙니다. @Peter Lljenbery에 대한 내 대답에서 언급 한 두 가지 단점이있는 jvm에 kill 신호를 보내야합니다. –

    +0

    알았어. 그런 다음 메모리 덤프가 활성화 된 (아마도 구성을 통해) 특수 빌드를 사용하고 평가할 항목을 측정 한 다음 사용을 중지하면 사용하지 않는 것이 좋습니다. 이 방법을 사용하면 jstack 사용이나 다른 접근법에 대해 걱정할 필요가 없습니다. 사실 jstack은이 시나리오에서 괜찮을 것입니다. 이 [link] (http://docs.oracle.com/javase/6/docs/technotes/tools/share/jstack.html)도 확인하십시오. 약간 도움이 될 수 있습니다 (설명 섹션으로 스크롤). . –

    +0

    위의 설명에서 접근 방법 2를 추천하고 있습니까? 위에서 언급 한 단점에 대한 귀하의 생각은 무엇입니까? 또한 프로덕션 환경에서 runtime.exec()를 실행할 때 문제가 있다고 생각합니까? –

    5

    Java 8 in picture를 사용하면 jcmd를 사용하는 것이 좋습니다. 다음

    jcmd <PID> Thread.print 
    

    Oracle documentation에서 미리보기입니다 :

    자바 미션 컨트롤, 자바 플라이트 레코더, 그리고 JVM과 자바 응용 프로그램 문제를 진단하는 jcmd 유틸리티를 도입 JDK 8의 출시. 향상된 진단 및 성능 오버 헤드를 줄이려면 이전 jstack 유틸리티 대신 최신 유틸리티 인 jcmd를 사용하는 것이 좋습니다.

    그러나이 응용 프로그램과 함께 배송하는 것은 내가 모르는 라이센스 관련 내용 일 수 있습니다.

    +0

    알아두면 좋을 것 같습니다. TDA와 같은 오픈 소스 스레드 덤프 분석기로 파싱 할 수 있습니까? 그들은 네이티브 스레드 ID를 포함합니까? –