2012-11-13 5 views
7

상황을 분석하기 위해 교착 상태가 발생한 두 개의 스레드 스택을 엿볼 필요가 있습니다. JVM은 현재 실시간으로 제공되지만 데이터가 필요하지만 프로세스에서 추출 할 수있는 도구가 필요합니다. 나는 String 유형의 스택에서 6 개의 변수 만 신경 써요. 어떤 아이디어라도 대단히 감사하겠습니다. JVM 버전 6_35의 경우 linux이고 JMX이 사용 설정되었지만 profiler/debugger 연결이 설정되어 있지 않습니다. 재현하기가 매우 어렵습니다.라이브 JVM에서 현재 스레드 스택 변수를 덤프 할 수 있습니까?

+3

안녕하세요. 유권자입니까? – ShiDoiSi

답변

3

당신은 이것을 쉽게 할 수 없습니다. 일반 jstack 도구는 스택 만 덤프합니다. 기술적으로 당신은 전체 힙 (jmap 사용)을 버리려고 시도 할 수 있지만,이 특정 변수를 찾는 것은 가능한 경우 고통이 될 수 있습니다.

보안상의 이유로 쉽게 수행 할 수 없습니다. 스택 추적에는 자격 증명 또는 기타 중요한 데이터가 포함될 수 있습니다. 확실하지 않은 출력이 힘든 당신의 목적에 적합 할 것입니다 경우 - IBM's JVM 바와 같이

+2

보안상의 이유로 의심 스럽습니다. "쉽게 해결할 수없는"해킹이 우려되는 좋은 방법이 아닙니다. 단지 2 센트. –

0

당신은, 썬/오라클 JVM과 유닉스 계열 OS에서 프로세스 당신에게 dump and keep the VM running을 줄 것이다 SIGQUIT을 보낼 수 있습니다. 아마도 다른 답변에서는 jstack/jmap과 비슷할 것입니다.

+0

이것은 각 스레드의 변수 상태가 아닌 스레드 덤프 (각 스레드에 대해 호출되는 메소드의 순서)를 제공합니다. –

1

힙 덤프 뷰어를 사용하여 약간의 트릭을 발견했습니다 (이 경우 YourKit이지만 다른 것들도 가능). 기본적으로 Thread 클래스의 모든 인스턴스를 열거하고 원하는 스레드를 이름으로 찾아서 엽니 다. 모든 변수가 위치하지

enter image description here

하지만 방법 인수로 전달되는 모든 표시된다 : 스택 변수 < 로컬 변수> 이런로 표시된다. 프로파일 러가이 문제를 더 잘 해결할 수 있을지 궁금합니다.