2011-08-15 2 views
6

기본적으로 핫 스폿을 사용하면 CTRL-Break 스레드 덤프가 어떤 스레드가 보유하고있는 스레드를 나열하지 않습니다. java.lang.concurrent 잠금. 그리고 이러한 잠금을 사용하면 핫 스폿에서 스택을 획득 한 스택 프레임에 대한 정보를 얻을 수 없다는 것을 알고 있습니다. JVM 옵션 -XX:+PrintConcurrentLocks을 추가하면 CTRL-Break 스택 덤프는 해당 프레임이 보유한 동시 잠금을 (스레드의 스택 추적 이후에) 나열합니다. 예를 들어 :이 핫스팟 JVM 옵션이 기본값이 아닌 이유는 무엇입니까? -XX : + PrintConcurrentLocks

"D-Java-5-Lock" prio=6 tid=0x00000000069a1800 nid=0x196c runnable [0x000000000770f000] 
    java.lang.Thread.State: RUNNABLE 
     at com.Tester.longDelay(Tester.java:41) 
     at com.Tester$D.run(Tester.java:88) 

    Locked ownable synchronizers: 
     - <0x00000007d6030898> (a java.util.concurrent.locks.ReentrantLock$NonfairSync) 

이 옵션을 사용하지 않으면, 스레드가 사후에이 잠금을 보유하고 있는지 알아낼 수 없습니다. 이 옵션이 기본값이 아닌 이유는 무엇입니까? 명백하지 않은 성능 또는 안정성 패널티가 있습니까? 이 문제에 대한 토론을 찾기 위해 검색 할 때 아무 것도 나오지 않습니다.

답변

2

오라클에 (내 고용주가 지원 담당자를두고 있습니다.) 대답은 기본적으로이 옵션을 사용하는 것이 안전하며 많은 순전히 진단 기능이 기본적으로 비활성화되어 있으며 이것이 이러한 옵션 중 하나임을 알았습니다. IMO는 진단 기능이 안전하고 안정적이며 성능 저하를 초래하지 않는다면 기본적으로 켜져 있어야합니다. 이것은 (당시) Sun과 (현재) Oracle에서의 시야가 아닌 것으로 보입니다.

+0

설명 추가. – egorlitvinenko

2

음, 내 생각에 불안정합니다. 또는 JVM 관리자 (Sun-now-Oracle)는 단순히 지원되는 기능으로 유지하기를 원하지 않습니다. -XX: 접두어로 간단하게 알 수 있습니다.

-XX로 지정된 옵션은 일반용으로 사용하지 않는 것이 좋습니다. 이 옵션은 사전 통보없이 변경 될 수 있습니다.

- 당신이 필요로하는 경우가 MXBean를 통해 설정할 수 있도록 해당 페이지에서 또한 Java HotSpot VM Options

에서, 즉 옵션은 동적으로 JDK 관리 인터페이스를 통해 활성화하거나 비활성화 할 수 있습니다. 관리로 표시

플래그는 JDK 관리 인터페이스 (com.sun.management.HotSpotDiagnosticMXBean API)도 JConsole을 통해 통해 동적으로 쓸 수 있습니다. Java SE 6 Platform Application 모니터링 및 관리에서 그림 3은 예제를 보여줍니다. 관리 가능한 플래그는 jinfo -flag를 통해 설정할 수도 있습니다.

마지막으로 jstack 스택 추적 도구는 항상 활성화하지 않고도 동일한 기능을 수행 할 수 있습니다.

0

ReentrantLocks 만 관련 스레드를 알고 있기 때문에 이 메소드의 런타임 구현에 대한 정보를 얻으려면 힙을 사용하여 모든 잠금과 해당 스레드를 찾으십시오.