어떤 상황에서는 메소드의 평균 호출 시간이 문제가 아니라, 가끔씩 메소드가 비정상적으로 동작하는 것이 문제일 수 있습니다. 호출 트리에서는 모든 메서드 호출이 누적되기 때문에, 10,000번 중 한 번 100배 더 오래 걸리는 자주 호출되는 메소드는 전체 시간에서 뚜렷한 흔적을 남기지 않습니다.
이러한 문제를 해결하기 위해 JProfiler는 호출 트리에서 이상치 감지 뷰와 예외적인 메소드 녹화 기능을 제공합니다.
이상치 감지 뷰
이상치 감지 뷰에서는 각 메소드의 호출 지속 시간, 호출 횟수, 그리고 단일 호출에 대해 측정된 최대 시간 정보를 함께 보여줍니다. 최대 호출 시간이 평균 시간에서 얼마나 벗어나는지에 따라 모든 호출 지속 시간이 좁은 범위에 있는지, 아니면 의미 있는 이상치가 존재하는지 알 수 있습니다. 이상치 계수는 다음과 같이 계산됩니다.
(최대 시간 - 평균 시간) / 평균 시간
이 값을 통해 해당 관점에서 메소드를 정량적으로 평가할 수 있습니다. 기본적으로 테이블은 이상치 계수가 가장 높은 메소드가 상단에 오도록 정렬됩니다. 이상치 감지 뷰의 데이터는 CPU 데이터가 녹화된 경우에만 제공됩니다.
소수만 호출되거나 매우 짧게 실행되는 메소드로 인한 과도한 혼잡을 방지하기 위해, 뷰 설정에서 최대 시간과 호출 횟수에 대한 하한값을 지정할 수 있습니다. 기본적으로 최대 시간이 10ms를 초과하고 호출 횟수가 10보다 큰 메소드만 이상치 통계에 표시됩니다.
예외적인 메소드 녹화 설정
예외적으로 긴 호출 시간이 발생하는 메소드를 찾았다면, 컨텍스트 메뉴에서 해당 메소드를 예외적인 메소드로 추가할 수 있습니다. 동일한 컨텍스트 메뉴 동작은 호출 트리 뷰에서도 사용할 수 있습니다.
예외적인 메소드 녹화에 메소드를 등록하면, 가장 느린 몇 번의 호출이 호출 트리에서 별도로 보관됩니다. 나머지 호출은 평소처럼 하나의 메소드 노드로 병합됩니다. 별도로 보관되는 호출 횟수는 프로파일링 설정에서 지정할 수 있으며, 기본값은 5입니다.
느린 메소드 호출을 구분할 때는 시간 측정을 위한 특정 스레드 상태가 사용되어야 합니다. 이는 CPU 뷰의 스레드 상태 선택과는 다르며, CPU 뷰의 스레드 상태 선택은 단순히 표시 옵션일 뿐 녹화 옵션이 아닙니다. 기본적으로 wall clock 시간이 사용되지만, 프로파일링 설정에서 다른 스레드 상태로 변경할 수 있습니다. 이상치 감지 뷰에서도 동일한 스레드 상태가 사용됩니다.
세션 설정에서는 호출 트리나 이상치 감지 뷰의 컨텍스트 없이 예외적인 메소드를 제거하거나 새로 추가할 수 있습니다. 또한, 예외적인 메소드 설정에서는 AWT 및 JavaFX 이벤트 디스패치와 같이 예외적으로 오래 실행되는 이벤트가 주요 문제가 되는 잘 알려진 시스템에 대한 예외적인 메소드 정의를 추가하는 옵션도 제공합니다.
호출 트리에서의 예외적인 메소드
예외적인 메소드 실행은 호출 트리 뷰에서 다르게 표시됩니다.
분할된 메소드 노드는 아이콘이 변경되고 추가적인 텍스트가 표시됩니다:
-
[exceptional run]
[예외적 실행]
이 노드는 예외적으로 느린 메소드 실행을 포함합니다. 정의상 호출 횟수는 1입니다. 이후에 더 느린 메소드 실행이 여러 번 발생하면, 이 노드는 사라지고 설정된 별도 녹화 최대 개수에 따라 "병합된 예외적 실행" 노드로 이동할 수 있습니다. -
[merged exceptional runs]
[병합된 예외적 실행]
예외적으로 느린 것으로 간주되지 않는 메소드 호출은 이 노드로 병합됩니다. 각 호출 스택마다 예외적인 메소드당 하나의 노드만 존재할 수 있습니다. -
[current exceptional run]
[현재 예외적 실행]
호출 트리 뷰가 JProfiler GUI로 전송되는 시점에 호출이 진행 중이었다면, 해당 호출이 예외적으로 느린지 여부를 아직 알 수 없습니다. "현재 예외적 실행"은 현재 호출에 대해 별도로 관리되는 트리를 보여줍니다. 호출이 완료되면, 별도의 "예외적 실행" 노드로 유지되거나 "병합된 예외적 실행" 노드로 병합됩니다.
프로브 및 분할 메소드에 의한 호출 트리 분할과 마찬가지로, 예외적인 메소드 노드에는 컨텍스트 메뉴에서 분할 수준 병합 동작이 제공되어 모든 호출을 실시간으로 병합하거나 분리할 수 있습니다.











