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