Java 내에서 Java 모니터링
-
06-07-2019 - |
문제
프로그램의 메소드 호출을 트리의 분기로 표시하여 Java 프로그램의 간단한 시각화를 작성하고 싶습니다. 이것은 프로그램 자체가 수행하는 일을 시각화하도록함으로써 매우 간단하게 수행 될 수 있지만, 수정하려는 방법뿐만 아니라 Java 방법/클래스 로이 작업을 수행 할 수 있기를 원합니다.
내가 필요로하는 것은 프로그램이 호출하는 방법과 해당 방법 내에서 어떤 방법을 호출하는지를 볼 수있는 능력입니다. 분명히 스택 트레이스는이 기능을 정확하게 제공합니다.
java.lang.NullPointerException
at MyClass.mash(MyClass.java:9)
at MyClass.crunch(MyClass.java:6)
at MyClass.main(MyClass.java:3)
그래서 나는 스레드에서 실행을 모니터링하고 싶은 프로그램을 가지고 있다고 생각한 다음 그 스레드의 스택을 봅니다. 그러나 스레드 클래스는 실제로 이것을 지원하지 않습니다. 그것은 단지 지원됩니다 인쇄 현재 스택.
물론, 나는 스레드가 스택을 인쇄 할 수 있도록 시스템 클래스의 인쇄물을 단순히 바꾸는 것을 생각했습니다. 나의 Printstream이지만 이것은 잘못된 느낌입니다.
더 좋은 방법이 있습니까? 내가 사용할 수있는 기존 클래스/방법이 있습니까?
또한 현재 Java 소스 코드를 다운로드하여 스레드 클래스가 스택을 정확하게 인쇄하는 방법을 확인하여 스레드를 서브 클래스 스레드와 내 getStack () 메소드로 덤프 스택 () 메소드를 모방 할 수 있습니다.
해결책 2
오, 촬영, 소스 코드를 살펴보면 스레드 클래스에 공개 stacktraceElement [] getStacktrace () 메소드가 있음을 알았습니다. 이제 나는 바보 같은 느낌이 듭니다.
예, 그게 해결책 인 것 같습니다.
다른 팁
최신 Java 릴리스와 함께 제공되는 VisualVM도보십시오.
한 가지 방법은 같은 것을 사용하는 것입니다 Bcel 대상 바이트 코드를 전처리하려면 모든 메소드 항목에서 자신의 코드에 호출을 삽입하고 종료합니다 (시도/마침내 블록에서 전체 메소드를 래핑하여 예외 종료를 포착하여 종료하는 것이 가장 좋습니다). 이것으로부터, 당신은 콜 트리를 정확하게 추론 할 수 있습니다.
살펴보십시오 ThreadMxBean 클래스 - 그것은 당신이 필요한 것을 제공합니다. 본질적으로, 당신 :
- Call ManagementFactory.getThreadMxBean ()을 보려면 ThreadMxBean 인스턴스를 얻으려면;
- 결과 스레드를 열거하기 위해 결과 ThreadMxBean에서 getAllthreadIds ()를 호출합니다.
- 주어진 스레드 목록에서 상단 N 스택 추적 요소를 얻으려면 getThreadInfo ()를 호출하십시오.